mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
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:
commit
8acc596bcf
4 changed files with 8 additions and 2 deletions
|
@ -4437,6 +4437,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
|
|||
case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE:
|
||||
case GDScriptParser::IdentifierNode::MEMBER_FUNCTION:
|
||||
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
|
||||
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -4507,6 +4508,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
|
|||
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
|
||||
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
|
||||
case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
|
||||
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
|
||||
return; // No need to capture.
|
||||
}
|
||||
|
||||
|
@ -4539,6 +4541,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
|
|||
}
|
||||
|
||||
if (class_exists(name)) {
|
||||
p_identifier->source = GDScriptParser::IdentifierNode::NATIVE_CLASS;
|
||||
p_identifier->set_datatype(make_native_meta_type(name));
|
||||
return;
|
||||
}
|
||||
|
@ -5990,7 +5993,7 @@ void GDScriptAnalyzer::is_shadowing(GDScriptParser::IdentifierNode *p_identifier
|
|||
if (Variant::has_utility_function(name)) {
|
||||
parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function");
|
||||
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");
|
||||
return;
|
||||
} else if (ScriptServer::is_global_class(name)) {
|
||||
|
|
|
@ -413,6 +413,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
|
|||
} break;
|
||||
|
||||
// GLOBALS.
|
||||
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
|
||||
case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE: {
|
||||
// Try globals.
|
||||
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) {
|
||||
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") &&
|
||||
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.
|
||||
StringName class_name = static_cast<GDScriptParser::IdentifierNode *>(subscript->base)->name;
|
||||
MethodBind *method = ClassDB::get_method(class_name, subscript->attribute->name);
|
||||
|
|
|
@ -2287,6 +2287,7 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
|
|||
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
|
||||
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
|
||||
case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
|
||||
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
|
||||
can_be_local = false;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -904,6 +904,7 @@ public:
|
|||
MEMBER_CLASS,
|
||||
INHERITED_VARIABLE,
|
||||
STATIC_VARIABLE,
|
||||
NATIVE_CLASS,
|
||||
};
|
||||
Source source = UNDEFINED_SOURCE;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue