diff options
author | George L. Albany <Megacake1234@gmail.com> | 2024-11-27 21:15:49 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-27 21:15:49 +0000 |
commit | 85d87116e184e7923b8d6804cab2681b61c62d83 (patch) | |
tree | 55ec5bfa061a5c27272b831e697b78ed1b756a70 /modules/gdscript | |
parent | b06d20bf39d15ec736d08d4e4fcb32e0c3c1ce1e (diff) | |
parent | 721f53fde47c2727d99e3ecccdb789a67df36de0 (diff) | |
download | redot-engine-master.tar.gz |
Merge commit godotengine/godot@f128f38
Diffstat (limited to 'modules/gdscript')
5 files changed, 45 insertions, 1 deletions
diff --git a/modules/gdscript/language_server/gdscript_extend_parser.cpp b/modules/gdscript/language_server/gdscript_extend_parser.cpp index d61c97eabf..5732a3372b 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<String> &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/lsp/first_line_comment.gd b/modules/gdscript/tests/scripts/lsp/first_line_comment.gd new file mode 100644 index 0000000000..34ead5fabb --- /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/stringify.gd b/modules/gdscript/tests/scripts/runtime/features/stringify.gd index 463d207e59..69aecec6a8 100644 --- a/modules/gdscript/tests/scripts/runtime/features/stringify.gd +++ b/modules/gdscript/tests/scripts/runtime/features/stringify.gd @@ -22,6 +22,7 @@ func test(): print(AABB(Vector3.ZERO, Vector3.ONE)) print(Basis.from_euler(Vector3(0, 0, 0))) print(Transform3D.IDENTITY) + print(Projection.IDENTITY) print(Color(1, 2, 3, 4)) print(StringName("hello")) diff --git a/modules/gdscript/tests/scripts/runtime/features/stringify.out b/modules/gdscript/tests/scripts/runtime/features/stringify.out index 9983366db0..b044f8105d 100644 --- a/modules/gdscript/tests/scripts/runtime/features/stringify.out +++ b/modules/gdscript/tests/scripts/runtime/features/stringify.out @@ -17,6 +17,7 @@ hello world [P: (0.0, 0.0, 0.0), S: (1.0, 1.0, 1.0)] [X: (1.0, 0.0, 0.0), Y: (0.0, 1.0, 0.0), Z: (0.0, 0.0, 1.0)] [X: (1.0, 0.0, 0.0), Y: (0.0, 1.0, 0.0), Z: (0.0, 0.0, 1.0), O: (0.0, 0.0, 0.0)] +[X: (1.0, 0.0, 0.0, 0.0), Y: (0.0, 1.0, 0.0, 0.0), Z: (0.0, 0.0, 1.0, 0.0), W: (0.0, 0.0, 0.0, 1.0)] (1.0, 2.0, 3.0, 4.0) hello hello/world diff --git a/modules/gdscript/tests/test_lsp.h b/modules/gdscript/tests/test_lsp.h index bd9af6fc36..b5a3b83462 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); @@ -473,6 +485,25 @@ func f(): 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(); + } } } // namespace GDScriptTests |