@@ -10,7 +10,7 @@ import (
10
10
"strings"
11
11
"sync"
12
12
13
- errcheck "github.com/golangci /errcheck/golangci "
13
+ "github.com/kisielk /errcheck/errcheck "
14
14
"github.com/pkg/errors"
15
15
"golang.org/x/tools/go/analysis"
16
16
@@ -36,13 +36,15 @@ func NewErrcheck() *goanalysis.Linter {
36
36
[]* analysis.Analyzer {analyzer },
37
37
nil ,
38
38
).WithContextSetter (func (lintCtx * linter.Context ) {
39
+ checker , err := getChecker (& lintCtx .Settings ().Errcheck )
40
+ if err != nil {
41
+ panic (err .Error ())
42
+ }
43
+ checker .Verbose = lintCtx .Cfg .Run .IsVerbose
44
+ checker .Tags = lintCtx .Cfg .Run .BuildTags
45
+
39
46
analyzer .Run = func (pass * analysis.Pass ) (interface {}, error ) {
40
- prog := goanalysis .MakeFakeLoaderProgram (pass )
41
- errCfg , err := genConfig (& lintCtx .Settings ().Errcheck )
42
- if err != nil {
43
- return nil , err
44
- }
45
- errcheckIssues , err := errcheck .RunWithConfig (prog , errCfg )
47
+ errcheckIssues , err := errcheckRunWithConfig (pass , checker )
46
48
if err != nil {
47
49
return nil , err
48
50
}
@@ -75,6 +77,32 @@ func NewErrcheck() *goanalysis.Linter {
75
77
}).WithLoadMode (goanalysis .LoadModeTypesInfo )
76
78
}
77
79
80
+ type errcheckIssue errcheck.UncheckedError
81
+
82
+ func errcheckMakeIssues (e * errcheck.UncheckedErrors ) []errcheckIssue {
83
+ var ret []errcheckIssue
84
+ for _ , uncheckedError := range e .Errors {
85
+ ret = append (ret , errcheckIssue (uncheckedError ))
86
+ }
87
+
88
+ return ret
89
+ }
90
+
91
+ func errcheckRunWithConfig (pass * analysis.Pass , c * errcheck.Checker ) ([]errcheckIssue , error ) {
92
+ if err := c .CheckPackages (pass .Pkg .Path ()); err != nil {
93
+ if e , ok := err .(* errcheck.UncheckedErrors ); ok {
94
+ return errcheckMakeIssues (e ), nil
95
+ }
96
+ if err == errcheck .ErrNoGoFiles {
97
+ return nil , nil
98
+ }
99
+
100
+ return nil , err
101
+ }
102
+ // no issues
103
+ return nil , nil
104
+ }
105
+
78
106
// parseIgnoreConfig was taken from errcheck in order to keep the API identical.
79
107
// https://github.com/kisielk/errcheck/blob/1787c4bee836470bf45018cfbc783650db3c6501/main.go#L25-L60
80
108
func parseIgnoreConfig (s string ) (map [string ]* regexp.Regexp , error ) {
@@ -104,27 +132,31 @@ func parseIgnoreConfig(s string) (map[string]*regexp.Regexp, error) {
104
132
return cfg , nil
105
133
}
106
134
107
- func genConfig (errCfg * config.ErrcheckSettings ) (* errcheck.Config , error ) {
135
+ func getChecker (errCfg * config.ErrcheckSettings ) (* errcheck.Checker , error ) {
136
+ checker := errcheck .NewChecker ()
137
+ checker .Blank = errCfg .CheckAssignToBlank
138
+ checker .Asserts = errCfg .CheckTypeAssertions
139
+
108
140
ignoreConfig , err := parseIgnoreConfig (errCfg .Ignore )
109
141
if err != nil {
110
142
return nil , errors .Wrap (err , "failed to parse 'ignore' directive" )
111
143
}
112
144
113
- c := & errcheck.Config {
114
- Ignore : ignoreConfig ,
115
- Blank : errCfg .CheckAssignToBlank ,
116
- Asserts : errCfg .CheckTypeAssertions ,
145
+ checker .Ignore = map [string ]* regexp.Regexp {}
146
+ for pkg , re := range ignoreConfig {
147
+ checker .Ignore [pkg ] = re
117
148
}
118
149
150
+ checker .AddExcludes (errcheck .DefaultExcludes )
119
151
if errCfg .Exclude != "" {
120
152
exclude , err := readExcludeFile (errCfg .Exclude )
121
153
if err != nil {
122
154
return nil , err
123
155
}
124
- c . Exclude = exclude
156
+ checker . AddExcludes ( exclude )
125
157
}
126
158
127
- return c , nil
159
+ return checker , nil
128
160
}
129
161
130
162
func getFirstPathArg () string {
@@ -192,7 +224,7 @@ func setupConfigFileSearch(name string) []string {
192
224
return configSearchPaths
193
225
}
194
226
195
- func readExcludeFile (name string ) (map [ string ] bool , error ) {
227
+ func readExcludeFile (name string ) ([] string , error ) {
196
228
var err error
197
229
var fh * os.File
198
230
@@ -206,12 +238,12 @@ func readExcludeFile(name string) (map[string]bool, error) {
206
238
return nil , errors .Wrapf (err , "failed reading exclude file: %s" , name )
207
239
}
208
240
scanner := bufio .NewScanner (fh )
209
- exclude := make ( map [ string ] bool )
241
+ excludes := [] string {}
210
242
for scanner .Scan () {
211
- exclude [ scanner .Text ()] = true
243
+ excludes = append ( excludes , scanner .Text ())
212
244
}
213
245
if err := scanner .Err (); err != nil {
214
246
return nil , errors .Wrapf (err , "failed scanning file: %s" , name )
215
247
}
216
- return exclude , nil
248
+ return excludes , nil
217
249
}
0 commit comments