1
0
mirror of https://github.com/godotengine/godot.git synced 2025-11-05 12:10:55 +00:00

Prefer identifiers annotated type if assigned type is incompatible to it

This commit is contained in:
HolonProduction
2023-11-22 16:39:30 +01:00
parent 107f2961cc
commit 0203b3c310
3 changed files with 39 additions and 22 deletions

View File

@@ -2009,6 +2009,21 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
default:
break;
}
} else {
if (p_context.current_class) {
GDScriptCompletionIdentifier base_identifier;
GDScriptCompletionIdentifier base;
base.value = p_context.base;
base.type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
base.type.kind = GDScriptParser::DataType::CLASS;
base.type.class_type = p_context.current_class;
base.type.is_meta_type = p_context.current_function && p_context.current_function->is_static;
if (_guess_identifier_type_from_base(p_context, base, p_identifier->name, base_identifier)) {
id_type = base_identifier.type;
}
}
}
while (suite) {
@@ -2062,8 +2077,15 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
if (last_assigned_expression && last_assign_line < p_context.current_line) {
GDScriptParser::CompletionContext c = p_context;
c.current_line = last_assign_line;
r_type.assigned_expression = last_assigned_expression;
if (_guess_expression_type(c, last_assigned_expression, r_type)) {
GDScriptCompletionIdentifier assigned_type;
if (_guess_expression_type(c, last_assigned_expression, assigned_type)) {
if (id_type.is_set() && assigned_type.type.is_set() && !GDScriptAnalyzer::check_type_compatibility(id_type, assigned_type.type)) {
// The assigned type is incompatible. The annotated type takes priority.
r_type.assigned_expression = last_assigned_expression;
r_type.type = id_type;
} else {
r_type = assigned_type;
}
return true;
}
}
@@ -2121,20 +2143,6 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
return true;
}
// Check current class (including inheritance).
if (p_context.current_class) {
GDScriptCompletionIdentifier base;
base.value = p_context.base;
base.type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT;
base.type.kind = GDScriptParser::DataType::CLASS;
base.type.class_type = p_context.current_class;
base.type.is_meta_type = p_context.current_function && p_context.current_function->is_static;
if (_guess_identifier_type_from_base(p_context, base, p_identifier->name, r_type)) {
return true;
}
}
// Check global scripts.
if (ScriptServer::is_global_class(p_identifier->name)) {
String script = ScriptServer::get_global_class_path(p_identifier->name);