type Options … type Graph … // All returns an iterator over the action graph in depth-first postorder. // // Example: // // for act := range graph.All() { // ... // } // // Clients using go1.22 should iterate using the code below and may // not assume anything else about the result: // // graph.All()(func (act *Action) bool { // ... // }) func (g *Graph) All() actionSeq { … } type Action … func (act *Action) String() string { … } // Analyze runs the specified analyzers on the initial packages. // // The initial packages and all dependencies must have been loaded // using the [packages.LoadAllSyntax] flag, Analyze may need to run // some analyzer (those that consume and produce facts) on // dependencies too. // // On success, it returns a Graph of actions whose Roots hold one // item per (a, p) in the cross-product of analyzers and pkgs. // // If opts is nil, it is equivalent to new(Options). func Analyze(analyzers []*analysis.Analyzer, pkgs []*packages.Package, opts *Options) (*Graph, error) { … } func init() { … } type objectFactKey … type packageFactKey … func execAll(actions []*Action) { … } func (act *Action) exec() { … } func (act *Action) execOnce() { … } // inheritFacts populates act.facts with // those it obtains from its dependency, dep. func inheritFacts(act, dep *Action) { … } // codeFact encodes then decodes a fact, // just to exercise that logic. func codeFact(fact analysis.Fact) (analysis.Fact, error) { … } // exportedFrom reports whether obj may be visible to a package that imports pkg. // This includes not just the exported members of pkg, but also unexported // constants, types, fields, and methods, perhaps belonging to other packages, // that find there way into the API. // This is an overapproximation of the more accurate approach used by // gc export data, which walks the type graph, but it's much simpler. // // TODO(adonovan): do more accurate filtering by walking the type graph. func exportedFrom(obj types.Object, pkg *types.Package) bool { … } // ObjectFact retrieves a fact associated with obj, // and returns true if one was found. // Given a value ptr of type *T, where *T satisfies Fact, // ObjectFact copies the value to *ptr. // // See documentation at ImportObjectFact field of [analysis.Pass]. func (act *Action) ObjectFact(obj types.Object, ptr analysis.Fact) bool { … } // exportObjectFact implements Pass.ExportObjectFact. func (act *Action) exportObjectFact(obj types.Object, fact analysis.Fact) { … } // AllObjectFacts returns a new slice containing all object facts of // the analysis's FactTypes in unspecified order. // // See documentation at AllObjectFacts field of [analysis.Pass]. func (act *Action) AllObjectFacts() []analysis.ObjectFact { … } // PackageFact retrieves a fact associated with package pkg, // which must be this package or one of its dependencies. // // See documentation at ImportObjectFact field of [analysis.Pass]. func (act *Action) PackageFact(pkg *types.Package, ptr analysis.Fact) bool { … } // exportPackageFact implements Pass.ExportPackageFact. func (act *Action) exportPackageFact(fact analysis.Fact) { … } func factType(fact analysis.Fact) reflect.Type { … } // AllPackageFacts returns a new slice containing all package // facts of the analysis's FactTypes in unspecified order. // // See documentation at AllPackageFacts field of [analysis.Pass]. func (act *Action) AllPackageFacts() []analysis.PackageFact { … } // forEach is a utility function for traversing the action graph. It // applies function f to each action in the graph reachable from // roots, in depth-first postorder. If any call to f returns an error, // the traversal is aborted and ForEach returns the error. func forEach(roots []*Action, f func(*Action) error) error { … }