mirror of
https://github.com/godotengine/godot.git
synced 2025-11-01 14:11:15 +00:00
Fix autocompletion of static methods in built-in types in GDScript
This commit is contained in:
parent
118f29694b
commit
0584387918
3 changed files with 73 additions and 18 deletions
|
|
@ -2397,7 +2397,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
|
|||
r_arghint = _make_arguments_hint(info, p_argidx);
|
||||
return;
|
||||
} else if (GDScriptParser::get_builtin_type(call->function_name) < Variant::VARIANT_MAX) {
|
||||
// Complete constructor
|
||||
// Complete constructor.
|
||||
List<MethodInfo> constructors;
|
||||
Variant::get_constructor_list(GDScriptParser::get_builtin_type(call->function_name), &constructors);
|
||||
|
||||
|
|
@ -2423,6 +2423,32 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
|
|||
} else if (callee_type == GDScriptParser::Node::SUBSCRIPT) {
|
||||
const GDScriptParser::SubscriptNode *subscript = static_cast<const GDScriptParser::SubscriptNode *>(call->callee);
|
||||
|
||||
if (subscript->base != nullptr && subscript->base->type == GDScriptParser::Node::IDENTIFIER) {
|
||||
const GDScriptParser::IdentifierNode *base_identifier = static_cast<const GDScriptParser::IdentifierNode *>(subscript->base);
|
||||
|
||||
Variant::Type method_type = GDScriptParser::get_builtin_type(base_identifier->name);
|
||||
if (method_type < Variant::VARIANT_MAX) {
|
||||
Variant v;
|
||||
Callable::CallError err;
|
||||
Variant::construct(method_type, v, nullptr, 0, err);
|
||||
if (err.error != Callable::CallError::CALL_OK) {
|
||||
return;
|
||||
}
|
||||
List<MethodInfo> methods;
|
||||
v.get_method_list(&methods);
|
||||
|
||||
for (MethodInfo &E : methods) {
|
||||
if (p_argidx >= E.arguments.size()) {
|
||||
continue;
|
||||
}
|
||||
if (E.name == call->function_name) {
|
||||
r_arghint += _make_arguments_hint(E, p_argidx);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (subscript->is_attribute) {
|
||||
GDScriptCompletionIdentifier ci;
|
||||
if (_guess_expression_type(p_context, subscript->base, ci)) {
|
||||
|
|
@ -2485,17 +2511,36 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c
|
|||
_find_annotation_arguments(annotation, completion_context.current_argument, quote_style, options);
|
||||
r_forced = true;
|
||||
} break;
|
||||
case GDScriptParser::COMPLETION_BUILT_IN_TYPE_CONSTANT: {
|
||||
List<StringName> constants;
|
||||
Variant::get_constants_for_type(completion_context.builtin_type, &constants);
|
||||
for (const StringName &E : constants) {
|
||||
ScriptLanguage::CodeCompletionOption option(E, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT);
|
||||
bool valid = false;
|
||||
Variant default_value = Variant::get_constant_value(completion_context.builtin_type, E, &valid);
|
||||
if (valid) {
|
||||
option.default_value = default_value;
|
||||
case GDScriptParser::COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD: {
|
||||
// Constants.
|
||||
{
|
||||
List<StringName> constants;
|
||||
Variant::get_constants_for_type(completion_context.builtin_type, &constants);
|
||||
for (const StringName &E : constants) {
|
||||
ScriptLanguage::CodeCompletionOption option(E, ScriptLanguage::CODE_COMPLETION_KIND_CONSTANT);
|
||||
bool valid = false;
|
||||
Variant default_value = Variant::get_constant_value(completion_context.builtin_type, E, &valid);
|
||||
if (valid) {
|
||||
option.default_value = default_value;
|
||||
}
|
||||
options.insert(option.display, option);
|
||||
}
|
||||
}
|
||||
// Methods.
|
||||
{
|
||||
List<StringName> methods;
|
||||
Variant::get_builtin_method_list(completion_context.builtin_type, &methods);
|
||||
for (const StringName &E : methods) {
|
||||
if (Variant::is_builtin_method_static(completion_context.builtin_type, E)) {
|
||||
ScriptLanguage::CodeCompletionOption option(E, ScriptLanguage::CODE_COMPLETION_KIND_FUNCTION);
|
||||
if (Variant::get_builtin_method_argument_count(completion_context.builtin_type, E) > 0 || Variant::is_builtin_method_vararg(completion_context.builtin_type, E)) {
|
||||
option.insert_text += "(";
|
||||
} else {
|
||||
option.insert_text += "()";
|
||||
}
|
||||
options.insert(option.display, option);
|
||||
}
|
||||
}
|
||||
options.insert(option.display, option);
|
||||
}
|
||||
} break;
|
||||
case GDScriptParser::COMPLETION_INHERIT_TYPE: {
|
||||
|
|
@ -3049,11 +3094,21 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co
|
|||
bool is_function = false;
|
||||
|
||||
switch (context.type) {
|
||||
case GDScriptParser::COMPLETION_BUILT_IN_TYPE_CONSTANT: {
|
||||
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT;
|
||||
r_result.class_name = Variant::get_type_name(context.builtin_type);
|
||||
r_result.class_member = p_symbol;
|
||||
return OK;
|
||||
case GDScriptParser::COMPLETION_BUILT_IN_TYPE_CONSTANT_OR_STATIC_METHOD: {
|
||||
if (!Variant::has_builtin_method(context.builtin_type, StringName(p_symbol))) {
|
||||
// A constant.
|
||||
r_result.type = ScriptLanguage::LOOKUP_RESULT_CLASS_CONSTANT;
|
||||
r_result.class_name = Variant::get_type_name(context.builtin_type);
|
||||
r_result.class_member = p_symbol;
|
||||
return OK;
|
||||
}
|
||||
// A method.
|
||||
GDScriptParser::DataType base_type;
|
||||
base_type.kind = GDScriptParser::DataType::BUILTIN;
|
||||
base_type.builtin_type = context.builtin_type;
|
||||
if (_lookup_symbol_from_base(base_type, p_symbol, true, r_result) == OK) {
|
||||
return OK;
|
||||
}
|
||||
} break;
|
||||
case GDScriptParser::COMPLETION_SUPER_METHOD:
|
||||
case GDScriptParser::COMPLETION_METHOD: {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue