Skip to content

Commit 1d3de38

Browse files
committed
feat: rename exclude-autogenerated-strict to exclude-generated-strict
1 parent b05e397 commit 1d3de38

File tree

6 files changed

+173
-27
lines changed

6 files changed

+173
-27
lines changed

.golangci.next.reference.yml

+9-3
Original file line numberDiff line numberDiff line change
@@ -2814,11 +2814,17 @@ issues:
28142814
# Default: false
28152815
exclude-case-sensitive: false
28162816

2817-
# To follow strict Go autogenerated file convention.
2817+
# To follow strictly the Go generated file convention.
2818+
#
2819+
# If set to true, source files that have lines matching only the following regular expression will be excluded:
2820+
# `^// Code generated .* DO NOT EDIT\.$`
2821+
# This line must appear before the first non-comment, non-blank text in the file.
28182822
# https://go.dev/s/generatedcode
2819-
# By default a lax pattern is applied.
2823+
#
2824+
# By default, a lax pattern is applied:
2825+
# sources are excluded if they contain lines `autogenerated file`, `code generated`, `do not edit`, etc.
28202826
# Default: false
2821-
exclude-autogenerated-strict: true
2827+
exclude-generated-strict: true
28222828

28232829
# The list of ids of default excludes to include or disable.
28242830
# https://golangci-lint.run/usage/false-positives/#default-exclusions

