GDScript: Fix autocompletion issues with nested types

This commit is contained in:
HolonProduction
2024-07-31 23:44:48 +02:00
parent 4d1f26e1fd
commit d4abc211f1
23 changed files with 302 additions and 44 deletions

View File

@ -1,5 +1,27 @@
extends Node
class InnerA:
class InnerInnerA:
enum EnumOfInnerInnerA {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
enum EnumOfInnerA {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
signal signal_of_inner_a
var property_of_inner_a
func func_of_inner_a():
pass
enum EnumOfA {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
signal signal_of_a
var property_of_a

View File

@ -0,0 +1,31 @@
extends Node
class_name B
class InnerB:
class InnerInnerB:
enum EnumOfInnerInnerB {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
enum EnumOfInnerB {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
signal signal_of_inner_b
var property_of_inner_b
func func_of_inner_b():
pass
enum EnumOfB {
ENUM_VALUE_1,
ENUM_VALUE_2,
}
signal signal_of_b
var property_of_b
func func_of_b():
pass

View File

@ -1,8 +1,8 @@
class B:
class TestClass:
func to_str(b: int):
return str(b)
var a: B
var a: TestClass
func _ready():
a.to_str(10).

View File

@ -1,4 +1,4 @@
[output]
exclude=[
{"display": "AUTO_TRANSLATE_MODE_INHERIT"},
{"display": "AUTO_TRANSLATE_MODE_INHERIT"},
]

View File

@ -1,6 +0,0 @@
extends Node
var test = {
t = 1,
AutoTranslateMode.
}

View File

@ -0,0 +1,7 @@
# Disabled due to GH-105421
extends Node
var test = {
t = 1,
AutoTranslateMode.
}

View File

@ -0,0 +1,21 @@
[output]
include=[
{"display": "A"},
{"display": "B"},
{"display": "LocalInnerClass"},
{"display": "LocalInnerEnum"},
{"display": "ConnectFlags"},
{"display": "int"},
{"display": "String"},
{"display": "float"},
{"display": "Vector2"},
{"display": "Vector3"},
{"display": "Vector4"},
{"display": "Node"},
{"display": "Node2D"},
]
exclude=[
{"display": "AInner"},
{"display": "LocalInnerInnerEnum"},
{"display": "LocalInnerInnerClass"},
]

View File

@ -0,0 +1,11 @@
const A = preload("res://completion/class_a.notest.gd")
class LocalInnerClass:
const AInner = preload("res://completion/class_a.notest.gd")
enum LocalInnerInnerEnum {}
class LocalInnerInnerClass:
pass
enum LocalInnerEnum {}
var test_var: A

View File

@ -0,0 +1,19 @@
[output]
include=[
{"display": "A"},
{"display": "AInner"},
{"display": "B"},
{"display": "LocalInnerClass"},
{"display": "LocalInnerInnerClass"},
{"display": "LocalInnerEnum"},
{"display": "LocalInnerInnerEnum"},
{"display": "ConnectFlags"},
{"display": "int"},
{"display": "String"},
{"display": "float"},
{"display": "Vector2"},
{"display": "Vector3"},
{"display": "Vector4"},
{"display": "Node"},
{"display": "Node2D"},
]

View File

@ -0,0 +1,10 @@
const A = preload("res://completion/class_a.notest.gd")
class LocalInnerClass:
const AInner = preload("res://completion/class_a.notest.gd")
enum LocalInnerInnerEnum {}
class LocalInnerInnerClass:
pass
var test_var: A
enum LocalInnerEnum {}

View File

@ -0,0 +1,12 @@
[output]
include=[
{"display": "InnerB"},
{"display": "EnumOfB"},
{"display": "ConnectFlags"},
]
exclude=[
{"display": "int"},
{"display": "String"},
{"display": "Node2D"},
{"display": "B"},
]

View File

@ -0,0 +1 @@
var test_var: B.

View File

@ -0,0 +1,12 @@
[output]
include=[
{"display": "InnerInnerClass"},
{"display": "InnerInnerEnum"},
{"display": "ConnectFlags"},
]
exclude=[
{"display": "int"},
{"display": "String"},
{"display": "Node2D"},
{"display": "B"},
]

View File

@ -0,0 +1,8 @@
const A = preload("res://completion/class_a.notest.gd")
class LocalInnerClass:
class InnerInnerClass:
pass
enum InnerInnerEnum {}
var test_var: LocalInnerClass.

View File

@ -0,0 +1,11 @@
[output]
exclude=[
{"display": "TEST_LOCAL_VAL"},
{"display": "ConnectFlags"},
]
exclude=[
{"display": "int"},
{"display": "String"},
{"display": "Node2D"},
{"display": "B"},
]

View File

@ -0,0 +1,7 @@
const A = preload("res://completion/class_a.notest.gd")
enum LocalInnerEnum {
TEST_LOCAL_VAL,
}
var test_var: LocalInnerEnum.

View File

@ -0,0 +1,12 @@
[output]
include=[
{"display": "InnerA"},
{"display": "EnumOfA"},
{"display": "ConnectFlags"},
]
exclude=[
{"display": "int"},
{"display": "String"},
{"display": "Node2D"},
{"display": "B"},
]

View File

@ -0,0 +1,3 @@
const A = preload("res://completion/class_a.notest.gd")
var test_var: A.

View File

@ -0,0 +1,19 @@
[output]
include=[
{"display": "AInnerInner"},
{"display": "InnerInnerInnerEnum"},
{"display": "InnerInnerInnerClass"},
{"display": "ConnectFlags"},
]
exclude=[
{"display": "A"},
{"display": "AInner"},
{"display": "TestEnum"},
{"display": "InnerInnerEnum"},
{"display": "InnerInnerClass"},
{"display": "LocalInnerClass"},
{"display": "int"},
{"display": "String"},
{"display": "Node2D"},
{"display": "B"},
]

View File

@ -0,0 +1,14 @@
const A = preload("res://completion/class_a.notest.gd")
class LocalInnerClass:
const AInner = preload("res://completion/class_a.notest.gd")
class InnerInnerClass:
const AInnerInner = preload("res://completion/class_a.notest.gd")
enum InnerInnerInnerEnum {}
class InnerInnerInnerClass:
pass
enum InnerInnerEnum {}
enum TestEnum {}
var test_var: LocalInnerClass.InnerInnerClass.

View File

@ -223,13 +223,52 @@ static void test_directory(const String &p_dir) {
}
}
static void setup_global_classes(const String &p_dir) {
Error err = OK;
Ref<DirAccess> dir = DirAccess::open(p_dir, &err);
if (err != OK) {
FAIL("Invalid test directory.");
return;
}
String path = dir->get_current_dir();
dir->list_dir_begin();
String next = dir->get_next();
while (!next.is_empty()) {
if (dir->current_is_dir() && next != "." && next != "..") {
setup_global_classes(path.path_join(next));
} else if (next.ends_with(".gd")) {
String base_type;
bool is_abstract;
bool is_tool;
String source_file = path.path_join(next);
String class_name = GDScriptLanguage::get_singleton()->get_global_class_name(source_file, &base_type, nullptr, &is_abstract, &is_tool);
if (class_name.is_empty()) {
next = dir->get_next();
continue;
}
ERR_FAIL_COND_MSG(ScriptServer::is_global_class(class_name),
"Class name \"" + class_name + "\" from \"" + source_file + "\" is already used in \"" + ScriptServer::get_global_class_path(class_name) + "\".");
ScriptServer::add_global_class(class_name, base_type, GDScriptLanguage::get_singleton()->get_name(), source_file, is_abstract, is_tool);
}
next = dir->get_next();
}
}
TEST_SUITE("[Modules][GDScript][Completion]") {
TEST_CASE("[Editor] Check suggestion list") {
// Set all editor settings that code completion relies on.
EditorSettings::get_singleton()->set_setting("text_editor/completion/use_single_quotes", false);
init_language("modules/gdscript/tests/scripts");
setup_global_classes("modules/gdscript/tests/scripts/completion");
test_directory("modules/gdscript/tests/scripts/completion");
finish_language();
}
}
} // namespace GDScriptTests