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

Implement iterator variable typing in GDScript

This commit is contained in:
Pedro J. Estébanez
2021-08-14 05:44:22 +02:00
parent 0a001afec5
commit d72f12a561
3 changed files with 57 additions and 4 deletions

View File

@@ -1089,12 +1089,28 @@ void GDScriptAnalyzer::resolve_for(GDScriptParser::ForNode *p_for) {
}
}
if (!list_resolved) {
GDScriptParser::DataType variable_type;
if (list_resolved) {
variable_type.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED;
variable_type.kind = GDScriptParser::DataType::BUILTIN;
variable_type.builtin_type = Variant::INT; // Can this ever be a float or something else?
p_for->variable->set_datatype(variable_type);
} else {
resolve_node(p_for->list);
if (p_for->list->datatype.has_container_element_type()) {
variable_type = p_for->list->datatype.get_container_element_type();
variable_type.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED;
} else if (p_for->list->datatype.is_typed_container_type()) {
variable_type = p_for->list->datatype.get_typed_container_type();
variable_type.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED;
} else {
// Last resort
// TODO: Must other cases be handled? Must we mark as unsafe?
variable_type.type_source = GDScriptParser::DataType::UNDETECTED;
variable_type.kind = GDScriptParser::DataType::VARIANT;
}
}
// TODO: If list is a typed array, the variable should be an element.
// Also applicable for constant range() (so variable is int or float).
p_for->variable->set_datatype(variable_type);
resolve_suite(p_for->loop);
p_for->set_datatype(p_for->loop->get_datatype());