From ce096d59ba5c423e24d8778804952a32003c7515 Mon Sep 17 00:00:00 2001 From: chavacava Date: Wed, 4 Dec 2024 07:14:35 +0100 Subject: [PATCH] fix: confusing-results doesn't work with pointer types --- rule/confusing_results.go | 69 +++++++++++++++-------------------- testdata/confusing_results.go | 10 ++++- 2 files changed, 38 insertions(+), 41 deletions(-) diff --git a/rule/confusing_results.go b/rule/confusing_results.go index 1b79ada9c..c1804d124 100644 --- a/rule/confusing_results.go +++ b/rule/confusing_results.go @@ -13,54 +13,43 @@ type ConfusingResultsRule struct{} func (*ConfusingResultsRule) Apply(file *lint.File, _ lint.Arguments) []lint.Failure { var failures []lint.Failure - fileAst := file.AST - walker := lintConfusingResults{ - onFailure: func(failure lint.Failure) { - failures = append(failures, failure) - }, - } + for _, decl := range file.AST.Decls { + funcDecl, ok := decl.(*ast.FuncDecl) - ast.Walk(walker, fileAst) + isFunctionWithMoreThanOneResult := ok && funcDecl.Type.Results != nil && len(funcDecl.Type.Results.List) > 1 + if !isFunctionWithMoreThanOneResult { + continue + } - return failures -} + resultsAreNamed := len(funcDecl.Type.Results.List[0].Names) > 0 + if resultsAreNamed { + continue + } -// Name returns the rule name. -func (*ConfusingResultsRule) Name() string { - return "confusing-results" -} + lastType := "" + for _, result := range funcDecl.Type.Results.List { -type lintConfusingResults struct { - onFailure func(lint.Failure) -} + resultTypeName := gofmt(result.Type) -func (w lintConfusingResults) Visit(n ast.Node) ast.Visitor { - fn, ok := n.(*ast.FuncDecl) - if !ok || fn.Type.Results == nil || len(fn.Type.Results.List) < 2 { - return w - } - lastType := "" - for _, result := range fn.Type.Results.List { - if len(result.Names) > 0 { - return w - } + if resultTypeName == lastType { + failures = append(failures, lint.Failure{ + Node: result, + Confidence: 1, + Category: "naming", + Failure: "unnamed results of the same type may be confusing, consider using named results", + }) - t, ok := result.Type.(*ast.Ident) - if !ok { - return w - } + break + } - if t.Name == lastType { - w.onFailure(lint.Failure{ - Node: n, - Confidence: 1, - Category: "naming", - Failure: "unnamed results of the same type may be confusing, consider using named results", - }) - break + lastType = resultTypeName } - lastType = t.Name } - return w + return failures +} + +// Name returns the rule name. +func (*ConfusingResultsRule) Name() string { + return "confusing-results" } diff --git a/testdata/confusing_results.go b/testdata/confusing_results.go index fc47abe36..6f454146e 100644 --- a/testdata/confusing_results.go +++ b/testdata/confusing_results.go @@ -15,6 +15,14 @@ func GetTaz(a string, b int) string { } -func (t *t) GetTaz(a int, b int) { +func (t *t) GetTaz(a int, b int) { } + +func namedResults() (a string, b string) { + return "nil", "nil" +} + +func pointerResults() (*string, *string) { // MATCH /unnamed results of the same type may be confusing, consider using named results/ + return nil, nil +}