Merge pull request #108944 from vnen/gdscript-fix-static-call-fail-when-shadowing

Properly detect native class on static call optimization
This commit is contained in:
Thaddeus Crews 2025-07-25 11:08:14 -05:00
commit 8acc596bcf
No known key found for this signature in database
GPG key ID: 8C6E5FEB5FC03CCC
4 changed files with 8 additions and 2 deletions

View file

@ -4437,6 +4437,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE: case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE:
case GDScriptParser::IdentifierNode::MEMBER_FUNCTION: case GDScriptParser::IdentifierNode::MEMBER_FUNCTION:
case GDScriptParser::IdentifierNode::MEMBER_CLASS: case GDScriptParser::IdentifierNode::MEMBER_CLASS:
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
break; break;
} }
@ -4507,6 +4508,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
case GDScriptParser::IdentifierNode::MEMBER_CLASS: case GDScriptParser::IdentifierNode::MEMBER_CLASS:
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE: case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
case GDScriptParser::IdentifierNode::STATIC_VARIABLE: case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
return; // No need to capture. return; // No need to capture.
} }
@ -4539,6 +4541,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
} }
if (class_exists(name)) { if (class_exists(name)) {
p_identifier->source = GDScriptParser::IdentifierNode::NATIVE_CLASS;
p_identifier->set_datatype(make_native_meta_type(name)); p_identifier->set_datatype(make_native_meta_type(name));
return; return;
} }
@ -5990,7 +5993,7 @@ void GDScriptAnalyzer::is_shadowing(GDScriptParser::IdentifierNode *p_identifier
if (Variant::has_utility_function(name)) { if (Variant::has_utility_function(name)) {
parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function"); parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function");
return; return;
} else if (ClassDB::class_exists(name)) { } else if (class_exists(name)) {
parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "native class"); parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "native class");
return; return;
} else if (ScriptServer::is_global_class(name)) { } else if (ScriptServer::is_global_class(name)) {

View file

@ -413,6 +413,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
} break; } break;
// GLOBALS. // GLOBALS.
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE: { case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE: {
// Try globals. // Try globals.
if (GDScriptLanguage::get_singleton()->get_global_map().has(identifier)) { if (GDScriptLanguage::get_singleton()->get_global_map().has(identifier)) {
@ -673,7 +674,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
if (!call->is_super && subscript->base->type == GDScriptParser::Node::IDENTIFIER && GDScriptParser::get_builtin_type(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name) < Variant::VARIANT_MAX) { if (!call->is_super && subscript->base->type == GDScriptParser::Node::IDENTIFIER && GDScriptParser::get_builtin_type(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name) < Variant::VARIANT_MAX) {
gen->write_call_builtin_type_static(result, GDScriptParser::get_builtin_type(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name), subscript->attribute->name, arguments); gen->write_call_builtin_type_static(result, GDScriptParser::get_builtin_type(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name), subscript->attribute->name, arguments);
} else if (!call->is_super && subscript->base->type == GDScriptParser::Node::IDENTIFIER && call->function_name != SNAME("new") && } else if (!call->is_super && subscript->base->type == GDScriptParser::Node::IDENTIFIER && call->function_name != SNAME("new") &&
ClassDB::class_exists(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name) && !Engine::get_singleton()->has_singleton(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name)) { static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->source == GDScriptParser::IdentifierNode::NATIVE_CLASS && !Engine::get_singleton()->has_singleton(static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name)) {
// It's a static native method call. // It's a static native method call.
StringName class_name = static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name; StringName class_name = static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name;
MethodBind *method = ClassDB::get_method(class_name, subscript->attribute->name); MethodBind *method = ClassDB::get_method(class_name, subscript->attribute->name);

View file

@ -2287,6 +2287,7 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
case GDScriptParser::IdentifierNode::MEMBER_CLASS: case GDScriptParser::IdentifierNode::MEMBER_CLASS:
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE: case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
case GDScriptParser::IdentifierNode::STATIC_VARIABLE: case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
can_be_local = false; can_be_local = false;
break; break;
default: default:

View file

@ -904,6 +904,7 @@ public:
MEMBER_CLASS, MEMBER_CLASS,
INHERITED_VARIABLE, INHERITED_VARIABLE,
STATIC_VARIABLE, STATIC_VARIABLE,
NATIVE_CLASS,
}; };
Source source = UNDEFINED_SOURCE; Source source = UNDEFINED_SOURCE;