func main() { flag.Parse() exitStatus := 0 importPaths := gotool.ImportPaths(flag.Args()) if len(importPaths) == 0 { importPaths = []string{"."} } for _, pkgPath := range importPaths { visitor := &visitor{ info: types.Info{ Types: make(map[ast.Expr]types.TypeAndValue), Defs: make(map[*ast.Ident]types.Object), Selections: make(map[*ast.SelectorExpr]*types.Selection), }, m: make(map[types.Type]map[string]int), skip: make(map[types.Type]struct{}), } fset, astFiles := check.ASTFilesForPackage(pkgPath, *loadTestFiles) imp := importer.New() // Preliminary cgo support. imp.Config = importer.Config{UseGcFallback: true} config := types.Config{Import: imp.Import} var err error visitor.pkg, err = config.Check(pkgPath, fset, astFiles, &visitor.info) if err != nil { fmt.Fprintf(os.Stderr, "%s: %v\n", pkgPath, err) continue } for _, f := range astFiles { ast.Walk(visitor, f) } for t := range visitor.m { if _, skip := visitor.skip[t]; skip { continue } for fieldName, v := range visitor.m[t] { if !*reportExported && ast.IsExported(fieldName) { continue } if v == 0 { field, _, _ := types.LookupFieldOrMethod(t, false, visitor.pkg, fieldName) if fieldName == "XMLName" { if named, ok := field.Type().(*types.Named); ok && named.Obj().Pkg().Path() == "encoding/xml" { continue } } pos := fset.Position(field.Pos()) fmt.Printf("%s: %s:%d:%d: %s.%s\n", pkgPath, pos.Filename, pos.Line, pos.Column, types.TypeString(t, nil), fieldName, ) exitStatus = 1 } } } } os.Exit(exitStatus) }
func main() { flag.Parse() exitStatus = 0 importPaths := gotool.ImportPaths(flag.Args()) if len(importPaths) == 0 { importPaths = []string{"."} } for _, pkgPath := range importPaths { visitor := &visitor{pkgPath: pkgPath} fset, astFiles := check.ASTFilesForPackage(pkgPath, false) visitor.fset = fset for _, f := range astFiles { ast.Walk(visitor, f) } } os.Exit(exitStatus) }