@@ -3113,6 +3113,26 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
31133113 push_error (vformat (R"( No constructor of "%s" matches the signature "%s".)" , Variant::get_type_name (builtin_type), signature), p_call);
31143114 }
31153115 }
3116+
3117+ #ifdef DEBUG_ENABLED
3118+ // Consider `Signal(self, "my_signal")` as an implicit use of the signal.
3119+ if (builtin_type == Variant::SIGNAL && p_call->arguments .size () >= 2 ) {
3120+ const GDScriptParser::ExpressionNode *object_arg = p_call->arguments [0 ];
3121+ if (object_arg && object_arg->type == GDScriptParser::Node::SELF) {
3122+ const GDScriptParser::ExpressionNode *signal_arg = p_call->arguments [1 ];
3123+ if (signal_arg && signal_arg->is_constant ) {
3124+ const StringName &signal_name = signal_arg->reduced_value ;
3125+ if (parser->current_class ->has_member (signal_name)) {
3126+ const GDScriptParser::ClassNode::Member &member = parser->current_class ->get_member (signal_name);
3127+ if (member.type == GDScriptParser::ClassNode::Member::SIGNAL) {
3128+ member.signal ->usages ++;
3129+ }
3130+ }
3131+ }
3132+ }
3133+ }
3134+ #endif
3135+
31163136 p_call->set_datatype (call_type);
31173137 return ;
31183138 } else if (GDScriptUtilityFunctions::function_exists (function_name)) {
@@ -3345,6 +3365,20 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
33453365
33463366 parser->push_warning (p_call, GDScriptWarning::STATIC_CALLED_ON_INSTANCE, p_call->function_name , caller_type);
33473367 }
3368+
3369+ // Consider `emit_signal()`, `connect()`, and `disconnect()` as implicit uses of the signal.
3370+ if (is_self && (p_call->function_name == SNAME (" emit_signal" ) || p_call->function_name == SNAME (" connect" ) || p_call->function_name == SNAME (" disconnect" )) && !p_call->arguments .is_empty ()) {
3371+ const GDScriptParser::ExpressionNode *signal_arg = p_call->arguments [0 ];
3372+ if (signal_arg && signal_arg->is_constant ) {
3373+ const StringName &signal_name = signal_arg->reduced_value ;
3374+ if (parser->current_class ->has_member (signal_name)) {
3375+ const GDScriptParser::ClassNode::Member &member = parser->current_class ->get_member (signal_name);
3376+ if (member.type == GDScriptParser::ClassNode::Member::SIGNAL) {
3377+ member.signal ->usages ++;
3378+ }
3379+ }
3380+ }
3381+ }
33483382#endif // DEBUG_ENABLED
33493383
33503384 call_type = return_type;
0 commit comments