@@ -2,61 +2,36 @@ package processors
2
2
3
3
import (
4
4
"fmt"
5
- "go/parser"
6
- "go/token"
7
5
"path/filepath"
8
- "regexp"
9
- "strings"
10
6
7
+ "github.com/golangci/golangci-lint/pkg/config"
11
8
"github.com/golangci/golangci-lint/pkg/logutils"
12
9
"github.com/golangci/golangci-lint/pkg/result"
13
10
)
14
11
15
- const (
16
- AutogeneratedModeLax = "lax"
17
- AutogeneratedModeStrict = "strict"
18
- AutogeneratedModeDisable = "disable"
19
- )
20
-
21
- // The values must be in lowercase.
22
- const (
23
- genCodeGenerated = "code generated"
24
- genDoNotEdit = "do not edit"
25
-
26
- // Related to easyjson.
27
- genAutoFile = "autogenerated file"
28
-
29
- //nolint:lll // Long URL
30
- // Related to Swagger Codegen.
31
- // https://github.com/swagger-api/swagger-codegen/blob/61cfeac3b9d855b4eb8bffa0d118bece117bcb7d/modules/swagger-codegen/src/main/resources/go/partial_header.mustache#L16
32
- // https://github.com/swagger-api/swagger-codegen/issues/12358
33
- genSwaggerCodegen = "* generated by: swagger codegen "
34
- )
35
-
36
12
var _ Processor = (* GeneratedFileFilter )(nil )
37
13
38
14
type fileSummary struct {
39
15
generated bool
40
16
}
41
17
42
18
// GeneratedFileFilter filters generated files.
43
- // - mode "lax": see `isGeneratedFileLax` documentation.
44
- // - mode "strict": see `isGeneratedFileStrict` documentation.
45
- // - mode "disable": skips this processor.
46
19
type GeneratedFileFilter struct {
47
20
debugf logutils.DebugFunc
48
21
49
- mode string
50
- strictPattern * regexp. Regexp
22
+ mode string
23
+ matcher * GeneratedFileMatcher
51
24
52
25
fileSummaryCache map [string ]* fileSummary
53
26
}
54
27
55
28
func NewGeneratedFileFilter (mode string ) * GeneratedFileFilter {
56
29
return & GeneratedFileFilter {
57
- debugf : logutils .Debug (logutils .DebugKeyGeneratedFileFilter ),
58
- mode : mode ,
59
- strictPattern : regexp .MustCompile (`^// Code generated .* DO NOT EDIT\.$` ),
30
+ debugf : logutils .Debug (logutils .DebugKeyGeneratedFileFilter ),
31
+
32
+ mode : mode ,
33
+ matcher : NewGeneratedFileMatcher (mode ),
34
+
60
35
fileSummaryCache : map [string ]* fileSummary {},
61
36
}
62
37
}
@@ -66,7 +41,7 @@ func (*GeneratedFileFilter) Name() string {
66
41
}
67
42
68
43
func (p * GeneratedFileFilter ) Process (issues []result.Issue ) ([]result.Issue , error ) {
69
- if p .mode == AutogeneratedModeDisable {
44
+ if p .mode == config . GeneratedModeDisable {
70
45
return issues , nil
71
46
}
72
47
@@ -89,93 +64,14 @@ func (p *GeneratedFileFilter) shouldPassIssue(issue *result.Issue) (bool, error)
89
64
fs = & fileSummary {}
90
65
p .fileSummaryCache [issue .FilePath ()] = fs
91
66
92
- if p .mode == AutogeneratedModeStrict {
93
- var err error
94
- fs .generated , err = p .isGeneratedFileStrict (issue .FilePath ())
95
- if err != nil {
96
- return false , fmt .Errorf ("failed to get doc (strict) of file %s: %w" , issue .FilePath (), err )
97
- }
98
- } else {
99
- doc , err := getComments (issue .FilePath ())
100
- if err != nil {
101
- return false , fmt .Errorf ("failed to get doc (lax) of file %s: %w" , issue .FilePath (), err )
102
- }
103
-
104
- fs .generated = p .isGeneratedFileLax (doc )
67
+ var err error
68
+ fs .generated , err = p .matcher .IsGeneratedFile (issue .FilePath (), nil )
69
+ if err != nil {
70
+ return false , fmt .Errorf ("failed to get doc (%s) of file %s: %w" , p .mode , issue .FilePath (), err )
105
71
}
106
72
107
73
p .debugf ("file %q is generated: %t" , issue .FilePath (), fs .generated )
108
74
109
75
// don't report issues for autogenerated files
110
76
return ! fs .generated , nil
111
77
}
112
-
113
- // isGeneratedFileLax reports whether the source file is generated code.
114
- // The function uses a bit laxer rules than isGeneratedFileStrict to match more generated code.
115
- // See https://github.com/golangci/golangci-lint/issues/48 and https://github.com/golangci/golangci-lint/issues/72.
116
- func (p * GeneratedFileFilter ) isGeneratedFileLax (doc string ) bool {
117
- markers := []string {genCodeGenerated , genDoNotEdit , genAutoFile , genSwaggerCodegen }
118
-
119
- doc = strings .ToLower (doc )
120
-
121
- for _ , marker := range markers {
122
- if strings .Contains (doc , marker ) {
123
- p .debugf ("doc contains marker %q: file is generated" , marker )
124
-
125
- return true
126
- }
127
- }
128
-
129
- p .debugf ("doc of len %d doesn't contain any of markers: %s" , len (doc ), markers )
130
-
131
- return false
132
- }
133
-
134
- // isGeneratedFileStrict returns true if the source file has a line that matches the regular expression:
135
- //
136
- // ^// Code generated .* DO NOT EDIT\.$
137
- //
138
- // This line must appear before the first non-comment, non-blank text in the file.
139
- // Based on https://go.dev/s/generatedcode.
140
- func (p * GeneratedFileFilter ) isGeneratedFileStrict (filePath string ) (bool , error ) {
141
- file , err := parser .ParseFile (token .NewFileSet (), filePath , nil , parser .PackageClauseOnly | parser .ParseComments )
142
- if err != nil {
143
- return false , fmt .Errorf ("failed to parse file: %w" , err )
144
- }
145
-
146
- if file == nil || len (file .Comments ) == 0 {
147
- return false , nil
148
- }
149
-
150
- for _ , comment := range file .Comments {
151
- if comment .Pos () > file .Package {
152
- return false , nil
153
- }
154
-
155
- for _ , line := range comment .List {
156
- generated := p .strictPattern .MatchString (line .Text )
157
- if generated {
158
- p .debugf ("doc contains ignore expression: file is generated" )
159
-
160
- return true , nil
161
- }
162
- }
163
- }
164
-
165
- return false , nil
166
- }
167
-
168
- func getComments (filePath string ) (string , error ) {
169
- fset := token .NewFileSet ()
170
- syntax , err := parser .ParseFile (fset , filePath , nil , parser .PackageClauseOnly | parser .ParseComments )
171
- if err != nil {
172
- return "" , fmt .Errorf ("failed to parse file: %w" , err )
173
- }
174
-
175
- var docLines []string
176
- for _ , c := range syntax .Comments {
177
- docLines = append (docLines , strings .TrimSpace (c .Text ()))
178
- }
179
-
180
- return strings .Join (docLines , "\n " ), nil
181
- }
0 commit comments