5
5
"sync"
6
6
7
7
"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"
8
11
"honnef.co/go/tools/unused"
9
12
10
13
"github.com/golangci/golangci-lint/pkg/config"
@@ -15,11 +18,7 @@ import (
15
18
16
19
const unusedName = "unused"
17
20
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 {
23
22
var mu sync.Mutex
24
23
var resIssues []goanalysis.Issue
25
24
@@ -28,11 +27,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
28
27
Doc : unused .Analyzer .Analyzer .Doc ,
29
28
Requires : unused .Analyzer .Analyzer .Requires ,
30
29
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 )
36
31
if len (issues ) == 0 {
37
32
return nil , nil
38
33
}
@@ -45,7 +40,7 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
45
40
},
46
41
}
47
42
48
- setAnalyzerGoVersion (analyzer , getGoVersion (settings ))
43
+ setAnalyzerGoVersion (analyzer , getGoVersion (scSettings ))
49
44
50
45
return goanalysis .NewLinter (
51
46
unusedName ,
@@ -57,21 +52,18 @@ func NewUnused(settings *config.StaticCheckSettings) *goanalysis.Linter {
57
52
}).WithLoadMode (goanalysis .LoadModeTypesInfo )
58
53
}
59
54
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 )
65
57
66
58
used := make (map [string ]bool )
67
- for _ , obj := range res .(unused. Result ). Used {
59
+ for _ , obj := range res .Used {
68
60
used [fmt .Sprintf ("%s %d %s" , obj .Position .Filename , obj .Position .Line , obj .Name )] = true
69
61
}
70
62
71
63
var issues []goanalysis.Issue
72
64
73
65
// 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 {
75
67
if object .Kind == "type param" {
76
68
continue
77
69
}
@@ -90,5 +82,31 @@ func runUnused(pass *analysis.Pass) ([]goanalysis.Issue, error) {
90
82
issues = append (issues , issue )
91
83
}
92
84
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 ()
94
112
}
0 commit comments