|
6 | 6 | "go/types"
|
7 | 7 |
|
8 | 8 | "golang.org/x/tools/go/analysis"
|
| 9 | + |
| 10 | + "github.com/Antonboom/testifylint/internal/analysisutil" |
| 11 | + "github.com/Antonboom/testifylint/internal/testify" |
9 | 12 | )
|
10 | 13 |
|
11 | 14 | // ErrorIsAs detects situations like
|
@@ -34,7 +37,7 @@ func (ErrorIsAs) Name() string { return "error-is-as" }
|
34 | 37 | func (checker ErrorIsAs) Check(pass *analysis.Pass, call *CallMeta) *analysis.Diagnostic {
|
35 | 38 | switch call.Fn.NameFTrimmed {
|
36 | 39 | case "Error":
|
37 |
| - if len(call.Args) >= 2 && isError(pass, call.Args[1]) { |
| 40 | + if len(call.Args) >= 2 && isError(pass, call.Args[1]) && !isAssertCollectT(pass, call.Selector.X) { |
38 | 41 | const proposed = "ErrorIs"
|
39 | 42 | msg := fmt.Sprintf("invalid usage of %[1]s.Error, use %[1]s.%[2]s instead", call.SelectorXStr, proposed)
|
40 | 43 | return newDiagnostic(checker.Name(), call, msg, newSuggestedFuncReplacement(call, proposed))
|
@@ -146,3 +149,18 @@ func (checker ErrorIsAs) Check(pass *analysis.Pass, call *CallMeta) *analysis.Di
|
146 | 149 | }
|
147 | 150 | return nil
|
148 | 151 | }
|
| 152 | + |
| 153 | +func isAssertCollectT(pass *analysis.Pass, e ast.Expr) bool { |
| 154 | + ptr, ok := pass.TypesInfo.TypeOf(e).(*types.Pointer) |
| 155 | + if !ok { |
| 156 | + return false |
| 157 | + } |
| 158 | + |
| 159 | + named, ok := ptr.Elem().(*types.Named) |
| 160 | + if !ok { |
| 161 | + return false |
| 162 | + } |
| 163 | + |
| 164 | + collectT := analysisutil.ObjectOf(pass.Pkg, testify.AssertPkgPath, "CollectT") |
| 165 | + return named.Obj() == collectT |
| 166 | +} |
0 commit comments