/
interfacer.go
66 lines (54 loc) · 1.41 KB
/
interfacer.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package interfacer
import (
"fmt"
"mvdan.cc/interfacer/check"
"go/types"
"github.com/anuvu/bazel-nogo-lint/pkg/util"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/loader"
"golang.org/x/tools/go/packages"
)
const Name = "interfacer"
var Analyzer = &analysis.Analyzer{
Name: Name,
Doc: "Linter that suggests narrower interface types",
Run: run,
}
type Interfacer struct{}
func run(pass *analysis.Pass) (interface{}, error) {
var createdPkgs []*loader.PackageInfo
createdPkgs = append(createdPkgs, util.MakeFakeLoaderPackageInfo(pass))
allPkgs := map[*types.Package]*loader.PackageInfo{}
for _, pkg := range createdPkgs {
pkg := pkg
allPkgs[pkg.Pkg] = pkg
}
prog := &loader.Program{
Fset: pass.Fset,
Imported: nil, // not used without .Created in any linter
Created: createdPkgs, // all initial packages
AllPackages: allPkgs, // all initial packages and their depndencies
}
pack := &packages.Package{
Types: pass.Pkg,
Fset: pass.Fset,
TypesInfo: pass.TypesInfo,
TypesSizes: pass.TypesSizes,
Syntax: pass.Files,
}
c := new(check.Checker)
c.Program(prog)
ssaProg := util.BuildSSAProgram(pack)
c.ProgramSSA(ssaProg)
issues, err := c.Check()
if err != nil {
return nil, err
}
if len(issues) == 0 {
return nil, nil
}
for _, i := range issues {
pass.Reportf(i.Pos(), fmt.Sprintf("[%s] %s", Name, i.Message()))
}
return nil, nil
}