Fix type-compatibilty check in GDScript

Objects and PoolArrays are properly tested for conversion.
This commit is contained in:
George Marques 2018-12-07 23:53:45 -02:00
parent 41d1dba35f
commit 74a3bf72f0
No known key found for this signature in database
GPG Key ID: 046BD46A3201E43D
1 changed files with 13 additions and 8 deletions

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;