Merge pull request #24223 from vnen/gdscript-better-type-compatible

Fix type-compatibilty check in GDScript
This commit is contained in:
Rémi Verschelde 2018-12-09 11:41:00 +01:00 committed by GitHub
commit a3ffc8bc20
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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;