mirror of
https://github.com/godotengine/godot.git
synced 2024-11-21 03:18:37 +08:00
Merge pull request #24223 from vnen/gdscript-better-type-compatible
Fix type-compatibilty check in GDScript
This commit is contained in:
commit
a3ffc8bc20
@ -5746,18 +5746,23 @@ bool GDScriptParser::_is_type_compatible(const DataType &p_container, const Data
|
||||
if (p_container.kind == DataType::BUILTIN && p_expression.kind == DataType::BUILTIN) {
|
||||
bool valid = p_container.builtin_type == p_expression.builtin_type;
|
||||
if (p_allow_implicit_conversion) {
|
||||
valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::REAL);
|
||||
valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::INT);
|
||||
valid = valid || (p_container.builtin_type == Variant::STRING && p_expression.builtin_type == Variant::NODE_PATH);
|
||||
valid = valid || (p_container.builtin_type == Variant::NODE_PATH && p_expression.builtin_type == Variant::STRING);
|
||||
valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::REAL);
|
||||
valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::INT);
|
||||
valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::BOOL);
|
||||
valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::BOOL);
|
||||
valid = valid || Variant::can_convert_strict(p_expression.builtin_type, p_container.builtin_type);
|
||||
}
|
||||
return valid;
|
||||
}
|
||||
|
||||
if (p_container.kind == DataType::BUILTIN && p_container.builtin_type == Variant::OBJECT) {
|
||||
// Object built-in is a special case, it's compatible with any object and with null
|
||||
if (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type == Variant::NIL) {
|
||||
return true;
|
||||
}
|
||||
if (p_expression.kind == DataType::BUILTIN) {
|
||||
return false;
|
||||
}
|
||||
// If it's not a built-in, must be an object
|
||||
return true;
|
||||
}
|
||||
|
||||
if (p_container.kind == DataType::BUILTIN || (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type != Variant::NIL)) {
|
||||
// Can't mix built-ins with objects
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user