GDScript: Don't coerce default values to the export hint type

This behavior is inconsistent with non tools builds and can create
issues. Instead, a warning is emitted if there's a type mismatch. If the
type can't be converted, an error is shown instead.

For the editor it gives a converted value to avoid issues with the
property editor, which expects the correct type.
This commit is contained in:
George Marques 2022-03-02 10:55:46 -03:00
parent a76316c0f0
commit f2166ba92f
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D
4 changed files with 28 additions and 7 deletions

View file

@ -450,7 +450,19 @@ bool GDScript::_update_exports(bool *r_err, bool p_recursive_call, PlaceHolderSc
}
members_cache.push_back(c->variables[i]._export);
member_default_values_cache[c->variables[i].identifier] = c->variables[i].default_value;
Variant::Type default_value_type = c->variables[i].default_value.get_type();
Variant::Type export_type = c->variables[i]._export.type;
// Convert the default value to the export type to avoid issues with the property editor and scene serialization.
// This is done only in the export side, the script itself will use the default value with no type change.
if (default_value_type != Variant::NIL && default_value_type != export_type) {
Variant::CallError ce;
const Variant *args = &c->variables[i].default_value;
member_default_values_cache[c->variables[i].identifier] = Variant::construct(export_type, &args, 1, ce);
} else {
member_default_values_cache[c->variables[i].identifier] = c->variables[i].default_value;
}
}
_signals.clear();
@ -2014,6 +2026,10 @@ String GDScriptWarning::get_message() const {
case STANDALONE_TERNARY: {
return "Standalone ternary conditional operator: the return value is being discarded.";
}
case EXPORT_HINT_TYPE_MISTMATCH: {
CHECK_SYMBOLS(2);
return vformat("The type of the default value (%s) doesn't match the type of the export hint (%s). The type won't be coerced.", symbols[0], symbols[1]);
}
case WARNING_MAX:
break; // Can't happen, but silences warning
}
@ -2057,6 +2073,7 @@ String GDScriptWarning::get_name_from_code(Code p_code) {
"UNSAFE_CALL_ARGUMENT",
"DEPRECATED_KEYWORD",
"STANDALONE_TERNARY",
"EXPORT_HINT_TYPE_MISTMATCH",
nullptr
};