jsonschema/golangci.next.jsonschema.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -3342,8 +3342,8 @@
33423342
"type": "boolean",
33433343
"default": false
33443344
},
3345-
"exclude-autogenerated-strict": {
3346-
"description": "To follow strict Go autogenerated file convention",
3345+
"exclude-generated-strict": {
3346+
"description": "To follow strict Go generated file convention",
33473347
"type": "boolean",
33483348
"default": false
33493349
},

pkg/config/issues.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -105,12 +105,12 @@ var DefaultExcludePatterns = []ExcludePattern{
105105
}
106106

107107
type Issues struct {
108-
IncludeDefaultExcludes []string `mapstructure:"include"`
109-
ExcludeCaseSensitive bool `mapstructure:"exclude-case-sensitive"`
110-
ExcludePatterns []string `mapstructure:"exclude"`
111-
ExcludeRules []ExcludeRule `mapstructure:"exclude-rules"`
112-
ExcludeAutogeneratedStrict bool `mapstructure:"exclude-autogenerated-strict"`
113-
UseDefaultExcludes bool `mapstructure:"exclude-use-default"`
108+
IncludeDefaultExcludes []string `mapstructure:"include"`
109+
ExcludeCaseSensitive bool `mapstructure:"exclude-case-sensitive"`
110+
ExcludePatterns []string `mapstructure:"exclude"`
111+
ExcludeRules []ExcludeRule `mapstructure:"exclude-rules"`
112+
ExcludeGeneratedStrict bool `mapstructure:"exclude-generated-strict"`
113+
UseDefaultExcludes bool `mapstructure:"exclude-use-default"`
114114

115115
MaxIssuesPerLinter int `mapstructure:"max-issues-per-linter"`
116116
MaxSameIssues int `mapstructure:"max-same-issues"`

pkg/lint/runner.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func NewRunner(log logutils.Log, cfg *config.Config, goenv *goutil.Env,
7272
skipFilesProcessor,
7373
skipDirsProcessor, // must be after path prettifier
7474

75-
processors.NewAutogeneratedExclude(cfg.Issues.ExcludeAutogeneratedStrict),
75+
processors.NewAutogeneratedExclude(cfg.Issues.ExcludeGeneratedStrict),
7676

7777
// Must be before exclude because users see already marked output and configure excluding by it.
7878
processors.NewIdentifierMarker(),

pkg/result/processors/autogenerated_exclude.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ func (p *AutogeneratedExclude) shouldPassIssue(issue *result.Issue) (bool, error
6363
return true, nil
6464
}
6565

66+
if issue.FilePath() == "" {
67+
return false, errors.New("no file path for issue")
68+
}
69+
6670
if !isGoFile(issue.FilePath()) {
6771
return false, nil
6872
}
@@ -76,20 +80,16 @@ func (p *AutogeneratedExclude) shouldPassIssue(issue *result.Issue) (bool, error
7680
fs = &fileSummary{}
7781
p.fileSummaryCache[issue.FilePath()] = fs
7882

79-
if issue.FilePath() == "" {
80-
return false, errors.New("no file path for issue")
81-
}
82-
8383
if p.strict {
8484
var err error
8585
fs.generated, err = p.isGeneratedFileStrict(issue.FilePath())
8686
if err != nil {
87-
return false, fmt.Errorf("failed to get doc of file %s: %w", issue.FilePath(), err)
87+
return false, fmt.Errorf("failed to get doc (strict) of file %s: %w", issue.FilePath(), err)
8888
}
8989
} else {
9090
doc, err := getComments(issue.FilePath())
9191
if err != nil {
92-
return false, fmt.Errorf("failed to get doc of file %s: %w", issue.FilePath(), err)
92+
return false, fmt.Errorf("failed to get doc (lax) of file %s: %w", issue.FilePath(), err)
9393
}
9494

9595
fs.generated = p.isGeneratedFileLax(doc)
@@ -102,7 +102,7 @@ func (p *AutogeneratedExclude) shouldPassIssue(issue *result.Issue) (bool, error
102102
}
103103

104104
// isGeneratedFileLax reports whether the source file is generated code.
105-
// Using a bit laxer rules than https://go.dev/s/generatedcode to match more generated code.
105+
// The function uses a bit laxer rules than isGeneratedFileStrict to match more generated code.
106106
// See https://github.com/golangci/golangci-lint/issues/48 and https://github.com/golangci/golangci-lint/issues/72.
107107
func (p *AutogeneratedExclude) isGeneratedFileLax(doc string) bool {
108108
markers := []string{genCodeGenerated, genDoNotEdit, genAutoFile}
@@ -122,8 +122,12 @@ func (p *AutogeneratedExclude) isGeneratedFileLax(doc string) bool {
122122
return false
123123
}
124124

125-
// Based on https://go.dev/s/generatedcode
126-
// > This line must appear before the first non-comment, non-blank text in the file.
125+
// isGeneratedFileStrict returns true if the source file has a line that matches the regular expression:
126+
//
127+
// ^// Code generated .* DO NOT EDIT\.$
128+
//
129+
// This line must appear before the first non-comment, non-blank text in the file.
130+
// Based on https://go.dev/s/generatedcode.
127131
func (p *AutogeneratedExclude) isGeneratedFileStrict(filePath string) (bool, error) {
128132
file, err := parser.ParseFile(token.NewFileSet(), filePath, nil, parser.PackageClauseOnly|parser.ParseComments)
129133
if err != nil {

pkg/result/processors/autogenerated_exclude_test.go

+142-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package processors
22

33
import (
4+
"go/token"
45
"path/filepath"
56
"testing"
67

78
"github.com/stretchr/testify/assert"
89
"github.com/stretchr/testify/require"
10+
11+
"github.com/golangci/golangci-lint/pkg/result"
912
)
1013

1114
func TestAutogeneratedExclude_isGeneratedFileLax_generated(t *testing.T) {
@@ -79,12 +82,12 @@ func TestAutogeneratedExclude_isGeneratedFileStrict(t *testing.T) {
7982
}{
8083
{
8184
desc: "",
82-
filepath: filepath.FromSlash("./testdata/autogen_go_strict.go"),
85+
filepath: filepath.FromSlash("testdata/autogen_go_strict.go"),
8386
assert: assert.True,
8487
},
8588
{
8689
desc: "",
87-
filepath: filepath.FromSlash("./testdata/autogen_go_strict_invalid.go"),
90+
filepath: filepath.FromSlash("testdata/autogen_go_strict_invalid.go"),
8891
assert: assert.False,
8992
},
9093
}
@@ -108,19 +111,19 @@ func Test_getComments(t *testing.T) {
108111
doc string
109112
}{
110113
{
111-
fpath: filepath.Join("testdata", "autogen_exclude.go"),
114+
fpath: filepath.FromSlash("testdata/autogen_exclude.go"),
112115
doc: `first line
113116
second line
114117
third line
115118
this text also
116119
and this text also`,
117120
},
118121
{
119-
fpath: filepath.Join("testdata", "autogen_exclude_doc.go"),
122+
fpath: filepath.FromSlash("testdata/autogen_exclude_doc.go"),
120123
doc: `DO NOT EDIT`,
121124
},
122125
{
123-
fpath: filepath.Join("testdata", "autogen_exclude_block_comment.go"),
126+
fpath: filepath.FromSlash("testdata/autogen_exclude_block_comment.go"),
124127
doc: `* first line
125128
*
126129
* second line
@@ -141,7 +144,140 @@ this one line comment also`,
141144
// Issue 954: Some lines can be very long, e.g. auto-generated
142145
// embedded resources. Reported on file of 86.2KB.
143146
func Test_getComments_fileWithLongLine(t *testing.T) {
144-
fpath := filepath.Join("testdata", "autogen_exclude_long_line.go")
147+
fpath := filepath.FromSlash("testdata/autogen_exclude_long_line.go")
145148
_, err := getComments(fpath)
146149
assert.NoError(t, err)
147150
}
151+
152+
func Test_shouldPassIssue(t *testing.T) {
153+
testCases := []struct {
154+
desc string
155+
strict bool
156+
issue *result.Issue
157+
assert assert.BoolAssertionFunc
158+
}{
159+
{
160+
desc: "typecheck issue",
161+
strict: false,
162+
issue: &result.Issue{
163+
FromLinter: "typecheck",
164+
},
165+
assert: assert.True,
166+
},
167+
{
168+
desc: "go.mod",
169+
strict: false,
170+
issue: &result.Issue{
171+
FromLinter: "example",
172+
Pos: token.Position{
173+
Filename: filepath.FromSlash("/a/b/c/go.mod"),
174+
},
175+
},
176+
assert: assert.True,
177+
},
178+
{
179+
desc: "non Go file",
180+
strict: false,
181+
issue: &result.Issue{
182+
FromLinter: "example",
183+
Pos: token.Position{
184+
Filename: filepath.FromSlash("/a/b/c/test.txt"),
185+
},
186+
},
187+
assert: assert.False,
188+
},
189+
{
190+
desc: "lax ",
191+
strict: false,
192+
issue: &result.Issue{
193+
FromLinter: "example",
194+
Pos: token.Position{
195+
Filename: filepath.FromSlash("testdata/autogen_go_strict_invalid.go"),
196+
},
197+
},
198+
assert: assert.False,
199+
},
200+
{
201+
desc: "strict ",
202+
strict: true,
203+
issue: &result.Issue{
204+
FromLinter: "example",
205+
Pos: token.Position{
206+
Filename: filepath.FromSlash("testdata/autogen_go_strict_invalid.go"),
207+
},
208+
},
209+
assert: assert.True,
210+
},
211+
}
212+
213+
for _, test := range testCases {
214+
test := test
215+
t.Run(test.desc, func(t *testing.T) {
216+
t.Parallel()
217+
218+
p := NewAutogeneratedExclude(test.strict)
219+
220+
pass, err := p.shouldPassIssue(test.issue)
221+
require.NoError(t, err)
222+
223+
test.assert(t, pass)
224+
})
225+
}
226+
}
227+
228+
func Test_shouldPassIssue_error(t *testing.T) {
229+
testCases := []struct {
230+
desc string
231+
strict bool
232+
issue *result.Issue
233+
expected string
234+
}{
235+
{
236+
desc: "missing Filename",
237+
strict: false,
238+
issue: &result.Issue{
239+
FromLinter: "example",
240+
Pos: token.Position{
241+
Filename: "",
242+
},
243+
},
244+
expected: "no file path for issue",
245+
},
246+
{
247+
desc: "non-existing file (lax)",
248+
strict: false,
249+
issue: &result.Issue{
250+
FromLinter: "example",
251+
Pos: token.Position{
252+
Filename: filepath.FromSlash("./no-existing.go"),
253+
},
254+
},
255+
expected: "failed to get doc (lax) of file ./no-existing.go: failed to parse file: open ./no-existing.go: no such file or directory",
256+
},
257+
{
258+
desc: "non-existing file (strict)",
259+
strict: true,
260+
issue: &result.Issue{
261+
FromLinter: "example",
262+
Pos: token.Position{
263+
Filename: filepath.FromSlash("./no-existing.go"),
264+
},
265+
},
266+
expected: "failed to get doc (strict) of file ./no-existing.go: failed to parse file: open ./no-existing.go: no such file or directory",
267+
},
268+
}
269+
270+
for _, test := range testCases {
271+
test := test
272+
t.Run(test.desc, func(t *testing.T) {
273+
t.Parallel()
274+
275+
p := NewAutogeneratedExclude(test.strict)
276+
277+
pass, err := p.shouldPassIssue(test.issue)
278+
279+
assert.EqualError(t, err, test.expected)
280+
assert.False(t, pass)
281+
})
282+
}
283+
}

0 commit comments

Comments
 (0)