tools/passes/apiunused/apiunused.go (73 lines of code) (raw):
package apiunused
import (
"encoding/json"
"io"
"os"
"reflect"
"golang.org/x/tools/go/analysis"
"gitlab.com/gitlab-org/terraform-provider-gitlab/tools/passes"
clientgo "gitlab.com/gitlab-org/terraform-provider-gitlab/tools/passes/clientgo"
"gitlab.com/gitlab-org/terraform-provider-gitlab/tools/passes/usage"
)
var Output io.Writer = io.Discard
var Analyzer = &analysis.Analyzer{
Doc: "Estimate the unused pieces of the client-go package",
Name: "apiunused",
ResultType: reflect.TypeOf((*Result)(nil)),
Requires: []*analysis.Analyzer{clientgo.Analyzer, usage.Analyzer},
Run: run,
}
type Result struct {
UnusedByFile map[string]Unused
}
type Unused struct {
Types []string `json:"types,omitempty"`
Funcs []string `json:"funcs,omitempty"`
Methods []string `json:"methods,omitempty"`
Fields []string `json:"fields,omitempty"`
}
func run(pass *analysis.Pass) (interface{}, error) {
clientGo := pass.ResultOf[clientgo.Analyzer].(*clientgo.Result)
usage := pass.ResultOf[usage.Analyzer].(*usage.Result)
result := &Result{
UnusedByFile: make(map[string]Unused),
}
processUnused(result, clientGo.TypeToFilenames, usage.Types,
func(item Unused, name string) Unused {
item.Types = append(item.Types, name)
return item
})
processUnused(result, clientGo.FuncToFilenames, usage.Funcs,
func(item Unused, name string) Unused {
item.Funcs = append(item.Funcs, name)
return item
})
processUnused(result, clientGo.MethodToFilenames, usage.Methods,
func(item Unused, name string) Unused {
item.Methods = append(item.Methods, name)
return item
})
processUnused(result, clientGo.FieldToFilenames, usage.Fields,
func(item Unused, name string) Unused {
item.Fields = append(item.Fields, name)
return item
})
if !passes.IsTestPackage(pass) {
writeOutput(result)
}
return result, nil
}
func processUnused(result *Result, nameToFilenames clientgo.MultiMap, seen usage.Set, mutFn func(Unused, string) Unused) {
for name, filenames := range nameToFilenames {
if !seen[name] {
for _, filename := range filenames {
result.UnusedByFile[filename] = mutFn(result.UnusedByFile[filename], name)
}
}
}
}
func writeOutput(result *Result) {
e := json.NewEncoder(os.Stdout)
e.SetIndent("", " ")
_ = e.Encode(result.UnusedByFile)
}