Skip to content

Commit 9645342

Browse files
committed
ignore named error returns when used in defer per default
1 parent ca1250a commit 9645342

File tree

7 files changed

+353
-350
lines changed

7 files changed

+353
-350
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
nonamedreturns
2+
.vscode/

Readme.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@ I hate named returns in golang because they are error prone. That's why I wrote
44

55
Tutorial on how to write your own linter:
66
https://disaev.me/p/writing-useful-go-analysis-linter/
7+
8+
Named errors used in defers are not reported. If you also want to report them set `report-error-in-defer` to true.

analyzer/analyzer.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
"golang.org/x/tools/go/ast/inspector"
1111
)
1212

13-
const FlagAllowErrorInDefer = "allow-error-in-defer"
13+
const FlagReportErrorInDefer = "report-error-in-defer"
1414

1515
var Analyzer = &analysis.Analyzer{
1616
Name: "nonamedreturns",
@@ -22,12 +22,12 @@ var Analyzer = &analysis.Analyzer{
2222

2323
func flags() flag.FlagSet {
2424
fs := flag.FlagSet{}
25-
fs.Bool(FlagAllowErrorInDefer, false, "do not complain about named error, if it is assigned inside defer")
25+
fs.Bool(FlagReportErrorInDefer, false, "report named error if it is assigned inside defer")
2626
return fs
2727
}
2828

2929
func run(pass *analysis.Pass) (interface{}, error) {
30-
allowErrorInDefer := pass.Analyzer.Flags.Lookup(FlagAllowErrorInDefer).Value.String() == "true"
30+
reportErrorInDefer := pass.Analyzer.Flags.Lookup(FlagReportErrorInDefer).Value.String() == "true"
3131
errorType := types.Universe.Lookup("error").Type()
3232

3333
inspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
@@ -71,7 +71,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
7171
continue
7272
}
7373

74-
if allowErrorInDefer &&
74+
if !reportErrorInDefer &&
7575
types.Identical(pass.TypesInfo.TypeOf(p.Type), errorType) &&
7676
findDeferWithVariableAssignment(funcBody, pass.TypesInfo, pass.TypesInfo.ObjectOf(n)) {
7777
continue

analyzer/analyzer_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ func TestAll(t *testing.T) {
1717
testdata := filepath.Join(filepath.Dir(wd), "testdata")
1818
analysistest.Run(t, testdata, Analyzer, "default-config")
1919

20-
err = Analyzer.Flags.Set(FlagAllowErrorInDefer, "true")
20+
err = Analyzer.Flags.Set(FlagReportErrorInDefer, "true")
2121
if err != nil {
2222
t.Fatalf("Failed to set flag: %s", err)
2323
}
24-
analysistest.Run(t, testdata, Analyzer, "allow-error-in-defer")
24+
analysistest.Run(t, testdata, Analyzer, "report-error-in-defer")
2525
}

testdata/src/allow-error-in-defer/allow_error_in_defer.go

Lines changed: 0 additions & 280 deletions
This file was deleted.

0 commit comments

Comments
 (0)