Skip to content

Commit 38d8ca0

Browse files
committed
Merge pull request #85703 from TitanNano/jovan/gdscript_foreign_script_properties
Make GDScriptAnalyzer aware of properties from other languages
2 parents ead01d0 + 030aa41 commit 38d8ca0

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

modules/gdscript/gdscript_analyzer.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3777,6 +3777,60 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod
37773777
}
37783778
}
37793779

3780+
// Check non-GDScript scripts.
3781+
Ref<Script> script_type = base.script_type;
3782+
3783+
if (base_class == nullptr && script_type.is_valid()) {
3784+
List<PropertyInfo> property_list;
3785+
script_type->get_script_property_list(&property_list);
3786+
3787+
for (const PropertyInfo &property_info : property_list) {
3788+
if (property_info.name != p_identifier->name) {
3789+
continue;
3790+
}
3791+
3792+
const GDScriptParser::DataType property_type = GDScriptAnalyzer::type_from_property(property_info, false, false);
3793+
3794+
p_identifier->set_datatype(property_type);
3795+
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_VARIABLE;
3796+
return;
3797+
}
3798+
3799+
MethodInfo method_info = script_type->get_method_info(p_identifier->name);
3800+
3801+
if (method_info.name == p_identifier->name) {
3802+
p_identifier->set_datatype(make_callable_type(method_info));
3803+
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_FUNCTION;
3804+
return;
3805+
}
3806+
3807+
List<MethodInfo> signal_list;
3808+
script_type->get_script_signal_list(&signal_list);
3809+
3810+
for (const MethodInfo &signal_info : signal_list) {
3811+
if (signal_info.name != p_identifier->name) {
3812+
continue;
3813+
}
3814+
3815+
const GDScriptParser::DataType signal_type = make_signal_type(signal_info);
3816+
3817+
p_identifier->set_datatype(signal_type);
3818+
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_SIGNAL;
3819+
return;
3820+
}
3821+
3822+
HashMap<StringName, Variant> constant_map;
3823+
script_type->get_constants(&constant_map);
3824+
3825+
if (constant_map.has(p_identifier->name)) {
3826+
Variant constant = constant_map.get(p_identifier->name);
3827+
3828+
p_identifier->set_datatype(make_builtin_meta_type(constant.get_type()));
3829+
p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT;
3830+
return;
3831+
}
3832+
}
3833+
37803834
// Check native members. No need for native class recursion because Node exposes all Object's properties.
37813835
const StringName &native = base.native_type;
37823836

0 commit comments

Comments
 (0)