Skip to content

Commit 38f8643

Browse files
committed
GDScript: Properly detect native class on static call optimization
1 parent e0603ae commit 38f8643

File tree

4 files changed

+8
-2
lines changed

4 files changed

+8
-2
lines changed

modules/gdscript/gdscript_analyzer.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4437,6 +4437,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
44374437
case GDScriptParser::IdentifierNode::UNDEFINED_SOURCE:
44384438
case GDScriptParser::IdentifierNode::MEMBER_FUNCTION:
44394439
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
4440+
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
44404441
break;
44414442
}
44424443

@@ -4507,6 +4508,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45074508
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
45084509
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
45094510
case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
4511+
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
45104512
return; // No need to capture.
45114513
}
45124514

@@ -4539,6 +4541,7 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident
45394541
}
45404542

45414543
if (class_exists(name)) {
4544+
p_identifier->source = GDScriptParser::IdentifierNode::NATIVE_CLASS;
45424545
p_identifier->set_datatype(make_native_meta_type(name));
45434546
return;
45444547
}
@@ -5990,7 +5993,7 @@ void GDScriptAnalyzer::is_shadowing(GDScriptParser::IdentifierNode *p_identifier
59905993
if (Variant::has_utility_function(name)) {
59915994
parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "built-in function");
59925995
return;
5993-
} else if (ClassDB::class_exists(name)) {
5996+
} else if (class_exists(name)) {
59945997
parser->push_warning(p_identifier, GDScriptWarning::SHADOWED_GLOBAL_IDENTIFIER, p_context, name, "native class");
59955998
return;
59965999
} else if (ScriptServer::is_global_class(name)) {

modules/gdscript/gdscript_compiler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,6 +413,7 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_expression(CodeGen &code
413413
} break;
414414

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

modules/gdscript/gdscript_editor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,6 +2277,7 @@ static bool _guess_identifier_type(GDScriptParser::CompletionContext &p_context,
22772277
case GDScriptParser::IdentifierNode::MEMBER_CLASS:
22782278
case GDScriptParser::IdentifierNode::INHERITED_VARIABLE:
22792279
case GDScriptParser::IdentifierNode::STATIC_VARIABLE:
2280+
case GDScriptParser::IdentifierNode::NATIVE_CLASS:
22802281
can_be_local = false;
22812282
break;
22822283
default:

modules/gdscript/gdscript_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -904,6 +904,7 @@ class GDScriptParser {
904904
MEMBER_CLASS,
905905
INHERITED_VARIABLE,
906906
STATIC_VARIABLE,
907+
NATIVE_CLASS,
907908
};
908909
Source source = UNDEFINED_SOURCE;
909910

0 commit comments

Comments
 (0)