// mainPackage returns the main package to analyze. // The resulting package has a main() function. func mainPackage(prog *ssa.Program, tests bool) (*ssa.Package, error) { pkgs := prog.AllPackages() // TODO(adonovan): allow independent control over tests, mains and libraries. // TODO(adonovan): put this logic in a library; we keep reinventing it. if tests { // If -test, use all packages' tests. if len(pkgs) > 0 { if main := prog.CreateTestMainPackage(pkgs...); main != nil { return main, nil } } return nil, fmt.Errorf("no tests") } // Otherwise, use the first package named main. for _, pkg := range pkgs { if pkg.Object.Name() == "main" { if pkg.Func("main") == nil { return nil, fmt.Errorf("no func main() in main package") } return pkg, nil } } return nil, fmt.Errorf("no main package") }
// Create a pointer.Config whose scope is the initial packages of lprog // and their dependencies. func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) { // TODO(adonovan): the body of this function is essentially // duplicated in all go/pointer clients. Refactor. // For each initial package (specified on the command line), // if it has a main function, analyze that, // otherwise analyze its tests, if any. var testPkgs, mains []*ssa.Package for _, info := range lprog.InitialPackages() { initialPkg := prog.Package(info.Pkg) // Add package to the pointer analysis scope. if initialPkg.Func("main") != nil { mains = append(mains, initialPkg) } else { testPkgs = append(testPkgs, initialPkg) } } if testPkgs != nil { if p := prog.CreateTestMainPackage(testPkgs...); p != nil { mains = append(mains, p) } } if mains == nil { return nil, fmt.Errorf("analysis scope has no main and no tests") } return &pointer.Config{ Log: ptaLog, Reflection: reflection, Mains: mains, }, nil }
// Create a pointer.Config whose scope is the initial packages of lprog // and their dependencies. func setupPTA(prog *ssa.Program, lprog *loader.Program, ptaLog io.Writer, reflection bool) (*pointer.Config, error) { // For each initial package (specified on the command line), // if it has a main function, analyze that, // otherwise analyze its tests, if any. var mains []*ssa.Package for _, info := range lprog.InitialPackages() { p := prog.Package(info.Pkg) // Add package to the pointer analysis scope. if p.Pkg.Name() == "main" && p.Func("main") != nil { mains = append(mains, p) } else if main := prog.CreateTestMainPackage(p); main != nil { mains = append(mains, main) } } if mains == nil { return nil, fmt.Errorf("analysis scope has no main and no tests") } return &pointer.Config{ Log: ptaLog, Reflection: reflection, Mains: mains, }, nil }