You've already forked godot
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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user