Merge pull request #52785 from vnen/gdscript-fix-inference-eagerness

This commit is contained in:
Rémi Verschelde 2021-09-17 17:20:33 +02:00 committed by GitHub
commit 4d61cb9c35
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 27 additions and 3 deletions

View File

@ -1767,6 +1767,15 @@ void GDScriptAnalyzer::reduce_assignment(GDScriptParser::AssignmentNode *p_assig
identifier->variable_source->set_datatype(id_type); identifier->variable_source->set_datatype(id_type);
} }
} break; } break;
case GDScriptParser::IdentifierNode::FUNCTION_PARAMETER: {
GDScriptParser::DataType id_type = identifier->parameter_source->get_datatype();
if (!id_type.is_hard_type()) {
id_type = assigned_value_type;
id_type.type_source = GDScriptParser::DataType::INFERRED;
id_type.is_constant = false;
identifier->parameter_source->set_datatype(id_type);
}
} break;
case GDScriptParser::IdentifierNode::LOCAL_VARIABLE: { case GDScriptParser::IdentifierNode::LOCAL_VARIABLE: {
GDScriptParser::DataType id_type = identifier->variable_source->get_datatype(); GDScriptParser::DataType id_type = identifier->variable_source->get_datatype();
if (!id_type.is_hard_type()) { if (!id_type.is_hard_type()) {
@ -2428,13 +2437,15 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
p_identifier->is_constant = true; p_identifier->is_constant = true;
p_identifier->reduced_value = result; p_identifier->reduced_value = result;
p_identifier->set_datatype(type_from_variant(result, p_identifier)); p_identifier->set_datatype(type_from_variant(result, p_identifier));
} else { } else if (base.is_hard_type()) {
push_error(vformat(R"(Cannot find constant "%s" on type "%s".)", name, base.to_string()), p_identifier); push_error(vformat(R"(Cannot find constant "%s" on type "%s".)", name, base.to_string()), p_identifier);
} }
} else { } else {
switch (base.builtin_type) { switch (base.builtin_type) {
case Variant::NIL: { case Variant::NIL: {
push_error(vformat(R"(Invalid get index "%s" on base Nil)", name), p_identifier); if (base.is_hard_type()) {
push_error(vformat(R"(Invalid get index "%s" on base Nil)", name), p_identifier);
}
return; return;
} }
case Variant::DICTIONARY: { case Variant::DICTIONARY: {
@ -2455,7 +2466,9 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
return; return;
} }
} }
push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier); if (base.is_hard_type()) {
push_error(vformat(R"(Cannot find property "%s" on base "%s".)", name, base.to_string()), p_identifier);
}
} }
} }
} }

View File

@ -0,0 +1,9 @@
func inferred_parameter(param = null):
if param == null:
param = Node.new()
param.name = "Ok"
print(param.name)
param.free()
func test():
inferred_parameter()

View File

@ -0,0 +1,2 @@
GDTEST_OK
Ok