summaryrefslogtreecommitdiffstats
path: root/modules/gdscript
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript')
-rw-r--r--modules/gdscript/language_server/gdscript_extend_parser.cpp11
-rw-r--r--modules/gdscript/tests/scripts/lsp/first_line_comment.gd2
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/stringify.gd1
-rw-r--r--modules/gdscript/tests/scripts/runtime/features/stringify.out1
-rw-r--r--modules/gdscript/tests/test_lsp.h31
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