tools/passes/usage/usage.go (49 lines of code) (raw):

package usage import ( "go/ast" "reflect" "golang.org/x/tools/go/analysis" ) var Analyzer = &analysis.Analyzer{ Doc: "Estimate usage of the client-go package", Name: "apiCoverage", ResultType: reflect.TypeOf((*Result)(nil)), Run: run, } type Result struct { Types Set Funcs Set Methods Set Fields Set } type Set map[string]bool func run(pass *analysis.Pass) (interface{}, error) { result := &Result{ Types: make(Set), Funcs: make(Set), Methods: make(Set), Fields: make(Set), } for _, f := range pass.Files { ast.Inspect(f, func(n ast.Node) bool { switch x := n.(type) { case *ast.SelectorExpr: if ident, ok := x.X.(*ast.Ident); ok { if ident.Name == "gitlab" { result.Types[x.Sel.Name] = true result.Funcs[x.Sel.Name] = true break } } result.Methods[x.Sel.Name] = true result.Fields[x.Sel.Name] = true case *ast.KeyValueExpr: if ident, ok := x.Key.(*ast.Ident); ok { result.Fields[ident.Name] = true } } return true }) } return result, nil }