@@ -3245,6 +3245,26 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
32453245 push_error (vformat (R"( No constructor of "%s" matches the signature "%s".)" , Variant::get_type_name (builtin_type), signature), p_call);
32463246 }
32473247 }
3248+
3249+ #ifdef DEBUG_ENABLED
3250+ // Consider `Signal(self, "my_signal")` as an implicit use of the signal.
3251+ if (builtin_type == Variant::SIGNAL && p_call->arguments .size () >= 2 ) {
3252+ const GDScriptParser::ExpressionNode *object_arg = p_call->arguments [0 ];
3253+ if (object_arg && object_arg->type == GDScriptParser::Node::SELF) {
3254+ const GDScriptParser::ExpressionNode *signal_arg = p_call->arguments [1 ];
3255+ if (signal_arg && signal_arg->is_constant ) {
3256+ const StringName &signal_name = signal_arg->reduced_value ;
3257+ if (parser->current_class ->has_member (signal_name)) {
3258+ const GDScriptParser::ClassNode::Member &member = parser->current_class ->get_member (signal_name);
3259+ if (member.type == GDScriptParser::ClassNode::Member::SIGNAL) {
3260+ member.signal ->usages ++;
3261+ }
3262+ }
3263+ }
3264+ }
3265+ }
3266+ #endif
3267+
32483268 p_call->set_datatype (call_type);
32493269 return ;
32503270 } else if (GDScriptUtilityFunctions::function_exists (function_name)) {
@@ -3479,6 +3499,20 @@ void GDScriptAnalyzer::reduce_call(GDScriptParser::CallNode *p_call, bool p_is_a
34793499
34803500 parser->push_warning (p_call, GDScriptWarning::STATIC_CALLED_ON_INSTANCE, p_call->function_name , caller_type);
34813501 }
3502+
3503+ // Consider `emit_signal()`, `connect()`, and `disconnect()` as implicit uses of the signal.
3504+ 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 ()) {
3505+ const GDScriptParser::ExpressionNode *signal_arg = p_call->arguments [0 ];
3506+ if (signal_arg && signal_arg->is_constant ) {
3507+ const StringName &signal_name = signal_arg->reduced_value ;
3508+ if (parser->current_class ->has_member (signal_name)) {
3509+ const GDScriptParser::ClassNode::Member &member = parser->current_class ->get_member (signal_name);
3510+ if (member.type == GDScriptParser::ClassNode::Member::SIGNAL) {
3511+ member.signal ->usages ++;
3512+ }
3513+ }
3514+ }
3515+ }
34823516#endif // DEBUG_ENABLED
34833517
34843518 call_type = return_type;
0 commit comments