summaryrefslogtreecommitdiffstats
path: root/modules/gdscript/gdscript_editor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'modules/gdscript/gdscript_editor.cpp')
-rw-r--r--modules/gdscript/gdscript_editor.cpp33
1 files changed, 29 insertions, 4 deletions
diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp
index 822fc412b4..a6fd3f94da 100644
--- a/modules/gdscript/gdscript_editor.cpp
+++ b/modules/gdscript/gdscript_editor.cpp
@@ -3303,11 +3303,36 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
case GDScriptParser::COMPLETION_SUBSCRIPT: {
const GDScriptParser::SubscriptNode *subscript = static_cast<const GDScriptParser::SubscriptNode *>(completion_context.node);
GDScriptCompletionIdentifier base;
- if (!_guess_expression_type(completion_context, subscript->base, base)) {
- break;
- }
+ const bool res = _guess_expression_type(completion_context, subscript->base, base);
+
+ // If the type is not known, we assume it is BUILTIN, since indices on arrays is the most common use case.
+ if (!subscript->is_attribute && (!res || base.type.kind == GDScriptParser::DataType::BUILTIN || base.type.is_variant())) {
+ if (base.value.get_type() == Variant::DICTIONARY) {
+ List<PropertyInfo> members;
+ base.value.get_property_list(&members);
- _find_identifiers_in_base(base, false, false, options, 0);
+ for (const PropertyInfo &E : members) {
+ ScriptLanguage::CodeCompletionOption option(E.name.quote(quote_style), ScriptLanguage::CODE_COMPLETION_KIND_MEMBER, ScriptLanguage::LOCATION_LOCAL);
+ options.insert(option.display, option);
+ }
+ }
+ if (!subscript->index || subscript->index->type != GDScriptParser::Node::LITERAL) {
+ _find_identifiers(completion_context, false, options, 0);
+ }
+ } else if (res) {
+ if (!subscript->is_attribute) {
+ // Quote the options if they are not accessed as attribute.
+
+ HashMap<String, ScriptLanguage::CodeCompletionOption> opt;
+ _find_identifiers_in_base(base, false, false, opt, 0);
+ for (const KeyValue<String, CodeCompletionOption> &E : opt) {
+ ScriptLanguage::CodeCompletionOption option(E.value.insert_text.quote(quote_style), E.value.kind, E.value.location);
+ options.insert(option.display, option);
+ }
+ } else {
+ _find_identifiers_in_base(base, false, false, options, 0);
+ }
+ }
} break;
case GDScriptParser::COMPLETION_TYPE_ATTRIBUTE: {
if (!completion_context.current_class) {