GDScript: enable type checks on release mode

Also make builtin GDScript functions report return type as Variant in
release so type is converted when needed.
This commit is contained in:
George Marques 2020-01-08 12:22:41 -03:00
parent ae21664655
commit d26414f9fe
No known key found for this signature in database
GPG key ID: 046BD46A3201E43D
3 changed files with 38 additions and 9 deletions

View file

@ -8191,11 +8191,14 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
if (lh_type.has_type && rh_type.may_yield && op->arguments[1]->type == Node::TYPE_OPERATOR) {
_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, op->line, _find_function_name(static_cast<OperatorNode *>(op->arguments[1])));
}
#endif // DEBUG_ENABLED
bool type_match = check_types;
#endif // DEBUG_ENABLED
if (check_types && !_is_type_compatible(lh_type, rh_type)) {
#ifdef DEBUG_ENABLED
type_match = false;
#endif // DEBUG_ENABLED
// Try supertype test
if (_is_type_compatible(rh_type, lh_type)) {
_mark_line_as_unsafe(op->line);
@ -8226,7 +8229,9 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
op->arguments.write[1] = convert_call;
#ifdef DEBUG_ENABLED
type_match = true; // Since we are converting, the type is matching
#endif // DEBUG_ENABLED
}
#ifdef DEBUG_ENABLED
if (lh_type.builtin_type == Variant::INT && rh_type.builtin_type == Variant::REAL) {
@ -8239,8 +8244,10 @@ void GDScriptParser::_check_block_types(BlockNode *p_block) {
if (!rh_type.has_type && (op->op != OperatorNode::OP_ASSIGN || lh_type.has_type || op->arguments[0]->type == Node::TYPE_OPERATOR)) {
_mark_line_as_unsafe(op->line);
}
#endif // DEBUG_ENABLED
op->datatype.has_type = type_match;
#else
op->datatype.has_type = false;
#endif // DEBUG_ENABLED
} break;
case OperatorNode::OP_CALL:
case OperatorNode::OP_PARENT_CALL: {
@ -8483,11 +8490,8 @@ Error GDScriptParser::_parse(const String &p_base_path) {
current_class = main_class;
current_function = NULL;
current_block = NULL;
#ifdef DEBUG_ENABLED
if (for_completion) check_types = false;
#else
check_types = false;
#endif
// Resolve all class-level stuff before getting into function blocks
_check_class_level_types(main_class);