A Result holds the results of Rapid Type Analysis, which includes the set of reachable functions/methods, runtime types, and the call graph.
type Result struct { // CallGraph is the discovered callgraph. // It does not include edges for calls made via reflection. CallGraph *callgraph.Graph // Reachable contains the set of reachable functions and methods. // This includes exported methods of runtime types, since // they may be accessed via reflection. // The value indicates whether the function is address-taken. // // (We wrap the bool in a struct to avoid inadvertent use of // "if Reachable[f] {" to test for set membership.) Reachable map[*ssa.Function]struct{ AddrTaken bool } // RuntimeTypes contains the set of types that are needed at // runtime, for interfaces or reflection. // // The value indicates whether the type is inaccessible to reflection. // Consider: // type A struct{B} // fmt.Println(new(A)) // Types *A, A and B are accessible to reflection, but the unnamed // type struct{B} is not. RuntimeTypes typeutil.Map }
func Analyze(roots []*ssa.Function, buildCallGraph bool) *Result
Analyze performs Rapid Type Analysis, starting at the specified root functions. It returns nil if no roots were specified.
The root functions must be one or more entrypoints (main and init functions) of a complete SSA program, with function bodies for all dependencies, constructed with the ssa.InstantiateGenerics mode flag.
If buildCallGraph is true, Result.CallGraph will contain a call graph; otherwise, only the other fields (reachable functions) are populated.