From af54b13603c385a14d916e435e80934a6805f8f9 Mon Sep 17 00:00:00 2001 From: HolonProduction Date: Thu, 30 Jan 2025 12:41:51 +0100 Subject: [PATCH] Autocompletion: Add support for global enums --- core/core_constants.cpp | 10 ++++ core/core_constants.h | 6 ++- modules/gdscript/gdscript_editor.cpp | 47 +++++++++++++++---- .../builtin_enum_in_type_hint.cfg | 9 ++++ .../builtin_enum/builtin_enum_in_type_hint.gd | 4 ++ .../global_enum/global_enum_identifier.cfg | 6 +++ .../global_enum/global_enum_identifier.gd | 5 ++ .../global_enum/global_enum_in_extends.cfg | 6 +++ .../global_enum/global_enum_in_extends.gd | 1 + .../global_enum/global_enum_in_type_hint.cfg | 6 +++ .../global_enum/global_enum_in_type_hint.gd | 5 ++ .../global_enum/global_enum_values.cfg | 5 ++ .../global_enum/global_enum_values.gd | 5 ++ 13 files changed, 106 insertions(+), 9 deletions(-) create mode 100644 modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.cfg create mode 100644 modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.gd create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.cfg create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.gd create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.cfg create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.gd create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.cfg create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.gd create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.cfg create mode 100644 modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.gd diff --git a/core/core_constants.cpp b/core/core_constants.cpp index 112a76ffa75..89d8a08d5c5 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -863,3 +863,13 @@ void CoreConstants::get_enum_values(const StringName &p_enum, HashMap *r_values) { + for (const KeyValue> &global_enum : _global_enums) { + r_values->push_back(global_enum.key); + } +} + +#endif diff --git a/core/core_constants.h b/core/core_constants.h index c432fdca3b1..8e58241c1e5 100644 --- a/core/core_constants.h +++ b/core/core_constants.h @@ -32,6 +32,7 @@ #include "core/string/string_name.h" #include "core/templates/hash_map.h" +#include "core/templates/list.h" class CoreConstants { public: @@ -44,5 +45,8 @@ public: static bool is_global_constant(const StringName &p_name); static int get_global_constant_index(const StringName &p_name); static bool is_global_enum(const StringName &p_enum); - static void get_enum_values(const StringName &p_enum, HashMap *p_values); + static void get_enum_values(const StringName &p_enum, HashMap *r_values); +#ifdef TOOLS_ENABLED + static void get_global_enums(List *r_values); +#endif }; diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 1c507750f6e..3d0093ca079 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -1032,6 +1032,15 @@ static void _find_built_in_variants(HashMap &r_result) { + List global_enums; + CoreConstants::get_global_enums(&global_enums); + for (const StringName &enum_name : global_enums) { + ScriptLanguage::CodeCompletionOption option(enum_name, ScriptLanguage::CODE_COMPLETION_KIND_ENUM, ScriptLanguage::LOCATION_OTHER); + r_result.insert(option.display, option); + } +} + static void _list_available_types(bool p_inherit_only, GDScriptParser::CompletionContext &p_context, HashMap &r_result) { // Built-in Variant Types _find_built_in_variants(r_result, true); @@ -1093,6 +1102,11 @@ static void _list_available_types(bool p_inherit_only, GDScriptParser::Completio r_result.insert(option.display, option); } + // Global enums + if (!p_inherit_only) { + _find_global_enums(r_result); + } + // Autoload singletons HashMap autoloads = ProjectSettings::get_singleton()->get_autoload_list(); @@ -1393,15 +1407,29 @@ static void _find_identifiers_in_base(const GDScriptCompletionIdentifier &p_base } break; case GDScriptParser::DataType::ENUM: { String type_str = base_type.native_type; - StringName type = type_str.get_slicec('.', 0); - StringName type_enum = base_type.enum_type; - List enum_values; - ClassDB::get_enum_constants(type, type_enum, &enum_values); - for (const StringName &E : enum_values) { - int location = p_recursion_depth + _get_enum_constant_location(type, E); - ScriptLanguage::CodeCompletionOption option(E, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT, location); - r_result.insert(option.display, option); + if (type_str.contains_char('.')) { + StringName type = type_str.get_slicec('.', 0); + StringName type_enum = base_type.enum_type; + + List enum_values; + + ClassDB::get_enum_constants(type, type_enum, &enum_values); + + for (const StringName &E : enum_values) { + int location = p_recursion_depth + _get_enum_constant_location(type, E); + ScriptLanguage::CodeCompletionOption option(E, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT, location); + r_result.insert(option.display, option); + } + } else if (CoreConstants::is_global_enum(base_type.enum_type)) { + HashMap enum_values; + CoreConstants::get_enum_values(base_type.enum_type, &enum_values); + + for (const KeyValue &enum_value : enum_values) { + int location = p_recursion_depth + ScriptLanguage::LOCATION_OTHER; + ScriptLanguage::CodeCompletionOption option(enum_value.key, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT, location); + r_result.insert(option.display, option); + } } } [[fallthrough]]; @@ -1582,6 +1610,9 @@ static void _find_identifiers(const GDScriptParser::CompletionContext &p_context r_result.insert(option.display, option); } + // Global enums + _find_global_enums(r_result); + // Global classes List global_classes; ScriptServer::get_global_class_list(&global_classes); diff --git a/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.cfg b/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.cfg new file mode 100644 index 00000000000..7c7b465f267 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.cfg @@ -0,0 +1,9 @@ +[output] +include=[ + {"display": "DrawMode", + "location": 256}, + {"display": "Anchor", + "location": 257}, + {"display": "TextureRepeat", + "location": 258}, +] diff --git a/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.gd b/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.gd new file mode 100644 index 00000000000..1cdab92c550 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/builtin_enum/builtin_enum_in_type_hint.gd @@ -0,0 +1,4 @@ +extends Control + +func _ready(): + var t: BaseButton.➡ diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.cfg b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.cfg new file mode 100644 index 00000000000..acbcad30180 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.cfg @@ -0,0 +1,6 @@ +[output] +include=[ + {"display": "Key"}, + {"display": "KeyLocation"}, + {"display": "Error"}, +] diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.gd b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.gd new file mode 100644 index 00000000000..426b41babba --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_identifier.gd @@ -0,0 +1,5 @@ +extends Object + +func test(): + var t = Ke➡ + pass diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.cfg b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.cfg new file mode 100644 index 00000000000..918ba54338c --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.cfg @@ -0,0 +1,6 @@ +[output] +exclude=[ + {"display": "Key"}, + {"display": "KeyLocation"}, + {"display": "Error"}, +] diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.gd b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.gd new file mode 100644 index 00000000000..dee35277dac --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_extends.gd @@ -0,0 +1 @@ +extends Ke➡ diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.cfg b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.cfg new file mode 100644 index 00000000000..acbcad30180 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.cfg @@ -0,0 +1,6 @@ +[output] +include=[ + {"display": "Key"}, + {"display": "KeyLocation"}, + {"display": "Error"}, +] diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.gd b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.gd new file mode 100644 index 00000000000..0d1bf0980d4 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_in_type_hint.gd @@ -0,0 +1,5 @@ +extends Control + +func _ready(): + var t: Ke➡ + pass diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.cfg b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.cfg new file mode 100644 index 00000000000..a265ae44011 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.cfg @@ -0,0 +1,5 @@ +[output] +include=[ + {"display": "KEY_A"}, + {"display": "KEY_B"}, +] diff --git a/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.gd b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.gd new file mode 100644 index 00000000000..972aaa0e635 --- /dev/null +++ b/modules/gdscript/tests/scripts/completion/global_enum/global_enum_values.gd @@ -0,0 +1,5 @@ +extends Control + +func test(): + Key.➡ + pass