Skip to content

Commit

Permalink
Improve autocompletion for indices
Browse files Browse the repository at this point in the history
(cherry picked from commit ccbdb34)
  • Loading branch information
HolonProduction authored and Spartan322 committed Feb 4, 2025
1 parent 127d86a commit d50480f
Showing 1 changed file with 29 additions and 4 deletions.
33 changes: 29 additions & 4 deletions modules/gdscript/gdscript_editor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3322,11 +3322,36 @@ ::Error GDScriptLanguage::complete_code(const String &p_code, const String &p_pa
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) {
Expand Down

0 comments on commit d50480f

Please sign in to comment.