Skip to content

Commit 9db46a7

Browse files
piierthoCedNaru
authored andcommitted
feat: rework script api implementation for gdextension
1 parent fad4f58 commit 9db46a7

32 files changed

+1276
-802
lines changed

src/api/language/gdj_language.cpp

Lines changed: 45 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
#include "api/script/language/gdj_script.h"
55
#include "godot_jvm.h"
66
#include "jvm/wrapper/memory/memory_manager.h"
7-
#include "lifecycle/paths.h"
87
#include "names.h"
8+
#include "paths.h"
99

1010
using namespace godot;
1111

@@ -28,114 +28,108 @@ GdjLanguage* GdjLanguage::get_instance() {
2828
return instance;
2929
}
3030

31-
void GdjLanguage::init() {
31+
void GdjLanguage::_init() {
3232
GodotJvm::get_instance().initialize_up_to(GodotJvm::State::JVM_SCRIPTS_INITIALIZED);
3333

3434
#ifdef DEBUG_ENABLED
3535
GodotJvm::get_instance().validate_state();
3636
#endif
3737
}
3838

39-
void GdjLanguage::frame() {
39+
void GdjLanguage::_frame() {
4040
if (unlikely(GodotJvm::get_instance().state < GodotJvm::State::CORE_LIBRARY_INITIALIZED)) { return; }
4141
if (unlikely(GodotJvm::get_instance().user_configuration.disable_gc)) { return; }
4242

4343
jni::Env env {jni::Jvm::current_env()};
4444
MemoryManager::get_instance().sync_memory(env);
4545
}
4646

47-
void GdjLanguage::finish() {
47+
void GdjLanguage::_finish() {
4848
GodotJvm::get_instance().finalize_down_to(GodotJvm::State::NOT_STARTED);
4949
}
5050

51-
void GdjLanguage::thread_enter() {
51+
void GdjLanguage::_thread_enter() {
5252
jni::Jvm::attach();
5353
}
5454

55-
void GdjLanguage::thread_exit() {
55+
void GdjLanguage::_thread_exit() {
5656
jni::Jvm::detach();
5757
}
5858

59-
String GdjLanguage::get_name() const {
59+
String GdjLanguage::_get_name() const {
6060
return GODOT_JVM_LANGUAGE_NAME;
6161
}
6262

63-
String GdjLanguage::get_type() const {
63+
String GdjLanguage::_get_type() const {
6464
return GODOT_JVM_SCRIPT_NAME;
6565
}
6666

67-
String GdjLanguage::get_extension() const {
67+
String GdjLanguage::_get_extension() const {
6868
return GODOT_JVM_REGISTRATION_FILE_EXTENSION;
6969
}
7070

71-
void GdjLanguage::get_recognized_extensions(List<String>* p_extensions) const {
72-
p_extensions->push_back(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
71+
PackedStringArray GdjLanguage::_get_recognized_extensions() const {
72+
PackedStringArray ret;
73+
ret.append(GODOT_JVM_REGISTRATION_FILE_EXTENSION);
74+
return ret;
7375
}
7476

75-
bool GdjLanguage::handles_global_class_type(const String& p_type) const {
77+
bool GdjLanguage::_handles_global_class_type(const String& p_type) const {
7678
return p_type == GODOT_JVM_SCRIPT_NAME;
7779
}
7880

79-
bool GdjLanguage::has_named_classes() const {
81+
bool GdjLanguage::_has_named_classes() const {
8082
return true;
8183
}
8284

83-
bool GdjLanguage::supports_builtin_mode() const {
84-
return false;
85-
}
86-
87-
Script* GdjLanguage::create_script() const {
85+
Object* GdjLanguage::_create_script() const {
8886
return memnew(GdjScript);
8987
}
9088

91-
String GdjLanguage::get_global_class_name(const String& p_path, String* r_base_type, String* r_icon_path, bool *r_is_abstract, bool *r_is_tool) const {
92-
if (p_path.begins_with(ENTRY_DIRECTORY) || !p_path.ends_with(GODOT_JVM_REGISTRATION_FILE_EXTENSION)) { return {}; }
93-
94-
if(r_is_abstract){
95-
*r_is_abstract = false;
96-
}
97-
if(r_is_tool){
98-
*r_is_tool = false;
89+
Dictionary GdjLanguage::_get_global_class_name(const String& p_path) const {
90+
Dictionary ret;
91+
if (p_path.begins_with(ENTRY_DIRECTORY) || !p_path.ends_with(GODOT_JVM_REGISTRATION_FILE_EXTENSION)) {
92+
return ret;
9993
}
10094

95+
ret["is_abstract"] = false;
96+
ret["is_tool"] = false;
97+
10198
String script_name = JvmScript::get_script_file_name(p_path);
10299
Ref<NamedScript> named_script = JvmScriptManager::get_instance()->get_script_from_name(script_name);
103100
if (!named_script.is_null() && named_script.is_valid()) {
104-
if (r_base_type) {
105-
if (named_script->get_base_script().is_null()) {
106-
*r_base_type = named_script->get_instance_base_type();
107-
} else {
108-
*r_base_type = named_script->get_base_script()->get_global_name();
109-
}
110-
}
111-
return named_script->get_global_name();
101+
ret["base_type"] = named_script->get_base_script().is_null()
102+
? named_script->get_instance_base_type()
103+
: named_script->get_base_script()->get_global_name();
104+
ret["name"] = named_script->get_global_name();
112105
}
113106

114-
return {};
107+
return ret;
115108
}
116109

117-
Vector<String> GdjLanguage::get_reserved_words() const {
118-
static const Vector<String> ret = {
119-
"registeredName",
120-
"fqName",
121-
"relativeSourcePath ",
122-
"baseType ",
123-
"supertypes",
124-
"signals",
125-
"properties",
126-
"functions"
110+
PackedStringArray GdjLanguage::_get_reserved_words() const {
111+
static PackedStringArray reserved_words {
112+
"registeredName",
113+
"fqName",
114+
"relativeSourcePath ",
115+
"baseType ",
116+
"supertypes",
117+
"signals",
118+
"properties",
119+
"functions"
127120
};
128-
129-
return ret;
121+
return reserved_words;
130122
}
131123

132-
bool GdjLanguage::is_control_flow_keyword(const String& p_keyword) const {
124+
bool GdjLanguage::_is_control_flow_keyword(const String& p_keyword) const {
133125
return false;
134126
}
135127

136-
Vector<String> GdjLanguage::get_comment_delimiters() const {
137-
static const Vector<String> ret = {"//"};
138-
return ret;
128+
PackedStringArray GdjLanguage::_get_comment_delimiters() const {
129+
static PackedStringArray delimiters {
130+
"//"
131+
};
132+
return delimiters;
139133
}
140134

141135
Vector<String> GdjLanguage::get_doc_comment_delimiters() const {return {};}
@@ -151,12 +145,4 @@ Ref<Script> GdjLanguage::make_template(const String& p_template, const String& p
151145
gdj_script->set_source_code(processed_template);
152146
gdj_script->set_name(p_class_name);
153147
return gdj_script;
154-
}
155-
156-
Vector<ScriptLanguage::ScriptTemplate> GdjLanguage::get_built_in_templates(const StringName& p_object) {
157-
return {};
158-
}
159-
160-
bool GdjLanguage::is_using_templates() {
161-
return false;
162148
}

src/api/language/gdj_language.h

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,32 +12,29 @@ namespace godot {
1212

1313
static GdjLanguage* get_instance();
1414

15-
void init() override;
16-
void frame() override;
17-
void finish() override;
18-
19-
void thread_enter() override;
20-
void thread_exit() override;
21-
22-
String get_name() const override;
23-
String get_type() const override;
24-
String get_extension() const override;
25-
void get_recognized_extensions(List<String>* p_extensions) const override;
26-
27-
bool handles_global_class_type(const String& p_type) const override;
28-
String get_global_class_name(const String& p_path, String* r_base_type, String* r_icon_path, bool* r_is_abstract = nullptr, bool* r_is_tool = nullptr) const override;
29-
bool has_named_classes() const override;
30-
bool supports_builtin_mode() const override;
31-
Script* create_script() const override;
32-
33-
Vector<String> get_reserved_words() const override;
34-
bool is_control_flow_keyword(const String& p_keyword) const override;
35-
Vector<String> get_comment_delimiters() const override;
36-
Vector<String> get_doc_comment_delimiters() const override;
37-
Vector<String> get_string_delimiters() const override;
38-
Ref<Script> make_template(const String& p_template, const String& p_class_name, const String& p_base_class_name) const override;
39-
Vector<ScriptTemplate> get_built_in_templates(const StringName& p_object) override;
40-
bool is_using_templates() override;
41-
};
42-
15+
void _init() override;
16+
void _frame() override;
17+
void _finish() override;
18+
19+
void _thread_enter() override;
20+
void _thread_exit() override;
21+
22+
String _get_name() const override;
23+
String _get_type() const override;
24+
String _get_extension() const override;
25+
PackedStringArray _get_recognized_extensions() const override;
26+
27+
bool _handles_global_class_type(const String& p_type) const override;
28+
Dictionary _get_global_class_name(const String& p_path) const override;
29+
bool _has_named_classes() const override;
30+
Object* _create_script() const override;
31+
32+
PackedStringArray _get_reserved_words() const override;
33+
bool _is_control_flow_keyword(const String& p_keyword) const override;
34+
PackedStringArray _get_comment_delimiters() const override;
35+
void get_doc_comment_delimiters(List<String>* p_delimiters) const override;
36+
void get_string_delimiters(List<String>* p_delimiters) const override;
37+
Ref<Script> _make_template(const String& p_template, const String& p_class_name, const String& p_base_class_name) const override;
38+
};
39+
}
4340
#endif// GODOT_JVM_GDJ_LANGUAGE_H

src/api/language/java_language.cpp

Lines changed: 39 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "names.h"
44
#include "api/script/language/java_script.h"
55

6-
#include <core/io/resource_loader.hpp>
6+
#include <classes/resource_loader.hpp>
77

88
using namespace godot;
99

@@ -41,24 +41,27 @@ JavaLanguage* JavaLanguage::get_instance() {
4141
return instance;
4242
}
4343

44-
String JavaLanguage::get_name() const {
44+
String JavaLanguage::_get_name() const {
4545
return GODOT_JAVA_LANGUAGE_NAME;
4646
}
4747

48-
String JavaLanguage::get_type() const {
48+
String JavaLanguage::_get_type() const {
4949
return GODOT_JAVA_SCRIPT_NAME;
5050
}
5151

52-
String JavaLanguage::get_extension() const {
52+
String JavaLanguage::_get_extension() const {
5353
return GODOT_JAVA_SCRIPT_EXTENSION;
5454
}
5555

56-
void JavaLanguage::get_recognized_extensions(List<String>* p_extensions) const {
57-
p_extensions->push_back(GODOT_JAVA_SCRIPT_EXTENSION);
56+
PackedStringArray JavaLanguage::_get_recognized_extensions() const {
57+
static PackedStringArray extensions {
58+
GODOT_JAVA_SCRIPT_EXTENSION
59+
};
60+
return extensions;
5861
}
5962

6063
Vector<String> JavaLanguage::get_reserved_words() const {
61-
static const Vector<String> ret = {
64+
return {
6265
"abstract",
6366
"assert",
6467
"boolean",
@@ -109,32 +112,39 @@ Vector<String> JavaLanguage::get_reserved_words() const {
109112
"volatile",
110113
"while"
111114
};
112-
113-
return ret;
115+
return reserved_words;
114116
}
115117

116-
bool JavaLanguage::is_control_flow_keyword(const String& p_keyword) const {
118+
bool JavaLanguage::_is_control_flow_keyword(const String& p_keyword) const {
117119
return p_keyword == "break" || p_keyword == "catch" || p_keyword == "continue" || p_keyword == "do"
118120
|| p_keyword == "else" || p_keyword == "finally" || p_keyword == "for" || p_keyword == "if" || p_keyword == "return"
119121
|| p_keyword == "when" || p_keyword == "throw" || p_keyword == "try" || p_keyword == "while";
120122
}
121123

122-
Vector<String> JavaLanguage::get_comment_delimiters() const {
123-
static const Vector<String> ret = {"//", "/* */"};
124-
return ret;
124+
PackedStringArray JavaLanguage::_get_comment_delimiters() const {
125+
static PackedStringArray delimiters {
126+
"//",
127+
"/* */"
128+
};
129+
return delimiters;
125130
}
126131

127-
Vector<String> JavaLanguage::get_doc_comment_delimiters() const {
128-
static const Vector<String> ret = {"/** */"};
129-
return ret;
132+
PackedStringArray JavaLanguage::_get_doc_comment_delimiters() const {
133+
PackedStringArray delimiters {
134+
"/** */"
135+
};
136+
return delimiters;
130137
}
131138

132-
Vector<String> JavaLanguage::get_string_delimiters() const {
133-
static const Vector<String> ret = {"' '", "\" \""};
134-
return ret;
139+
PackedStringArray JavaLanguage::_get_string_delimiters() const {
140+
PackedStringArray delimiters {
141+
"' '",
142+
"\" \""
143+
};
144+
return delimiters;
135145
}
136146

137-
Ref<Script> JavaLanguage::make_template(const String& p_template, const String& p_class_name, const String& p_base_class_name) const {
147+
Ref<Script> JavaLanguage::_make_template(const String& p_template, const String& p_class_name, const String& p_base_class_name) const {
138148
Ref<JavaScript> java_script;
139149
java_script.instantiate();
140150
String processed_template {p_template.replace(CLASS_TEMPLATE, p_class_name.to_pascal_case())};
@@ -143,40 +153,23 @@ Ref<Script> JavaLanguage::make_template(const String& p_template, const String&
143153
return java_script;
144154
}
145155

146-
Vector<ScriptLanguage::ScriptTemplate> JavaLanguage::get_built_in_templates(const StringName& p_object) {
147-
Vector<ScriptLanguage::ScriptTemplate> templates;
156+
TypedArray<Dictionary> JavaLanguage::_get_built_in_templates(const StringName& p_object) const {
157+
TypedArray<Dictionary> templates;
148158
if (ClassDB::is_parent_class(p_object, "Node")) {
149-
ScriptLanguage::ScriptTemplate script_template {
150-
String(p_object),
151-
String("Default"),
152-
String("Base template for Node based scripts with default Godot cycle methods"),
153-
String(JAVA_TEMPLATE).replace(BASE_TEMPLATE, p_object)
154-
};
159+
Dictionary script_template;
160+
script_template["inherit"] = String(p_object);
161+
script_template["name"] = "Default";
162+
script_template["description"] = "Base template for Node based scripts with default Godot cycle methods";
163+
script_template["content"] = String(JAVA_TEMPLATE).replace(BASE_TEMPLATE, p_object);
155164
templates.append(script_template);
156165
}
157166
return templates;
158167
}
159168

160-
bool JavaLanguage::is_using_templates() {
169+
bool JavaLanguage::_is_using_templates() {
161170
return true;
162171
}
163172

164-
Script* JavaLanguage::create_script() const {
173+
Object* JavaLanguage::_create_script() const {
165174
return memnew(JavaScript);
166-
}
167-
168-
bool JavaLanguage::has_named_classes() const {
169-
return false;
170-
}
171-
172-
bool JavaLanguage::supports_builtin_mode() const {
173-
return false;
174-
}
175-
176-
String JavaLanguage::get_global_class_name(const String& p_path, String* r_base_type, String* r_icon_path, bool *r_is_abstract, bool *r_is_too) const {
177-
return {};
178-
}
179-
180-
bool JavaLanguage::handles_global_class_type(const String& p_type) const {
181-
return false;
182175
}

0 commit comments

Comments
 (0)