You've already forked godot
mirror of
https://github.com/godotengine/godot.git
synced 2025-11-23 15:16:17 +00:00
Implement iterator variable typing in GDScript
This commit is contained in:
@@ -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);
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
p_for->variable->set_datatype(variable_type);
|
||||||
// TODO: If list is a typed array, the variable should be an element.
|
|
||||||
// Also applicable for constant range() (so variable is int or float).
|
|
||||||
|
|
||||||
resolve_suite(p_for->loop);
|
resolve_suite(p_for->loop);
|
||||||
p_for->set_datatype(p_for->loop->get_datatype());
|
p_for->set_datatype(p_for->loop->get_datatype());
|
||||||
|
|||||||
@@ -3540,6 +3540,39 @@ String GDScriptParser::DataType::to_string() const {
|
|||||||
ERR_FAIL_V_MSG("<unresolved type", "Kind set outside the enum range.");
|
ERR_FAIL_V_MSG("<unresolved type", "Kind set outside the enum range.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Variant::Type _variant_type_to_typed_array_element_type(Variant::Type p_type) {
|
||||||
|
switch (p_type) {
|
||||||
|
case Variant::PACKED_BYTE_ARRAY:
|
||||||
|
case Variant::PACKED_INT32_ARRAY:
|
||||||
|
case Variant::PACKED_INT64_ARRAY:
|
||||||
|
return Variant::INT;
|
||||||
|
case Variant::PACKED_FLOAT32_ARRAY:
|
||||||
|
case Variant::PACKED_FLOAT64_ARRAY:
|
||||||
|
return Variant::FLOAT;
|
||||||
|
case Variant::PACKED_STRING_ARRAY:
|
||||||
|
return Variant::STRING;
|
||||||
|
case Variant::PACKED_VECTOR2_ARRAY:
|
||||||
|
return Variant::VECTOR2;
|
||||||
|
case Variant::PACKED_VECTOR3_ARRAY:
|
||||||
|
return Variant::VECTOR3;
|
||||||
|
case Variant::PACKED_COLOR_ARRAY:
|
||||||
|
return Variant::COLOR;
|
||||||
|
default:
|
||||||
|
return Variant::NIL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool GDScriptParser::DataType::is_typed_container_type() const {
|
||||||
|
return kind == GDScriptParser::DataType::BUILTIN && _variant_type_to_typed_array_element_type(builtin_type) != Variant::NIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
GDScriptParser::DataType GDScriptParser::DataType::get_typed_container_type() const {
|
||||||
|
GDScriptParser::DataType type;
|
||||||
|
type.kind = GDScriptParser::DataType::BUILTIN;
|
||||||
|
type.builtin_type = _variant_type_to_typed_array_element_type(builtin_type);
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
/*---------- PRETTY PRINT FOR DEBUG ----------*/
|
/*---------- PRETTY PRINT FOR DEBUG ----------*/
|
||||||
|
|
||||||
#ifdef DEBUG_ENABLED
|
#ifdef DEBUG_ENABLED
|
||||||
|
|||||||
@@ -161,6 +161,10 @@ public:
|
|||||||
container_element_type = nullptr;
|
container_element_type = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_typed_container_type() const;
|
||||||
|
|
||||||
|
GDScriptParser::DataType get_typed_container_type() const;
|
||||||
|
|
||||||
bool operator==(const DataType &p_other) const {
|
bool operator==(const DataType &p_other) const {
|
||||||
if (type_source == UNDETECTED || p_other.type_source == UNDETECTED) {
|
if (type_source == UNDETECTED || p_other.type_source == UNDETECTED) {
|
||||||
return true; // Can be consireded equal for parsing purposes.
|
return true; // Can be consireded equal for parsing purposes.
|
||||||
|
|||||||
Reference in New Issue
Block a user