diff --git a/pkg/analysis/topology/topology.go b/pkg/analysis/topology/topology.go index e3d2454..8aaa579 100644 --- a/pkg/analysis/topology/topology.go +++ b/pkg/analysis/topology/topology.go @@ -311,9 +311,8 @@ func extractCallSignature(call *ssa.Call) string { case *ssa.Builtin: return fmt.Sprintf("builtin:%s", v.Name()) case *ssa.MakeClosure: - // FIX: Use Safe Type Assertion to avoid panic - if fn, ok := v.Fn.(*ssa.Function); ok && fn != nil { - return fmt.Sprintf("closure:%s", fn.Signature.String()) + if sig := extractClosureSignature(v); sig != "" { + return sig } } @@ -339,9 +338,8 @@ func extractGoSignature(g *ssa.Go) string { case *ssa.Function: return extractFunctionSig(v) case *ssa.MakeClosure: - // FIX: Use Safe Type Assertion - if fn, ok := v.Fn.(*ssa.Function); ok && fn != nil { - return fmt.Sprintf("closure:%s", fn.Signature.String()) + if sig := extractClosureSignature(v); sig != "" { + return sig } } // Fallback for dynamic function pointers @@ -362,9 +360,8 @@ func extractDeferSignature(d *ssa.Defer) string { case *ssa.Function: return extractFunctionSig(v) case *ssa.MakeClosure: - // FIX: Use Safe Type Assertion - if fn, ok := v.Fn.(*ssa.Function); ok && fn != nil { - return fmt.Sprintf("closure:%s", fn.Signature.String()) + if sig := extractClosureSignature(v); sig != "" { + return sig } } if d.Call.Value != nil { @@ -373,6 +370,13 @@ func extractDeferSignature(d *ssa.Defer) string { return "unknown" } +func extractClosureSignature(v *ssa.MakeClosure) string { + if fn, ok := v.Fn.(*ssa.Function); ok && fn != nil { + return fmt.Sprintf("closure:%s", fn.Signature.String()) + } + return "" +} + func extractFunctionSig(fn *ssa.Function) string { // Fix: Detect anonymous/nested functions to provide stable signatures. // This handles optimizations where simple closures become plain Functions.