summaryrefslogtreecommitdiffstats
path: root/modules/gdscript
diff options
context:
space:
mode:
authorHolonProduction <holonproduction@gmail.com>2024-01-26 17:28:13 +0100
committerHolonProduction <holonproduction@gmail.com>2024-03-01 11:38:49 +0100
commit1f42455e0a6f4b708b06500f63e2413d2a218a7e (patch)
treefaeb818b6c073912b094bf0f09798630402cbf7c /modules/gdscript
parentfc7d7d3dae02213d0a8d4b3af24f67017ef18770 (diff)
downloadredot-engine-1f42455e0a6f4b708b06500f63e2413d2a218a7e.tar.gz
Debugging additions
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/gdscript.cpp16
-rw-r--r--modules/gdscript/gdscript_cache.cpp1
-rw-r--r--modules/gdscript/gdscript_compiler.cpp13
-rw-r--r--modules/gdscript/gdscript_editor.cpp34
-rw-r--r--modules/gdscript/register_types.cpp1
-rw-r--r--modules/gdscript/tests/scripts/completion/get_node/get_node.tscn2
-rw-r--r--modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.gd5
-rw-r--r--modules/gdscript/tests/test_completion.h28
8 files changed, 87 insertions, 13 deletions
diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp
index 94aa077014..adc8de833a 100644
--- a/modules/gdscript/gdscript.cpp
+++ b/modules/gdscript/gdscript.cpp
@@ -304,13 +304,22 @@ void GDScript::get_script_method_list(List<MethodInfo> *r_list) const {
}
void GDScript::_get_script_property_list(List<PropertyInfo> *r_list, bool p_include_base) const {
+ print_line("GDSCript get_script_property list");
const GDScript *sptr = this;
+ print_line(this);
List<PropertyInfo> props;
-
while (sptr) {
+ print_line("while running");
+ print_line(sptr->get_source_code());
+ print_line(sptr->reloading);
+ print_line(sptr->member_indices.size());
+ print_line(sptr->members.size());
+ print_line(sptr->get_members().size());
Vector<_GDScriptMemberSort> msort;
for (const KeyValue<StringName, MemberInfo> &E : sptr->member_indices) {
+ print_line(E.key);
if (!sptr->members.has(E.key)) {
+ print_line("skipping");
continue; // Skip base class members.
}
_GDScriptMemberSort ms;
@@ -330,6 +339,7 @@ void GDScript::_get_script_property_list(List<PropertyInfo> *r_list, bool p_incl
#endif // TOOLS_ENABLED
for (const PropertyInfo &E : props) {
+ print_line("pushing_back", E.name);
r_list->push_back(E);
}
@@ -687,6 +697,7 @@ void GDScript::_restore_old_static_data() {
#endif
Error GDScript::reload(bool p_keep_state) {
+ print_line("reload", this->get_script_path());
if (reloading) {
return OK;
}
@@ -1016,6 +1027,7 @@ String GDScript::get_script_path() const {
}
Error GDScript::load_source_code(const String &p_path) {
+ print_line("load source code", p_path);
if (p_path.is_empty() || p_path.begins_with("gdscript://") || ResourceLoader::get_resource_type(p_path.get_slice("::", 0)) == "PackedScene") {
return OK;
}
@@ -2816,6 +2828,7 @@ Ref<GDScript> GDScriptLanguage::get_script_by_fully_qualified_name(const String
/*************** RESOURCE ***************/
Ref<Resource> ResourceFormatLoaderGDScript::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) {
+ print_line("resource format loader load", p_path);
Error err;
bool ignoring = p_cache_mode == CACHE_MODE_IGNORE || p_cache_mode == CACHE_MODE_IGNORE_DEEP;
Ref<GDScript> scr = GDScriptCache::get_full_script(p_original_path, err, "", ignoring);
@@ -2839,6 +2852,7 @@ void ResourceFormatLoaderGDScript::get_recognized_extensions(List<String> *p_ext
}
bool ResourceFormatLoaderGDScript::handles_type(const String &p_type) const {
+ print_line("GDScrip resource loader handles", p_type);
return (p_type == "Script" || p_type == "GDScript");
}
diff --git a/modules/gdscript/gdscript_cache.cpp b/modules/gdscript/gdscript_cache.cpp
index 7c27127dce..7576be781f 100644
--- a/modules/gdscript/gdscript_cache.cpp
+++ b/modules/gdscript/gdscript_cache.cpp
@@ -283,6 +283,7 @@ Ref<GDScript> GDScriptCache::get_shallow_script(const String &p_path, Error &r_e
}
Ref<GDScript> GDScriptCache::get_full_script(const String &p_path, Error &r_error, const String &p_owner, bool p_update_from_disk) {
+ print_line("get full script", p_path);
MutexLock lock(singleton->mutex);
if (!p_owner.is_empty()) {
diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp
index 13ed66710c..29d73b1977 100644
--- a/modules/gdscript/gdscript_compiler.cpp
+++ b/modules/gdscript/gdscript_compiler.cpp
@@ -30,6 +30,7 @@
#include "gdscript_compiler.h"
+#include "core/string/print_string.h"
#include "gdscript.h"
#include "gdscript_byte_codegen.h"
#include "gdscript_cache.h"
@@ -2579,11 +2580,17 @@ Error GDScriptCompiler::_parse_setter_getter(GDScript *p_script, const GDScriptP
// RPC info for its base classes first, then for itself, then for inner classes.
// Warning: this function cannot initiate compilation of other classes, or it will result in cyclic dependency issues.
Error GDScriptCompiler::_prepare_compilation(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) {
+ print_line("prepare compilation", p_script->get_script_path());
+ print_line(p_script->get_source_code());
+ //print_line(p_class->extends[0]);
+ print_line(p_class->members.size());
if (parsed_classes.has(p_script)) {
+ print_line("already parsed");
return OK;
}
if (parsing_classes.has(p_script)) {
+ print_line("already parsing");
String class_name = p_class->identifier ? String(p_class->identifier->name) : p_class->fqcn;
_set_error(vformat(R"(Cyclic class reference for "%s".)", class_name), p_class);
return ERR_PARSE_ERROR;
@@ -2712,8 +2719,11 @@ Error GDScriptCompiler::_prepare_compilation(GDScript *p_script, const GDScriptP
for (int i = 0; i < p_class->members.size(); i++) {
const GDScriptParser::ClassNode::Member &member = p_class->members[i];
+ print_line(member.get_name());
+ print_line(member.type);
switch (member.type) {
case GDScriptParser::ClassNode::Member::VARIABLE: {
+ print_line("variable");
const GDScriptParser::VariableNode *variable = member.variable;
StringName name = variable->identifier->name;
@@ -2756,9 +2766,11 @@ Error GDScriptCompiler::_prepare_compilation(GDScript *p_script, const GDScriptP
minfo.property_info = prop_info;
if (variable->is_static) {
+ print_line("static");
minfo.index = p_script->static_variables_indices.size();
p_script->static_variables_indices[name] = minfo;
} else {
+ print_line("inserting");
minfo.index = p_script->member_indices.size();
p_script->member_indices[name] = minfo;
p_script->members.insert(name);
@@ -3174,6 +3186,7 @@ void GDScriptCompiler::_get_function_ptr_replacements(HashMap<GDScriptFunction *
}
Error GDScriptCompiler::compile(const GDScriptParser *p_parser, GDScript *p_script, bool p_keep_state) {
+ print_line("compile", p_script->get_script_path());
err_line = -1;
err_column = -1;
error = "";
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index bc3d82062d..b3b628af34 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -28,6 +28,7 @@
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
+#include "core/string/print_string.h"
#include "gdscript.h"
#include "gdscript_analyzer.h"
@@ -1128,15 +1129,9 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base
print_line("identifier script");
Ref<Script> scr = base_type.script_type;
if (scr.is_valid()) {
-<<<<<<< HEAD
if (p_types_only) {
// TODO: Need to implement Script::get_script_enum_list and retrieve the enum list from a script.
} else if (!p_only_functions) {
-=======
- print_line("script valid");
- if (!p_only_functions) {
- print_line("not only functions");
->>>>>>> ae78637b78 (Add test for `get_node` autocompletion)
if (!base_type.is_meta_type) {
print_line("no meta type");
List<PropertyInfo> members;
@@ -2056,6 +2051,7 @@ static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context,
}
static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context, const GDScriptParser::IdentifierNode *p_identifier, GDScriptCompletionIdentifier &r_type) {
+ print_line("guess identifier type");
static int recursion_depth = 0;
RecursionCheck recursion(&recursion_depth);
if (unlikely(recursion.check())) {
@@ -2114,7 +2110,9 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
break;
}
} else {
+ print_line("not local");
if (p_context.current_class) {
+ print_line("current class exists");
GDScriptCompletionIdentifier base_identifier;
GDScriptCompletionIdentifier base;
@@ -2302,6 +2300,7 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
}
static bool _guess_identifier_type_from_base(GDScriptParser::CompletionContext &p_context, const GDScriptCompletionIdentifier &p_base, const StringName &p_identifier, GDScriptCompletionIdentifier &r_type) {
+ print_line("_guess_identifier_type_from_base");
static int recursion_depth = 0;
RecursionCheck recursion(&recursion_depth);
if (unlikely(recursion.check())) {
@@ -2313,7 +2312,9 @@ static bool _guess_identifier_type_from_base(GDScriptParser::CompletionContext &
while (base_type.is_set()) {
switch (base_type.kind) {
case GDScriptParser::DataType::CLASS:
+ print_line("CLASS");
if (base_type.class_type->has_member(p_identifier)) {
+ print_line("has member");
const GDScriptParser::ClassNode::Member &member = base_type.class_type->get_member(p_identifier);
switch (member.type) {
case GDScriptParser::ClassNode::Member::CONSTANT:
@@ -2323,29 +2324,40 @@ static bool _guess_identifier_type_from_base(GDScriptParser::CompletionContext &
}
return true;
case GDScriptParser::ClassNode::Member::VARIABLE:
+ print_line("variable");
if (!is_static || member.variable->is_static) {
+ print_line("1");
if (member.variable->get_datatype().is_set() && !member.variable->get_datatype().is_variant()) {
+ print_line("2");
r_type.type = member.variable->get_datatype();
return true;
} else if (member.variable->initializer) {
+ print_line("3");
const GDScriptParser::ExpressionNode *init = member.variable->initializer;
if (init->is_constant) {
+ print_line("4");
r_type.value = init->reduced_value;
r_type = _type_from_variant(init->reduced_value, p_context);
return true;
} else if (init->start_line == p_context.current_line) {
+ print_line("5");
return false;
// Detects if variable is assigned to itself
} else if (_is_expression_named_identifier(init, member.variable->identifier->name)) {
+ print_line("6");
if (member.variable->initializer->get_datatype().is_set()) {
+ print_line("7");
r_type.type = member.variable->initializer->get_datatype();
} else if (member.variable->get_datatype().is_set() && !member.variable->get_datatype().is_variant()) {
+ print_line("8");
r_type.type = member.variable->get_datatype();
}
return true;
} else if (_guess_expression_type(p_context, init, r_type)) {
+ print_line("9");
return true;
} else if (init->get_datatype().is_set() && !init->get_datatype().is_variant()) {
+ print_line("10");
r_type.type = init->get_datatype();
return true;
}
@@ -2847,6 +2859,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
}
static bool _get_subscript_type(GDScriptParser::CompletionContext &p_context, const GDScriptParser::SubscriptNode *p_subscript, GDScriptParser::DataType &r_base_type, Variant *r_base = nullptr) {
+ print_line("get subscript type");
if (p_context.base == nullptr) {
return false;
}
@@ -2859,10 +2872,13 @@ static bool _get_subscript_type(GDScriptParser::CompletionContext &p_context, co
} break;
case GDScriptParser::Node::IDENTIFIER: {
+ print_line("identifier");
if (p_subscript->base->datatype.type_source == GDScriptParser::DataType::ANNOTATED_EXPLICIT) {
+ print_line("annotated type takes precedence");
// Annotated type takes precedence.
return false;
}
+ print_line("annotated type did not work", p_subscript->base->datatype.type_source);
const GDScriptParser::IdentifierNode *identifier_node = static_cast<GDScriptParser::IdentifierNode *>(p_subscript->base);
@@ -3177,11 +3193,17 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
[[fallthrough]];
case GDScriptParser::COMPLETION_ATTRIBUTE: {
print_line("completion attribute");
+ if (completion_context.base != nullptr) {
+ print_line("base", completion_context.base->to_string());
+ } else {
+ print_line("no base");
+ }
r_forced = true;
const GDScriptParser::SubscriptNode *attr = static_cast<const GDScriptParser::SubscriptNode *>(completion_context.node);
if (attr->base) {
GDScriptCompletionIdentifier base;
bool found_type = _get_subscript_type(completion_context, attr, base.type);
+ print_line("found through subscript type", found_type);
if (!found_type && !_guess_expression_type(completion_context, attr->base, base)) {
break;
}
diff --git a/modules/gdscript/register_types.cpp b/modules/gdscript/register_types.cpp
index 59e387eece..dea9441789 100644
--- a/modules/gdscript/register_types.cpp
+++ b/modules/gdscript/register_types.cpp
@@ -142,6 +142,7 @@ static void _editor_init() {
#endif // TOOLS_ENABLED
void initialize_gdscript_module(ModuleInitializationLevel p_level) {
+ print_line("Initialize GDScript Module.");
if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) {
GDREGISTER_CLASS(GDScript);
diff --git a/modules/gdscript/tests/scripts/completion/get_node/get_node.tscn b/modules/gdscript/tests/scripts/completion/get_node/get_node.tscn
index 8e5994afab..35ac666941 100644
--- a/modules/gdscript/tests/scripts/completion/get_node/get_node.tscn
+++ b/modules/gdscript/tests/scripts/completion/get_node/get_node.tscn
@@ -12,8 +12,8 @@
unique_name_in_owner = true
[node name="UniqueA" type="Node" parent="UniqueNames"]
-script = ExtResource("1_ldc4g")
unique_name_in_owner = true
+script = ExtResource("1_ldc4g")
[node name="A" type="Node" parent="."]
script = ExtResource("1_ldc4g")
diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.gd b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.gd
index e4edc3a4e4..c261d6e754 100644
--- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.gd
+++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.gd
@@ -1,8 +1,9 @@
+@uid("uid://d04ev0gljq5yp") # Generated automatically, do not modify.
extends Node
const A := preload("res://completion/class_a.notest.gd")
-var test: A = $A
+@onready var test: A = $A
func a():
- test.➡
+ test.➡
diff --git a/modules/gdscript/tests/test_completion.h b/modules/gdscript/tests/test_completion.h
index b127471012..1545245bb7 100644
--- a/modules/gdscript/tests/test_completion.h
+++ b/modules/gdscript/tests/test_completion.h
@@ -31,6 +31,9 @@
#ifndef TEST_COMPLETION_H
#define TEST_COMPLETION_H
+#include "core/io/resource.h"
+#include "core/io/resource_loader.h"
+#include "core/io/resource_uid.h"
#ifdef TOOLS_ENABLED
#include "core/io/config_file.h"
@@ -140,8 +143,20 @@ static void test_directory(const String &p_dir) {
bool forced;
Node *owner = nullptr;
+ print_line("before owner load");
if (conf.has_section_key("input", "scene")) {
- Ref<PackedScene> scene = ResourceLoader::load(conf.get_value("input", "scene"), "PackedScene");
+ /*List<String> deps;
+ ResourceLoader::get_dependencies(conf.get_value("input", "scene"), &deps);
+ for (const String &E : deps) {
+ print_line(E);
+ print_line(ResourceLoader::exists(E));
+ print_line(ResourceLoader::get_resource_type(E));
+ Ref<GDScript> s = ResourceLoader::load(E);
+ if (s->is_valid()) {
+ print_line(s->get_members().size());
+ }
+ }*/
+ Ref<PackedScene> scene = ResourceLoader::load(conf.get_value("input", "scene"), "PackedScene", ResourceFormatLoader::CACHE_MODE_IGNORE_DEEP);
if (scene.is_valid()) {
owner = scene->instantiate();
}
@@ -151,11 +166,16 @@ static void test_directory(const String &p_dir) {
owner = scene->instantiate();
}
}
-
+ print_line("after owner load");
+ if (owner != nullptr) {
+ print_line("owner", owner->to_string());
+ } else {
+ print_line("no owner");
+ }
GDScriptLanguage::get_singleton()->complete_code(code, path.path_join(next), owner, &options, forced, call_hint);
String contains_excluded;
for (ScriptLanguage::CodeCompletionOption &option : options) {
- print_line(option.display);
+ //print_line(option.display);
for (const Dictionary &E : exclude) {
if (match_option(E, option)) {
contains_excluded = option.display;
@@ -199,6 +219,8 @@ static void test_directory(const String &p_dir) {
TEST_SUITE("[Modules][GDScript][Completion]") {
TEST_CASE("[Editor] Check suggestion list") {
+ ResourceUID::initialize_class();
+
// Set all editor settings that code completion relies on.
EditorSettings::get_singleton()->set_setting("text_editor/completion/use_single_quotes", false);
init_language("modules/gdscript/tests/scripts");