Merge pull request #25014 from vnen/gdscript-fixes
Fix some GDScript issues
This commit is contained in:
commit
b4ec37af2c
|
@ -1181,7 +1181,11 @@ static bool _guess_identifier_type(const GDScriptCompletionContext &p_context, c
|
|||
c.line = op->line;
|
||||
c.block = blk;
|
||||
if (_guess_expression_type(p_context, op->arguments[1], r_type)) {
|
||||
r_type.type.is_meta_type = false;
|
||||
r_type.type.is_meta_type = false; // Right-hand of `is` will be a meta type, but the left-hand value is not
|
||||
// Not an assignment, it shouldn't carry any value
|
||||
r_type.value = Variant();
|
||||
r_type.assigned_expression = NULL;
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,8 +74,14 @@ struct GDScriptDataType {
|
|||
return false;
|
||||
}
|
||||
Object *obj = p_variant.operator Object *();
|
||||
if (obj && !ClassDB::is_parent_class(obj->get_class_name(), native_type)) {
|
||||
return false;
|
||||
if (obj) {
|
||||
if (!ClassDB::is_parent_class(obj->get_class_name(), native_type)) {
|
||||
// Try with underscore prefix
|
||||
StringName underscore_native_type = "_" + native_type;
|
||||
if (!ClassDB::is_parent_class(obj->get_class_name(), underscore_native_type)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
} break;
|
||||
|
|
|
@ -6224,7 +6224,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_node_type(Node *p_node) {
|
|||
if (check_types && index_type.has_type) {
|
||||
if (base_type.kind == DataType::BUILTIN) {
|
||||
// Check if indexing is valid
|
||||
bool error = index_type.kind != DataType::BUILTIN;
|
||||
bool error = index_type.kind != DataType::BUILTIN && base_type.builtin_type != Variant::DICTIONARY;
|
||||
if (!error) {
|
||||
switch (base_type.builtin_type) {
|
||||
// Expect int or real as index
|
||||
|
@ -6767,10 +6767,10 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
|
|||
valid = _get_function_signature(base_type, callee_name, return_type, arg_types,
|
||||
default_args_count, is_static, is_vararg);
|
||||
|
||||
if (valid) {
|
||||
return_type = original_type;
|
||||
return_type.is_meta_type = false;
|
||||
}
|
||||
return_type = original_type;
|
||||
return_type.is_meta_type = false;
|
||||
|
||||
valid = true; // There's always an initializer, we can asume this is true
|
||||
}
|
||||
|
||||
if (!valid) {
|
||||
|
@ -6829,6 +6829,7 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
|
|||
} break;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (!check_types) {
|
||||
return return_type;
|
||||
}
|
||||
|
@ -6854,11 +6855,9 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
|
|||
|
||||
if (!par_type.has_type) {
|
||||
_mark_line_as_unsafe(p_call->line);
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (par_type.may_yield && p_call->arguments[i]->type == Node::TYPE_OPERATOR) {
|
||||
_add_warning(GDScriptWarning::FUNCTION_MAY_YIELD, p_call->line, _find_function_name(static_cast<OperatorNode *>(p_call->arguments[i])));
|
||||
}
|
||||
#endif // DEBUG_ENABLED
|
||||
} else if (!_is_type_compatible(arg_types[i - arg_diff], par_type, true)) {
|
||||
// Supertypes are acceptable for dynamic compliance
|
||||
if (!_is_type_compatible(par_type, arg_types[i - arg_diff])) {
|
||||
|
@ -6871,14 +6870,14 @@ GDScriptParser::DataType GDScriptParser::_reduce_function_call_type(const Operat
|
|||
_mark_line_as_unsafe(p_call->line);
|
||||
}
|
||||
} else {
|
||||
#ifdef DEBUG_ENABLED
|
||||
if (arg_type.kind == DataType::BUILTIN && arg_type.builtin_type == Variant::INT && par_type.kind == DataType::BUILTIN && par_type.builtin_type == Variant::REAL) {
|
||||
_add_warning(GDScriptWarning::NARROWING_CONVERSION, p_call->line, callee_name);
|
||||
}
|
||||
#endif // DEBUG_ENABLED
|
||||
}
|
||||
}
|
||||
|
||||
#endif // DEBUG_ENABLED
|
||||
|
||||
return return_type;
|
||||
}
|
||||
|
||||
|
@ -8110,6 +8109,7 @@ Error GDScriptParser::_parse(const String &p_base_path) {
|
|||
check_types = false;
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
// Resolve all class-level stuff before getting into function blocks
|
||||
_check_class_level_types(main_class);
|
||||
|
||||
|
@ -8124,7 +8124,6 @@ Error GDScriptParser::_parse(const String &p_base_path) {
|
|||
return ERR_PARSE_ERROR;
|
||||
}
|
||||
|
||||
#ifdef DEBUG_ENABLED
|
||||
// Resolve warning ignores
|
||||
Vector<Pair<int, String> > warning_skips = tokenizer->get_warning_skips();
|
||||
bool warning_is_error = GLOBAL_GET("debug/gdscript/warnings/treat_warnings_as_errors").booleanize();
|
||||
|
|
Loading…
Reference in New Issue