func gotypes(data []byte) (err error) { fset := token.NewFileSet() var f *ast.File f, err = parser.ParseFile(fset, "src.go", data, parser.ParseComments|parser.DeclarationErrors|parser.AllErrors) if err != nil { return } // provide error handler // initialize maps in config conf := &types.Config{ Error: func(err error) {}, Sizes: &types.StdSizes{8, 8}, Importer: importer.For("gc", nil), } _, err = conf.Check("pkg", fset, []*ast.File{f}, nil) if err != nil { return } prog := ssa.NewProgram(fset, ssa.BuildSerially|ssa.SanityCheckFunctions|ssa.GlobalDebug) prog.BuildAll() for _, pkg := range prog.AllPackages() { _, err := pkg.WriteTo(ioutil.Discard) if err != nil { panic(err) } } return }
func checkPkgFiles(files []*ast.File) { compiler := "gc" if *gccgo { compiler = "gccgo" } type bailout struct{} conf := types.Config{ FakeImportC: true, Error: func(err error) { if !*allErrors && errorCount >= 10 { panic(bailout{}) } report(err) }, Importer: importer.For(compiler, nil), Sizes: sizes, } defer func() { switch p := recover().(type) { case nil, bailout: // normal return or early exit default: // re-panic panic(p) } }() const path = "pkg" // any non-empty string will do for now conf.Check(path, fset, files, nil) }
func init() { register("gc", importer.For("gc", nil)) }