@@ -10,7 +10,7 @@ import (
1010 "strings"
1111 "sync"
1212
13- errcheck "github.com/golangci /errcheck/golangci "
13+ "github.com/kisielk /errcheck/errcheck "
1414 "github.com/pkg/errors"
1515 "golang.org/x/tools/go/analysis"
1616
@@ -36,13 +36,15 @@ func NewErrcheck() *goanalysis.Linter {
3636 []* analysis.Analyzer {analyzer },
3737 nil ,
3838 ).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+
3946 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 )
4648 if err != nil {
4749 return nil , err
4850 }
@@ -75,6 +77,32 @@ func NewErrcheck() *goanalysis.Linter {
7577 }).WithLoadMode (goanalysis .LoadModeTypesInfo )
7678}
7779
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+
78106// parseIgnoreConfig was taken from errcheck in order to keep the API identical.
79107// https://github.com/kisielk/errcheck/blob/1787c4bee836470bf45018cfbc783650db3c6501/main.go#L25-L60
80108func parseIgnoreConfig (s string ) (map [string ]* regexp.Regexp , error ) {
@@ -104,27 +132,31 @@ func parseIgnoreConfig(s string) (map[string]*regexp.Regexp, error) {
104132 return cfg , nil
105133}
106134
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+
108140 ignoreConfig , err := parseIgnoreConfig (errCfg .Ignore )
109141 if err != nil {
110142 return nil , errors .Wrap (err , "failed to parse 'ignore' directive" )
111143 }
112144
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
117148 }
118149
150+ checker .AddExcludes (errcheck .DefaultExcludes )
119151 if errCfg .Exclude != "" {
120152 exclude , err := readExcludeFile (errCfg .Exclude )
121153 if err != nil {
122154 return nil , err
123155 }
124- c . Exclude = exclude
156+ checker . AddExcludes ( exclude )
125157 }
126158
127- return c , nil
159+ return checker , nil
128160}
129161
130162func getFirstPathArg () string {
@@ -192,7 +224,7 @@ func setupConfigFileSearch(name string) []string {
192224 return configSearchPaths
193225}
194226
195- func readExcludeFile (name string ) (map [ string ] bool , error ) {
227+ func readExcludeFile (name string ) ([] string , error ) {
196228 var err error
197229 var fh * os.File
198230
@@ -206,12 +238,12 @@ func readExcludeFile(name string) (map[string]bool, error) {
206238 return nil , errors .Wrapf (err , "failed reading exclude file: %s" , name )
207239 }
208240 scanner := bufio .NewScanner (fh )
209- exclude := make ( map [ string ] bool )
241+ excludes := [] string {}
210242 for scanner .Scan () {
211- exclude [ scanner .Text ()] = true
243+ excludes = append ( excludes , scanner .Text ())
212244 }
213245 if err := scanner .Err (); err != nil {
214246 return nil , errors .Wrapf (err , "failed scanning file: %s" , name )
215247 }
216- return exclude , nil
248+ return excludes , nil
217249}
0 commit comments