diff --git a/core/variant/variant_op.cpp b/core/variant/variant_op.cpp index 08d7d8230fc..9d2040ae6ae 100644 --- a/core/variant/variant_op.cpp +++ b/core/variant/variant_op.cpp @@ -1042,20 +1042,20 @@ void Variant::_register_variant_operators() { register_op>(Variant::OP_IN, Variant::PACKED_COLOR_ARRAY, Variant::ARRAY); register_op>(Variant::OP_IN, Variant::PACKED_VECTOR4_ARRAY, Variant::ARRAY); - register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_BYTE_ARRAY); - register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_BYTE_ARRAY); + register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_BYTE_ARRAY); + register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_BYTE_ARRAY); - register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT32_ARRAY); - register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT32_ARRAY); + register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT32_ARRAY); + register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT32_ARRAY); - register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT64_ARRAY); - register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT64_ARRAY); + register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_INT64_ARRAY); + register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_INT64_ARRAY); - register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT32_ARRAY); - register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT32_ARRAY); + register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT32_ARRAY); + register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT32_ARRAY); - register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT64_ARRAY); - register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT64_ARRAY); + register_op>(Variant::OP_IN, Variant::INT, Variant::PACKED_FLOAT64_ARRAY); + register_op>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT64_ARRAY); register_op>(Variant::OP_IN, Variant::STRING, Variant::PACKED_STRING_ARRAY); register_op>(Variant::OP_IN, Variant::STRING_NAME, Variant::PACKED_STRING_ARRAY); diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 764137e5ff8..2e106d451b5 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -68,6 +68,8 @@ void GotoLineDialog::ok_pressed() { text_editor->remove_secondary_carets(); text_editor->unfold_line(line_number); text_editor->set_caret_line(line_number); + text_editor->set_code_hint(""); + text_editor->cancel_code_completion(); hide(); } @@ -177,6 +179,8 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) text_editor->unfold_line(pos.y); text_editor->select(pos.y, pos.x, pos.y, pos.x + text.length()); text_editor->center_viewport_to_caret(0); + text_editor->set_code_hint(""); + text_editor->cancel_code_completion(); line_col_changed_for_result = true; } @@ -1301,23 +1305,35 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) { text_editor->end_complex_operation(); } -void CodeTextEditor::goto_line(int p_line) { +void CodeTextEditor::goto_line(int p_line, int p_column) { text_editor->remove_secondary_carets(); text_editor->deselect(); - text_editor->unfold_line(p_line); - callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_line).call_deferred(p_line, true, true, 0, 0); + text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1)); + text_editor->set_caret_line(p_line, false); + text_editor->set_caret_column(p_column, false); + text_editor->set_code_hint(""); + text_editor->cancel_code_completion(); + // Defer in case the CodeEdit was just created and needs to be resized. + callable_mp((TextEdit *)text_editor, &TextEdit::adjust_viewport_to_caret).call_deferred(0); } void CodeTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) { text_editor->remove_secondary_carets(); - text_editor->unfold_line(p_line); - callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_line).call_deferred(p_line, true, true, 0, 0); - callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_column).call_deferred(p_begin, true, 0); + text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1)); text_editor->select(p_line, p_begin, p_line, p_end); + text_editor->set_code_hint(""); + text_editor->cancel_code_completion(); + callable_mp((TextEdit *)text_editor, &TextEdit::adjust_viewport_to_caret).call_deferred(0); } -void CodeTextEditor::goto_line_centered(int p_line) { - goto_line(p_line); +void CodeTextEditor::goto_line_centered(int p_line, int p_column) { + text_editor->remove_secondary_carets(); + text_editor->deselect(); + text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1)); + text_editor->set_caret_line(p_line, false); + text_editor->set_caret_column(p_column, false); + text_editor->set_code_hint(""); + text_editor->cancel_code_completion(); callable_mp((TextEdit *)text_editor, &TextEdit::center_viewport_to_caret).call_deferred(0); } @@ -1445,13 +1461,7 @@ void CodeTextEditor::goto_error() { corrected_column -= tab_count * (indent_size - 1); } - if (text_editor->get_line_count() != error_line) { - text_editor->unfold_line(error_line); - } - text_editor->remove_secondary_carets(); - text_editor->set_caret_line(error_line); - text_editor->set_caret_column(corrected_column); - text_editor->center_viewport_to_caret(); + goto_line_centered(error_line, corrected_column); } } diff --git a/editor/code_editor.h b/editor/code_editor.h index d8289b99158..2d895a6a212 100644 --- a/editor/code_editor.h +++ b/editor/code_editor.h @@ -248,9 +248,9 @@ class CodeTextEditor : public VBoxContainer { /// by adding or removing comment delimiter void toggle_inline_comment(const String &delimiter); - void goto_line(int p_line); + void goto_line(int p_line, int p_column = 0); void goto_line_selection(int p_line, int p_begin, int p_end); - void goto_line_centered(int p_line); + void goto_line_centered(int p_line, int p_column = 0); void set_executing_line(int p_line); void clear_executing_line(); diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp index 6553d166619..43155b5046a 100644 --- a/editor/plugins/script_editor_plugin.cpp +++ b/editor/plugins/script_editor_plugin.cpp @@ -495,7 +495,7 @@ void ScriptEditor::_goto_script_line(Ref p_script, int p_line) { if (ScriptTextEditor *script_text_editor = Object::cast_to(current)) { script_text_editor->goto_line_centered(p_line); } else if (current) { - current->goto_line(p_line, true); + current->goto_line(p_line); } _save_history(); @@ -1859,17 +1859,13 @@ void ScriptEditor::get_breakpoints(List *p_breakpoints) { } void ScriptEditor::_members_overview_selected(int p_idx) { - ScriptEditorBase *se = _get_current_editor(); - if (!se) { - return; + int line = members_overview->get_item_metadata(p_idx); + ScriptEditorBase *current = _get_current_editor(); + if (ScriptTextEditor *script_text_editor = Object::cast_to(current)) { + script_text_editor->goto_line_centered(line); + } else if (current) { + current->goto_line(line); } - // Go to the member's line and reset the cursor column. We can't change scroll_position - // directly until we have gone to the line first, since code might be folded. - se->goto_line(members_overview->get_item_metadata(p_idx)); - Dictionary state = se->get_edit_state(); - state["column"] = 0; - state["scroll_position"] = members_overview->get_item_metadata(p_idx); - se->set_edit_state(state); } void ScriptEditor::_help_overview_selected(int p_idx) { diff --git a/editor/plugins/script_editor_plugin.h b/editor/plugins/script_editor_plugin.h index 192ead438da..bbf1365f47a 100644 --- a/editor/plugins/script_editor_plugin.h +++ b/editor/plugins/script_editor_plugin.h @@ -172,7 +172,7 @@ class ScriptEditorBase : public VBoxContainer { virtual Variant get_edit_state() = 0; virtual void set_edit_state(const Variant &p_state) = 0; virtual Variant get_navigation_state() = 0; - virtual void goto_line(int p_line, bool p_with_error = false) = 0; + virtual void goto_line(int p_line, int p_column = 0) = 0; virtual void set_executing_line(int p_line) = 0; virtual void clear_executing_line() = 0; virtual void trim_trailing_whitespace() = 0; diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 3aa4e880bb7..15453ac519a 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -304,16 +304,14 @@ void ScriptTextEditor::_warning_clicked(const Variant &p_line) { void ScriptTextEditor::_error_clicked(const Variant &p_line) { if (p_line.get_type() == Variant::INT) { - code_editor->get_text_editor()->remove_secondary_carets(); - code_editor->get_text_editor()->set_caret_line(p_line.operator int64_t()); + goto_line_centered(p_line.operator int64_t()); } else if (p_line.get_type() == Variant::DICTIONARY) { Dictionary meta = p_line.operator Dictionary(); const String path = meta["path"].operator String(); const int line = meta["line"].operator int64_t(); const int column = meta["column"].operator int64_t(); if (path.is_empty()) { - code_editor->get_text_editor()->remove_secondary_carets(); - code_editor->get_text_editor()->set_caret_line(line); + goto_line_centered(line, column); } else { Ref scr = ResourceLoader::load(path); if (!scr.is_valid()) { @@ -458,16 +456,16 @@ void ScriptTextEditor::tag_saved_version() { code_editor->get_text_editor()->tag_saved_version(); } -void ScriptTextEditor::goto_line(int p_line, bool p_with_error) { - code_editor->goto_line(p_line); +void ScriptTextEditor::goto_line(int p_line, int p_column) { + code_editor->goto_line(p_line, p_column); } void ScriptTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) { code_editor->goto_line_selection(p_line, p_begin, p_end); } -void ScriptTextEditor::goto_line_centered(int p_line) { - code_editor->goto_line_centered(p_line); +void ScriptTextEditor::goto_line_centered(int p_line, int p_column) { + code_editor->goto_line_centered(p_line, p_column); } void ScriptTextEditor::set_executing_line(int p_line) { @@ -921,8 +919,7 @@ void ScriptTextEditor::_breakpoint_item_pressed(int p_idx) { if (p_idx < 4) { // Any item before the separator. _edit_option(breakpoints_menu->get_item_id(p_idx)); } else { - code_editor->goto_line(breakpoints_menu->get_item_metadata(p_idx)); - callable_mp((TextEdit *)code_editor->get_text_editor(), &TextEdit::center_viewport_to_caret).call_deferred(0); // Needs to be deferred, because goto uses call_deferred(). + code_editor->goto_line_centered(breakpoints_menu->get_item_metadata(p_idx)); } } diff --git a/editor/plugins/script_text_editor.h b/editor/plugins/script_text_editor.h index 87d4b90b85b..19d193a6894 100644 --- a/editor/plugins/script_text_editor.h +++ b/editor/plugins/script_text_editor.h @@ -236,9 +236,9 @@ class ScriptTextEditor : public ScriptEditorBase { virtual void convert_indent() override; virtual void tag_saved_version() override; - virtual void goto_line(int p_line, bool p_with_error = false) override; + virtual void goto_line(int p_line, int p_column = 0) override; void goto_line_selection(int p_line, int p_begin, int p_end); - void goto_line_centered(int p_line); + void goto_line_centered(int p_line, int p_column = 0); virtual void set_executing_line(int p_line) override; virtual void clear_executing_line() override; diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index 7a4bda16cc3..c4e0cfd2b08 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -306,8 +306,8 @@ void TextEditor::tag_saved_version() { code_editor->get_text_editor()->tag_saved_version(); } -void TextEditor::goto_line(int p_line, bool p_with_error) { - code_editor->goto_line(p_line); +void TextEditor::goto_line(int p_line, int p_column) { + code_editor->goto_line(p_line, p_column); } void TextEditor::goto_line_selection(int p_line, int p_begin, int p_end) { diff --git a/editor/plugins/text_editor.h b/editor/plugins/text_editor.h index e298a7d8d9f..360d693b16a 100644 --- a/editor/plugins/text_editor.h +++ b/editor/plugins/text_editor.h @@ -131,7 +131,7 @@ class TextEditor : public ScriptEditorBase { virtual PackedInt32Array get_breakpoints() override; virtual void set_breakpoint(int p_line, bool p_enabled) override{}; virtual void clear_breakpoints() override{}; - virtual void goto_line(int p_line, bool p_with_error = false) override; + virtual void goto_line(int p_line, int p_column = 0) override; void goto_line_selection(int p_line, int p_begin, int p_end); virtual void set_executing_line(int p_line) override; virtual void clear_executing_line() override; diff --git a/editor/plugins/text_shader_editor.cpp b/editor/plugins/text_shader_editor.cpp index 980d913f294..66f5140e328 100644 --- a/editor/plugins/text_shader_editor.cpp +++ b/editor/plugins/text_shader_editor.cpp @@ -781,7 +781,7 @@ void TextShaderEditor::_show_warnings_panel(bool p_show) { void TextShaderEditor::_warning_clicked(const Variant &p_line) { if (p_line.get_type() == Variant::INT) { - code_editor->get_text_editor()->set_caret_line(p_line.operator int64_t()); + code_editor->goto_line_centered(p_line.operator int64_t()); } } diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index 9129ab3fc34..b76ea23d4b3 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -76,9 +76,16 @@ bool GDScriptNativeClass::_get(const StringName &p_name, Variant &r_ret) const { if (ok) { r_ret = v; return true; - } else { - return false; } + + MethodBind *method = ClassDB::get_method(name, p_name); + if (method && method->is_static()) { + // Native static method. + r_ret = Callable(this, p_name); + return true; + } + + return false; } void GDScriptNativeClass::_bind_methods() { @@ -1056,6 +1063,26 @@ void GDScript::_bind_methods() { ClassDB::bind_vararg_method(METHOD_FLAGS_DEFAULT, "new", &GDScript::_new, MethodInfo("new")); } +void GDScript::set_path_cache(const String &p_path) { + if (ResourceCache::has(p_path)) { + set_path(p_path, true); + return; + } + + if (is_root_script()) { + Script::set_path_cache(p_path); + } + + String old_path = path; + path = p_path; + path_valid = true; + GDScriptCache::move_script(old_path, p_path); + + for (KeyValue> &kv : subclasses) { + kv.value->set_path_cache(p_path); + } +} + void GDScript::set_path(const String &p_path, bool p_take_over) { if (is_root_script()) { Script::set_path(p_path, p_take_over); diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index f2a2bace12d..0aaf86b49cd 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -302,6 +302,7 @@ class GDScript : public Script { virtual Error reload(bool p_keep_state = false) override; + virtual void set_path_cache(const String &p_path) override; virtual void set_path(const String &p_path, bool p_take_over = false) override; String get_script_path() const; Error load_source_code(const String &p_path); diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index c473ce9c8f3..6a740a2e4f8 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -150,6 +150,15 @@ static GDScriptParser::DataType make_enum_type(const StringName &p_enum_name, co return type; } +static GDScriptParser::DataType make_class_enum_type(const StringName &p_enum_name, GDScriptParser::ClassNode *p_class, const String &p_script_path, bool p_meta = true) { + GDScriptParser::DataType type = make_enum_type(p_enum_name, p_class->fqcn, p_meta); + + type.class_type = p_class; + type.script_path = p_script_path; + + return type; +} + static GDScriptParser::DataType make_native_enum_type(const StringName &p_enum_name, const StringName &p_native_class, bool p_meta = true) { // Find out which base class declared the enum, so the name is always the same even when coming from other contexts. StringName native_base = p_native_class; @@ -1066,7 +1075,7 @@ void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class, check_class_member_name_conflict(p_class, member.m_enum->identifier->name, member.m_enum); member.m_enum->set_datatype(resolving_datatype); - GDScriptParser::DataType enum_type = make_enum_type(member.m_enum->identifier->name, p_class->fqcn, true); + GDScriptParser::DataType enum_type = make_class_enum_type(member.m_enum->identifier->name, p_class, parser->script_path, true); const GDScriptParser::EnumNode *prev_enum = current_enum; current_enum = member.m_enum; @@ -1159,7 +1168,7 @@ void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class, // Also update the original references. member.enum_value.parent_enum->values.set(member.enum_value.index, member.enum_value); - member.enum_value.identifier->set_datatype(make_enum_type(UNNAMED_ENUM, p_class->fqcn, false)); + member.enum_value.identifier->set_datatype(make_class_enum_type(UNNAMED_ENUM, p_class, parser->script_path, false)); } break; case GDScriptParser::ClassNode::Member::CLASS: check_class_member_name_conflict(p_class, member.m_class->identifier->name, member.m_class); @@ -4135,7 +4144,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident const GDScriptParser::EnumNode::Value &element = current_enum->values[i]; if (element.identifier->name == p_identifier->name) { StringName enum_name = current_enum->identifier ? current_enum->identifier->name : UNNAMED_ENUM; - GDScriptParser::DataType type = make_enum_type(enum_name, parser->current_class->fqcn, false); + GDScriptParser::DataType type = make_class_enum_type(enum_name, parser->current_class, parser->script_path, false); if (element.parent_enum->identifier) { type.enum_type = element.parent_enum->identifier->name; } diff --git a/modules/gdscript/gdscript_cache.cpp b/modules/gdscript/gdscript_cache.cpp index ff336007ac1..6e726082250 100644 --- a/modules/gdscript/gdscript_cache.cpp +++ b/modules/gdscript/gdscript_cache.cpp @@ -314,7 +314,7 @@ Ref GDScriptCache::get_shallow_script(const String &p_path, Error &r_e Ref script; script.instantiate(); - script->set_path(p_path, true); + script->set_path_cache(p_path); if (remapped_path.get_extension().to_lower() == "gdc") { Vector buffer = get_binary_tokens(remapped_path); if (buffer.is_empty()) { @@ -362,6 +362,7 @@ Ref GDScriptCache::get_full_script(const String &p_path, Error &r_erro return script; } } + script->set_path(p_path, true); const String remapped_path = ResourceLoader::path_remap(p_path); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index f6f5001ccef..e3406521ee9 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -1112,10 +1112,12 @@ static void _find_identifiers_in_class(const GDScriptParser::ClassNode *p_class, continue; } option = ScriptLanguage::CodeCompletionOption(member.function->identifier->name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (member.function->parameters.size() > 0) { + if (member.function->parameters.size() > 0 || (member.function->info.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } break; case GDScriptParser::ClassNode::Member::SIGNAL: @@ -1157,6 +1159,7 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base if (!p_types_only && base_type.is_meta_type && base_type.kind != GDScriptParser::DataType::BUILTIN && base_type.kind != GDScriptParser::DataType::ENUM) { ScriptLanguage::CodeCompletionOption option("new", ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, ScriptLanguage::LOCATION_LOCAL); option.insert_text += "("; + option.display += U"(\u2026)"; r_result.insert(option.display, option); } @@ -1214,10 +1217,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base } int location = p_recursion_depth + _get_method_location(scr->get_class_name(), E.name); ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1300,10 +1305,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base } int location = p_recursion_depth + _get_method_location(type, E.name); ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1371,10 +1378,12 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base continue; } ScriptLanguage::CodeCompletionOption option(E.name, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION, location); - if (E.arguments.size()) { + if (E.arguments.size() || (E.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1406,8 +1415,10 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context ScriptLanguage::CodeCompletionOption option(String(E), ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); if (function.arguments.size() || (function.flags & METHOD_FLAG_VARARG)) { option.insert_text += "("; + option.display += U"(\u2026)"; } else { option.insert_text += "()"; + option.display += "()"; } r_result.insert(option.display, option); } @@ -1454,6 +1465,7 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context while (*kwa) { ScriptLanguage::CodeCompletionOption option(*kwa, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); option.insert_text += "("; + option.display += U"(\u2026)"; r_result.insert(option.display, option); kwa++; } @@ -1464,6 +1476,7 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context for (List::Element *E = utility_func_names.front(); E; E = E->next()) { ScriptLanguage::CodeCompletionOption option(E->get(), ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION); option.insert_text += "("; + option.display += U"(\u2026)"; // As all utility functions contain an argument or more, this is hardcoded here. r_result.insert(option.display, option); } @@ -1880,7 +1893,7 @@ static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context, } } - if (!found && base.value.get_type() != Variant::NIL) { + if (!found) { found = _guess_method_return_type_from_base(c, base, call->function_name, r_type); } } @@ -3754,7 +3767,19 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co } } break; case GDScriptParser::DataType::ENUM: { - if (base_type.enum_values.has(p_symbol)) { + if (base_type.class_type && base_type.class_type->has_member(base_type.enum_type)) { + GDScriptParser::EnumNode *base_enum = base_type.class_type->get_member(base_type.enum_type).m_enum; + for (const GDScriptParser::EnumNode::Value &value : base_enum->values) { + if (value.identifier && value.identifier->name == p_symbol) { + r_result.type = ScriptLanguage::LOOKUP_RESULT_SCRIPT_LOCATION; + r_result.class_path = base_type.script_path; + r_result.location = value.line; + Error err = OK; + r_result.script = GDScriptCache::get_shallow_script(r_result.class_path, err); + return err; + } + } + } else if (base_type.enum_values.has(p_symbol)) { r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT; r_result.class_name = String(base_type.native_type).get_slicec('.', 0); r_result.class_member = p_symbol; diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index 7297ec69af7..71c2cc07f98 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -247,8 +247,26 @@ void GDScriptParser::apply_pending_warnings() { } #endif -void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node, int p_argument, bool p_force) { - if (!for_completion || (!p_force && completion_context.type != COMPLETION_NONE)) { +void GDScriptParser::override_completion_context(const Node *p_for_node, CompletionType p_type, Node *p_node, int p_argument) { + if (!for_completion) { + return; + } + if (completion_context.node != p_for_node) { + return; + } + CompletionContext context; + context.type = p_type; + context.current_class = current_class; + context.current_function = current_function; + context.current_suite = current_suite; + context.current_line = tokenizer->get_cursor_line(); + context.current_argument = p_argument; + context.node = p_node; + completion_context = context; +} + +void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node, int p_argument) { + if (!for_completion) { return; } if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) { @@ -266,8 +284,8 @@ void GDScriptParser::make_completion_context(CompletionType p_type, Node *p_node completion_context = context; } -void GDScriptParser::make_completion_context(CompletionType p_type, Variant::Type p_builtin_type, bool p_force) { - if (!for_completion || (!p_force && completion_context.type != COMPLETION_NONE)) { +void GDScriptParser::make_completion_context(CompletionType p_type, Variant::Type p_builtin_type) { + if (!for_completion) { return; } if (previous.cursor_place != GDScriptTokenizerText::CURSOR_MIDDLE && previous.cursor_place != GDScriptTokenizerText::CURSOR_END && current.cursor_place == GDScriptTokenizerText::CURSOR_NONE) { @@ -1622,7 +1640,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali advance(); // Arguments. push_completion_call(annotation); - make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, 0, true); + make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, 0); int argument_index = 0; do { if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) { @@ -1630,7 +1648,7 @@ GDScriptParser::AnnotationNode *GDScriptParser::parse_annotation(uint32_t p_vali break; } - make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, argument_index, true); + make_completion_context(COMPLETION_ANNOTATION_ARGUMENTS, annotation, argument_index); set_last_completion_call_arg(argument_index++); ExpressionNode *argument = parse_expression(false); if (argument == nullptr) { @@ -2571,8 +2589,11 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_literal(ExpressionNode *p_ } LiteralNode *literal = alloc_node(); - complete_extents(literal); literal->value = previous.literal; + reset_extents(literal, p_previous_operand); + update_extents(literal); + make_completion_context(COMPLETION_NONE, literal, -1); + complete_extents(literal); return literal; } @@ -3067,12 +3088,12 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_attribute(ExpressionNode * const IdentifierNode *id = static_cast(p_previous_operand); Variant::Type builtin_type = get_builtin_type(id->name); if (builtin_type < Variant::VARIANT_MAX) { - make_completion_context(COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD, builtin_type, true); + make_completion_context(COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD, builtin_type); is_builtin = true; } } if (!is_builtin) { - make_completion_context(COMPLETION_ATTRIBUTE, attribute, -1, true); + make_completion_context(COMPLETION_ATTRIBUTE, attribute, -1); } } @@ -3197,23 +3218,24 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre push_completion_call(call); int argument_index = 0; do { - make_completion_context(ct, call, argument_index++, true); + make_completion_context(ct, call, argument_index); if (check(GDScriptTokenizer::Token::PARENTHESIS_CLOSE)) { // Allow for trailing comma. break; } - bool use_identifier_completion = current.cursor_place == GDScriptTokenizerText::CURSOR_END || current.cursor_place == GDScriptTokenizerText::CURSOR_MIDDLE; ExpressionNode *argument = parse_expression(false); if (argument == nullptr) { push_error(R"(Expected expression as the function argument.)"); } else { call->arguments.push_back(argument); - if (argument->type == Node::IDENTIFIER && use_identifier_completion) { - completion_context.type = COMPLETION_IDENTIFIER; + if (argument->type == Node::LITERAL) { + override_completion_context(argument, ct, call, argument_index); } } + ct = COMPLETION_CALL_ARGUMENTS; + argument_index++; } while (match(GDScriptTokenizer::Token::COMMA)); pop_completion_call(); @@ -3226,7 +3248,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_call(ExpressionNode *p_pre GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p_previous_operand, bool p_can_assign) { // We want code completion after a DOLLAR even if the current code is invalid. - make_completion_context(COMPLETION_GET_NODE, nullptr, -1, true); + make_completion_context(COMPLETION_GET_NODE, nullptr, -1); if (!current.is_node_name() && !check(GDScriptTokenizer::Token::LITERAL) && !check(GDScriptTokenizer::Token::SLASH) && !check(GDScriptTokenizer::Token::PERCENT)) { push_error(vformat(R"(Expected node path as string or identifier after "%s".)", previous.get_name())); @@ -3283,7 +3305,7 @@ GDScriptParser::ExpressionNode *GDScriptParser::parse_get_node(ExpressionNode *p path_state = PATH_STATE_SLASH; } - make_completion_context(COMPLETION_GET_NODE, get_node, context_argument++, true); + make_completion_context(COMPLETION_GET_NODE, get_node, context_argument++); if (match(GDScriptTokenizer::Token::LITERAL)) { if (previous.literal.get_type() != Variant::STRING) { diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index ddd76ef9385..d6c1f9f8bb2 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -1457,9 +1457,11 @@ class GDScriptParser { } void apply_pending_warnings(); #endif - - void make_completion_context(CompletionType p_type, Node *p_node, int p_argument = -1, bool p_force = false); - void make_completion_context(CompletionType p_type, Variant::Type p_builtin_type, bool p_force = false); + void make_completion_context(CompletionType p_type, Node *p_node, int p_argument = -1); + void make_completion_context(CompletionType p_type, Variant::Type p_builtin_type); + // In some cases it might become necessary to alter the completion context after parsing a subexpression. + // For example to not override COMPLETE_CALL_ARGUMENTS with COMPLETION_NONE from string literals. + void override_completion_context(const Node *p_for_node, CompletionType p_type, Node *p_node, int p_argument = -1); void push_completion_call(Node *p_call); void pop_completion_call(); void set_last_completion_call_arg(int p_argument); diff --git a/modules/gdscript/language_server/gdscript_extend_parser.cpp b/modules/gdscript/language_server/gdscript_extend_parser.cpp index d61c97eabfe..5732a3372bb 100644 --- a/modules/gdscript/language_server/gdscript_extend_parser.cpp +++ b/modules/gdscript/language_server/gdscript_extend_parser.cpp @@ -59,6 +59,12 @@ lsp::Position GodotPosition::to_lsp(const Vector &p_lines) const { return res; } res.line = line - 1; + + // Special case: `column = 0` -> Starts at beginning of line. + if (column <= 0) { + return res; + } + // Note: character outside of `pos_line.length()-1` is valid. res.character = column - 1; @@ -240,9 +246,12 @@ void ExtendGDScriptParser::parse_class_symbol(const GDScriptParser::ClassNode *p r_symbol.kind = lsp::SymbolKind::Class; r_symbol.deprecated = false; r_symbol.range = range_of_node(p_class); - r_symbol.range.start.line = MAX(r_symbol.range.start.line, 0); if (p_class->identifier) { r_symbol.selectionRange = range_of_node(p_class->identifier); + } else { + // No meaningful `selectionRange`, but we must ensure that it is inside of `range`. + r_symbol.selectionRange.start = r_symbol.range.start; + r_symbol.selectionRange.end = r_symbol.range.start; } r_symbol.detail = "class " + r_symbol.name; { diff --git a/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.cfg b/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.cfg new file mode 100644 index 00000000000..be9bd510e18 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.cfg @@ -0,0 +1,5 @@ +[output] +include=[ + {"insert_text": "\"property_of_a\""}, + {"insert_text": "\"name\""}, +] diff --git a/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.gd b/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.gd new file mode 100644 index 00000000000..a8e04a62a75 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/argument_options/string_literals/argument_options_inside_string_literal.gd @@ -0,0 +1,8 @@ +extends Node + +const A = preload ("res://completion/class_a.notest.gd") + +func _ready() -> void: + var a := A.new() + var tween := get_tree().create_tween() + tween.tween_property(a, "➡") diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers.cfg b/modules/gdscript/tests/scripts/completion/common/identifiers_in_call.cfg similarity index 54% rename from modules/gdscript/tests/scripts/completion/common/identifiers.cfg rename to modules/gdscript/tests/scripts/completion/common/identifiers_in_call.cfg index 871a404e3ad..f2dff734b63 100644 --- a/modules/gdscript/tests/scripts/completion/common/identifiers.cfg +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_call.cfg @@ -2,20 +2,24 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, - ; GDScript: self.gd + ; GDScript: identifiers.gd {"display": "test_signal_1"}, {"display": "test_signal_2"}, {"display": "test_var_1"}, {"display": "test_var_2"}, - {"display": "test_func_1"}, - {"display": "test_func_2"}, + {"display": "test_func_1(…)"}, + {"display": "test_func_2(…)"}, + {"display": "test_parameter_1"}, + {"display": "test_parameter_2"}, + {"display": "local_test_var_1"}, + {"display": "local_test_var_2"}, ] diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers_in_call.gd b/modules/gdscript/tests/scripts/completion/common/identifiers_in_call.gd new file mode 100644 index 00000000000..91488c25aa5 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_call.gd @@ -0,0 +1,18 @@ +extends "res://completion/class_a.notest.gd" + +signal test_signal_1(a) +signal test_signal_2(a: int) + +var test_var_1 +var test_var_2: int + +func test_func_1(t): + pass + +func test_func_2(t: int) -> void: + pass + +func _init(test_parameter_1, test_parameter_2: String): + var local_test_var_1 + var local_test_var_2: int + print(t➡) diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.cfg b/modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.cfg new file mode 100644 index 00000000000..f2dff734b63 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.cfg @@ -0,0 +1,25 @@ +scene="res://completion/get_node/get_node.tscn" +[output] +include=[ + ; Node + {"display": "add_child(…)"}, + {"display": "owner"}, + {"display": "child_entered_tree"}, + + ; GDScript: class_a.notest.gd + {"display": "property_of_a"}, + {"display": "func_of_a()"}, + {"display": "signal_of_a"}, + + ; GDScript: identifiers.gd + {"display": "test_signal_1"}, + {"display": "test_signal_2"}, + {"display": "test_var_1"}, + {"display": "test_var_2"}, + {"display": "test_func_1(…)"}, + {"display": "test_func_2(…)"}, + {"display": "test_parameter_1"}, + {"display": "test_parameter_2"}, + {"display": "local_test_var_1"}, + {"display": "local_test_var_2"}, +] diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers.gd b/modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.gd similarity index 66% rename from modules/gdscript/tests/scripts/completion/common/identifiers.gd rename to modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.gd index efbafbee8e1..a2f5b7bc23e 100644 --- a/modules/gdscript/tests/scripts/completion/common/identifiers.gd +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_function_body.gd @@ -12,5 +12,7 @@ func test_func_1(t): func test_func_2(t: int) -> void: pass -func _init(): +func _init(test_parameter_1, test_parameter_2: String): + var local_test_var_1 + var local_test_var_2: int t➡ diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.cfg b/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.cfg new file mode 100644 index 00000000000..f2dff734b63 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.cfg @@ -0,0 +1,25 @@ +scene="res://completion/get_node/get_node.tscn" +[output] +include=[ + ; Node + {"display": "add_child(…)"}, + {"display": "owner"}, + {"display": "child_entered_tree"}, + + ; GDScript: class_a.notest.gd + {"display": "property_of_a"}, + {"display": "func_of_a()"}, + {"display": "signal_of_a"}, + + ; GDScript: identifiers.gd + {"display": "test_signal_1"}, + {"display": "test_signal_2"}, + {"display": "test_var_1"}, + {"display": "test_var_2"}, + {"display": "test_func_1(…)"}, + {"display": "test_func_2(…)"}, + {"display": "test_parameter_1"}, + {"display": "test_parameter_2"}, + {"display": "local_test_var_1"}, + {"display": "local_test_var_2"}, +] diff --git a/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.gd b/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.gd new file mode 100644 index 00000000000..fed0b869c49 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/identifiers_in_unclosed_call.gd @@ -0,0 +1,22 @@ +# godotengine/godot#92226 +extends "res://completion/class_a.notest.gd" + +signal test_signal_1(a) +signal test_signal_2(a: int) + +var test_var_1 +var test_var_2: int + +func test_func_1(t): + pass + +func test_func_2(t: int) -> void: + pass + +func _init(test_parameter_1, test_parameter_2: String): + var local_test_var_1 + var local_test_var_2: int + print(t➡ + + if true: + pass diff --git a/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.cfg b/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.cfg new file mode 100644 index 00000000000..e8f996aa037 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.cfg @@ -0,0 +1,5 @@ +[output] +include=[ + ; String + {"display": "begins_with(…)"}, +] diff --git a/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.gd b/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.gd new file mode 100644 index 00000000000..e271b37eebc --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/infer_return_type_without_value.gd @@ -0,0 +1,9 @@ +class B: + func to_str(b: int): + return str(b) + +var a: B + +func _ready(): + a.to_str(10).➡ + pass diff --git a/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.cfg b/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.cfg new file mode 100644 index 00000000000..e0129190515 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.cfg @@ -0,0 +1,26 @@ +scene="res://completion/get_node/get_node.tscn" +[output] +exclude=[ + ; Node + {"display": "add_child(…)"}, + {"display": "owner"}, + {"display": "child_entered_tree"}, + {"display": "add_child(…)"}, + + ; GDScript: class_a.notest.gd + {"display": "property_of_a"}, + {"display": "func_of_a()"}, + {"display": "signal_of_a"}, + + ; GDScript: no_completion_in_string.gd + {"display": "test_signal_1"}, + {"display": "test_signal_2"}, + {"display": "test_var_1"}, + {"display": "test_var_2"}, + {"display": "test_func_1(…)"}, + {"display": "test_func_2(…)"}, + {"display": "test_parameter_1"}, + {"display": "test_parameter_2"}, + {"display": "local_test_var_1"}, + {"display": "local_test_var_2"}, +] diff --git a/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.gd b/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.gd new file mode 100644 index 00000000000..da52af9fe35 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/common/no_completion_in_string.gd @@ -0,0 +1,19 @@ +# godotengine/godot#62945 +extends "res://completion/class_a.notest.gd" + +signal test_signal_1(a) +signal test_signal_2(a: int) + +var test_var_1 +var test_var_2: int + +func test_func_1(t): + pass + +func test_func_2(t: int) -> void: + pass + +func _init(test_parameter_1, test_parameter_2: String): + var local_test_var_1 + var local_test_var_2: int + var a = "➡" diff --git a/modules/gdscript/tests/scripts/completion/common/self.cfg b/modules/gdscript/tests/scripts/completion/common/self.cfg index 871a404e3ad..dcce1df0d08 100644 --- a/modules/gdscript/tests/scripts/completion/common/self.cfg +++ b/modules/gdscript/tests/scripts/completion/common/self.cfg @@ -2,13 +2,13 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ; GDScript: self.gd @@ -16,6 +16,6 @@ include=[ {"display": "test_signal_2"}, {"display": "test_var_1"}, {"display": "test_var_2"}, - {"display": "test_func_1"}, - {"display": "test_func_2"}, + {"display": "test_func_1(…)"}, + {"display": "test_func_2(…)"}, ] diff --git a/modules/gdscript/tests/scripts/completion/common/self.gd b/modules/gdscript/tests/scripts/completion/common/self.gd index 9ad2fbea519..ed181af0c57 100644 --- a/modules/gdscript/tests/scripts/completion/common/self.gd +++ b/modules/gdscript/tests/scripts/completion/common/self.gd @@ -14,3 +14,4 @@ func test_func_2(t: int) -> void: func _init(): self.➡ + pass diff --git a/modules/gdscript/tests/scripts/completion/filter/organized_export.gd b/modules/gdscript/tests/scripts/completion/filter/organized_export.gd index 189608904cf..9fa9618cee5 100644 --- a/modules/gdscript/tests/scripts/completion/filter/organized_export.gd +++ b/modules/gdscript/tests/scripts/completion/filter/organized_export.gd @@ -5,4 +5,5 @@ extends CPUParticles2D @export_subgroup("Test Subgroup") func _init(): - ➡ + t➡ + pass diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal/dollar.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal/dollar.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal/dollar.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal/dollar.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal/percent.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal/percent.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal/percent.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal/percent.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_class_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_class_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_class_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_class_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_native_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_native_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_native_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/dollar_native_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_class_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_class_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_class_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_class_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_native_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_native_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_native_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/literal_scene/percent_native_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local/local.cfg b/modules/gdscript/tests/scripts/completion/get_node/local/local.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local/local.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local/local.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.cfg similarity index 73% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.cfg rename to modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.gd b/modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.gd rename to modules/gdscript/tests/scripts/completion/get_node/local_infered/local_infered.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.cfg similarity index 79% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.cfg rename to modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.gd b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.gd rename to modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/class_local_infered_scene.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.cfg similarity index 78% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.cfg rename to modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.gd b/modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.gd rename to modules/gdscript/tests/scripts/completion/get_node/local_infered_scene/native_local_infered_scene.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_scene/class_local_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_scene/class_local_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_scene/class_local_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_scene/class_local_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_scene/native_local_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_scene/native_local_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_scene/native_local_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_scene/native_local_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint/class_local_typehint.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint/class_local_typehint.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint/class_local_typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint/class_local_typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint/native_local_typehint.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint/native_local_typehint.cfg index 72c0549d3b8..d647135bc61 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint/native_local_typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint/native_local_typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/class_local_typehint_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/class_local_typehint_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/class_local_typehint_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/class_local_typehint_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/native_local_typehint_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/native_local_typehint_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/native_local_typehint_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene/native_local_typehint_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/class_local_typehint_scene_broad.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/class_local_typehint_scene_broad.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/class_local_typehint_scene_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/class_local_typehint_scene_broad.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/native_local_typehint_scene_broad.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/native_local_typehint_scene_broad.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/native_local_typehint_scene_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_broad/native_local_typehint_scene_broad.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/class_local_typehint_scene_incompatible.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/class_local_typehint_scene_incompatible.cfg index 1894e72c651..a6118908de9 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/class_local_typehint_scene_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/class_local_typehint_scene_incompatible.cfg @@ -3,18 +3,18 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; Area2D - {"display": "get_overlapping_areas"}, + {"display": "get_overlapping_areas()"}, {"display": "linear_damp"}, {"display": "area_entered"}, ] exclude=[ ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/native_local_typehint_scene_incompatible.cfg b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/native_local_typehint_scene_incompatible.cfg index c8ab63f6d60..d8390ca33c3 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/native_local_typehint_scene_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/local_typehint_scene_incompatible/native_local_typehint_scene_incompatible.cfg @@ -3,18 +3,18 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; Area2D - {"display": "get_overlapping_areas"}, + {"display": "get_overlapping_areas()"}, {"display": "linear_damp"}, {"display": "area_entered"}, ] exclude=[ ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member/member.cfg b/modules/gdscript/tests/scripts/completion/get_node/member/member.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member/member.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member/member.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.cfg similarity index 73% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.cfg rename to modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.cfg index ae7d34d87dc..319c5121b51 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_interfered/local_interfered.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.cfg @@ -1,7 +1,7 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.gd b/modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered/member_interfered.gd rename to modules/gdscript/tests/scripts/completion/get_node/member_infered/member_infered.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.cfg similarity index 79% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.cfg rename to modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/class_local_interfered_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.gd b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/class_member_interfered_scene.gd rename to modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/class_member_infered_scene.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.cfg similarity index 78% rename from modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.cfg rename to modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/local_interfered_scene/native_local_interfered_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.gd b/modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/get_node/member_interfered_scene/native_member_interfered_scene.gd rename to modules/gdscript/tests/scripts/completion/get_node/member_infered_scene/native_member_infered_scene.gd diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_scene/class_member_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_scene/class_member_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_scene/class_member_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_scene/class_member_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_scene/native_member_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_scene/native_member_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_scene/native_member_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_scene/native_member_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint/class_member_typehint.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint/class_member_typehint.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint/class_member_typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint/class_member_typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint/native_member_typehint.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint/native_member_typehint.cfg index 72c0549d3b8..d647135bc61 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint/native_member_typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint/native_member_typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.cfg index 9c580b711d8..7518bf5ae58 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/class_member_typehint_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/native_member_typehint_scene.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/native_member_typehint_scene.cfg index 446198dd353..174fdcb1840 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/native_member_typehint_scene.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene/native_member_typehint_scene.cfg @@ -3,12 +3,12 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/class_member_typehint_scene_broad.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/class_member_typehint_scene_broad.cfg index 502038bef7a..2f747e0bace 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/class_member_typehint_scene_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/class_member_typehint_scene_broad.cfg @@ -3,7 +3,7 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, @@ -11,6 +11,6 @@ include=[ exclude=[ ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/native_member_typehint_scene_broad.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/native_member_typehint_scene_broad.cfg index 1810e9fe5f5..f060413898c 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/native_member_typehint_scene_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_broad/native_member_typehint_scene_broad.cfg @@ -3,7 +3,7 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, @@ -11,6 +11,6 @@ include=[ exclude=[ ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/class_member_typehint_scene_incompatible.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/class_member_typehint_scene_incompatible.cfg index 1894e72c651..a6118908de9 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/class_member_typehint_scene_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/class_member_typehint_scene_incompatible.cfg @@ -3,18 +3,18 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; Area2D - {"display": "get_overlapping_areas"}, + {"display": "get_overlapping_areas()"}, {"display": "linear_damp"}, {"display": "area_entered"}, ] exclude=[ ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/native_member_typehint_scene_incompatible.cfg b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/native_member_typehint_scene_incompatible.cfg index c8ab63f6d60..d8390ca33c3 100644 --- a/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/native_member_typehint_scene_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/get_node/member_typehint_scene_incompatible/native_member_typehint_scene_incompatible.cfg @@ -3,18 +3,18 @@ scene="res://completion/get_node/get_node.tscn" [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; Area2D - {"display": "get_overlapping_areas"}, + {"display": "get_overlapping_areas()"}, {"display": "linear_damp"}, {"display": "area_entered"}, ] exclude=[ ; AnimationPlayer {"display": "autoplay"}, - {"display": "play"}, + {"display": "play(…)"}, {"display": "animation_changed"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/member/interfered.cfg b/modules/gdscript/tests/scripts/completion/types/local/infered.cfg similarity index 74% rename from modules/gdscript/tests/scripts/completion/types/member/interfered.cfg rename to modules/gdscript/tests/scripts/completion/types/local/infered.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/member/interfered.cfg +++ b/modules/gdscript/tests/scripts/completion/types/local/infered.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/local/interfered.gd b/modules/gdscript/tests/scripts/completion/types/local/infered.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/types/local/interfered.gd rename to modules/gdscript/tests/scripts/completion/types/local/infered.gd diff --git a/modules/gdscript/tests/scripts/completion/types/local/no_type.cfg b/modules/gdscript/tests/scripts/completion/types/local/no_type.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/local/no_type.cfg +++ b/modules/gdscript/tests/scripts/completion/types/local/no_type.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/local/typehint.cfg b/modules/gdscript/tests/scripts/completion/types/local/typehint.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/local/typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/types/local/typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/local/typehint_broad.cfg b/modules/gdscript/tests/scripts/completion/types/local/typehint_broad.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/local/typehint_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/types/local/typehint_broad.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/local/typehint_incompatible.cfg b/modules/gdscript/tests/scripts/completion/types/local/typehint_incompatible.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/local/typehint_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/types/local/typehint_incompatible.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/local/interfered.cfg b/modules/gdscript/tests/scripts/completion/types/member/infered.cfg similarity index 74% rename from modules/gdscript/tests/scripts/completion/types/local/interfered.cfg rename to modules/gdscript/tests/scripts/completion/types/member/infered.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/local/interfered.cfg +++ b/modules/gdscript/tests/scripts/completion/types/member/infered.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/member/interfered.gd b/modules/gdscript/tests/scripts/completion/types/member/infered.gd similarity index 100% rename from modules/gdscript/tests/scripts/completion/types/member/interfered.gd rename to modules/gdscript/tests/scripts/completion/types/member/infered.gd diff --git a/modules/gdscript/tests/scripts/completion/types/member/no_type.cfg b/modules/gdscript/tests/scripts/completion/types/member/no_type.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/member/no_type.cfg +++ b/modules/gdscript/tests/scripts/completion/types/member/no_type.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/member/typehint.cfg b/modules/gdscript/tests/scripts/completion/types/member/typehint.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/member/typehint.cfg +++ b/modules/gdscript/tests/scripts/completion/types/member/typehint.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/member/typehint_broad.cfg b/modules/gdscript/tests/scripts/completion/types/member/typehint_broad.cfg index 81401316ec8..d32bbac65ea 100644 --- a/modules/gdscript/tests/scripts/completion/types/member/typehint_broad.cfg +++ b/modules/gdscript/tests/scripts/completion/types/member/typehint_broad.cfg @@ -1,13 +1,13 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ] exclude=[ ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/completion/types/member/typehint_incompatible.cfg b/modules/gdscript/tests/scripts/completion/types/member/typehint_incompatible.cfg index 8b68d51a893..050b0d61a37 100644 --- a/modules/gdscript/tests/scripts/completion/types/member/typehint_incompatible.cfg +++ b/modules/gdscript/tests/scripts/completion/types/member/typehint_incompatible.cfg @@ -1,12 +1,12 @@ [output] include=[ ; Node - {"display": "add_child"}, + {"display": "add_child(…)"}, {"display": "owner"}, {"display": "child_entered_tree"}, ; GDScript: class_a.notest.gd {"display": "property_of_a"}, - {"display": "func_of_a"}, + {"display": "func_of_a()"}, {"display": "signal_of_a"}, ] diff --git a/modules/gdscript/tests/scripts/lsp/first_line_comment.gd b/modules/gdscript/tests/scripts/lsp/first_line_comment.gd new file mode 100644 index 00000000000..34ead5fabb3 --- /dev/null +++ b/modules/gdscript/tests/scripts/lsp/first_line_comment.gd @@ -0,0 +1,2 @@ +# Some comment +extends Node diff --git a/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.gd b/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.gd new file mode 100644 index 00000000000..63d5935d1e6 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.gd @@ -0,0 +1,8 @@ +func get_parse_string(t: Variant): + return t.parse_string + +func test(): + var a: Callable = JSON.parse_string + var b: Callable = get_parse_string(JSON) + prints(a.call("{\"test\": \"a\"}"), a.is_valid()) + prints(b.call("{\"test\": \"b\"}"), b.is_valid()) diff --git a/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.out b/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.out new file mode 100644 index 00000000000..a2cb4b9a071 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/native_static_method_as_callable.out @@ -0,0 +1,3 @@ +GDTEST_OK +{ "test": "a" } false +{ "test": "b" } false diff --git a/modules/gdscript/tests/test_lsp.h b/modules/gdscript/tests/test_lsp.h index bd9af6fc363..b5a3b83462e 100644 --- a/modules/gdscript/tests/test_lsp.h +++ b/modules/gdscript/tests/test_lsp.h @@ -377,6 +377,18 @@ func f(): gd.to_lsp(lines); } + SUBCASE("special case: zero column for root class") { + GodotPosition gd(1, 0); + lsp::Position expected = lsp_pos(0, 0); + lsp::Position actual = gd.to_lsp(lines); + CHECK_EQ(actual, expected); + } + SUBCASE("special case: zero line and column for root class") { + GodotPosition gd(0, 0); + lsp::Position expected = lsp_pos(0, 0); + lsp::Position actual = gd.to_lsp(lines); + CHECK_EQ(actual, expected); + } SUBCASE("special case: negative line for root class") { GodotPosition gd(-1, 0); lsp::Position expected = lsp_pos(0, 0); @@ -470,6 +482,25 @@ func f(): test_resolve_symbols(uri, all_test_data, all_test_data); } + memdelete(proto); + finish_language(); + } + TEST_CASE("[workspace][document_symbol]") { + GDScriptLanguageProtocol *proto = initialize(root); + REQUIRE(proto); + + SUBCASE("selectionRange of root class must be inside range") { + String path = "res://lsp/first_line_comment.gd"; + assert_no_errors_in(path); + GDScriptLanguageProtocol::get_singleton()->get_workspace()->parse_local_script(path); + ExtendGDScriptParser *parser = GDScriptLanguageProtocol::get_singleton()->get_workspace()->parse_results[path]; + REQUIRE(parser); + lsp::DocumentSymbol cls = parser->get_symbols(); + + REQUIRE(((cls.range.start.line == cls.selectionRange.start.line && cls.range.start.character <= cls.selectionRange.start.character) || (cls.range.start.line < cls.selectionRange.start.line))); + REQUIRE(((cls.range.end.line == cls.selectionRange.end.line && cls.range.end.character >= cls.selectionRange.end.character) || (cls.range.end.line > cls.selectionRange.end.line))); + } + memdelete(proto); finish_language(); }