55 "sync"
66
77 "golang.org/x/tools/go/analysis"
8+ "honnef.co/go/tools/analysis/facts/directives"
9+ "honnef.co/go/tools/analysis/facts/generated"
10+ "honnef.co/go/tools/analysis/lint"
811 "honnef.co/go/tools/unused"
912
1013 "github.com/golangci/golangci-lint/pkg/config"
@@ -15,11 +18,7 @@ import (
1518
1619const unusedName = "unused"
1720
18- type UnusedSettings struct {
19- GoVersion string
20- }
21-
22- func NewUnused (settings * config.StaticCheckSettings ) * goanalysis.Linter {
21+ func NewUnused (settings * config.UnusedSettings , scSettings * config.StaticCheckSettings ) * goanalysis.Linter {
2322 var mu sync.Mutex
2423 var resIssues []goanalysis.Issue
2524
@@ -28,11 +27,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
2827 Doc : unused .Analyzer .Analyzer .Doc ,
2928 Requires : unused .Analyzer .Analyzer .Requires ,
3029 Run : func (pass * analysis.Pass ) (any , error ) {
31- issues , err := runUnused (pass )
32- if err != nil {
33- return nil , err
34- }
35-
30+ issues := runUnused (pass , settings )
3631 if len (issues ) == 0 {
3732 return nil , nil
3833 }
@@ -45,7 +40,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
4540 },
4641 }
4742
48- setAnalyzerGoVersion (analyzer , getGoVersion (settings ))
43+ setAnalyzerGoVersion (analyzer , getGoVersion (scSettings ))
4944
5045 return goanalysis .NewLinter (
5146 unusedName ,
@@ -57,21 +52,18 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
5752 }).WithLoadMode (goanalysis .LoadModeTypesInfo )
5853}
5954
60- func runUnused (pass * analysis.Pass ) ([]goanalysis.Issue , error ) {
61- res , err := unused .Analyzer .Analyzer .Run (pass )
62- if err != nil {
63- return nil , err
64- }
55+ func runUnused (pass * analysis.Pass , cfg * config.UnusedSettings ) []goanalysis.Issue {
56+ res := getUnusedResults (pass , cfg )
6557
6658 used := make (map [string ]bool )
67- for _ , obj := range res .(unused. Result ). Used {
59+ for _ , obj := range res .Used {
6860 used [fmt .Sprintf ("%s %d %s" , obj .Position .Filename , obj .Position .Line , obj .Name )] = true
6961 }
7062
7163 var issues []goanalysis.Issue
7264
7365 // Inspired by https://github.com/dominikh/go-tools/blob/d694aadcb1f50c2d8ac0a1dd06217ebb9f654764/lintcmd/lint.go#L177-L197
74- for _ , object := range res .(unused. Result ). Unused {
66+ for _ , object := range res .Unused {
7567 if object .Kind == "type param" {
7668 continue
7769 }
@@ -90,5 +82,31 @@ func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
9082 issues = append (issues , issue )
9183 }
9284
93- return issues , nil
85+ return issues
86+ }
87+
88+ func getUnusedResults (pass * analysis.Pass , settings * config.UnusedSettings ) unused.Result {
89+ opts := unused.Options {
90+ FieldWritesAreUses : settings .FieldWritesAreUses ,
91+ PostStatementsAreReads : settings .PostStatementsAreReads ,
92+ ExportedIsUsed : settings .ExportedIsUsed ,
93+ ExportedFieldsAreUsed : settings .ExportedFieldsAreUsed ,
94+ ParametersAreUsed : settings .ParametersAreUsed ,
95+ LocalVariablesAreUsed : settings .LocalVariablesAreUsed ,
96+ GeneratedIsUsed : settings .GeneratedIsUsed ,
97+ }
98+
99+ // ref: https://github.com/dominikh/go-tools/blob/4ec1f474ca6c0feb8e10a8fcca4ab95f5b5b9881/internal/cmd/unused/unused.go#L68
100+ nodes := unused .Graph (pass .Fset ,
101+ pass .Files ,
102+ pass .Pkg ,
103+ pass .TypesInfo ,
104+ pass .ResultOf [directives .Analyzer ].([]lint.Directive ),
105+ pass .ResultOf [generated .Analyzer ].(map [string ]generated.Generator ),
106+ opts ,
107+ )
108+
109+ sg := unused.SerializedGraph {}
110+ sg .Merge (nodes )
111+ return sg .Results ()
94112}
0 commit comments