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::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)) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue