From 73d93662bc520a4381c3a289c38e26684cd7cf48 Mon Sep 17 00:00:00 2001 From: Nahshon Unna-Tsameret Date: Wed, 11 Dec 2024 09:44:53 +0200 Subject: [PATCH] Fix false positive when asserting an error pointer When using a pointer as an error, like in: ```go type myErr struct { code int } func (e *myErr) Error() string { ... } ... err = &myErr{code: 404} Expect(err).To(HaveOccured()) ``` ginkgolinter mistakely detects `err` as not error type. This PR fixes this issue. --- internal/expression/value/value.go | 4 +++ testdata/src/a/haveoccurred/haveoccurred.go | 35 +++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/internal/expression/value/value.go b/internal/expression/value/value.go index dda0dd7..ba74722 100644 --- a/internal/expression/value/value.go +++ b/internal/expression/value/value.go @@ -194,6 +194,10 @@ func IsExprError(pass *analysis.Pass, expr ast.Expr) bool { return interfaces.ImplementsError(actualArgType) case *gotypes.Pointer: + if interfaces.ImplementsError(t) { + return true + } + if tt, ok := t.Elem().(*gotypes.Named); ok { return interfaces.ImplementsError(tt) } diff --git a/testdata/src/a/haveoccurred/haveoccurred.go b/testdata/src/a/haveoccurred/haveoccurred.go index d08487f..021f8b4 100644 --- a/testdata/src/a/haveoccurred/haveoccurred.go +++ b/testdata/src/a/haveoccurred/haveoccurred.go @@ -47,3 +47,38 @@ var _ = Describe("Succeed", func() { }) }) + +type myError struct { + e string +} + +func (e *myError) Error() string { + return e.e +} + +func retErr(str string) *myError { + return &myError{e: str} +} + +var _ = Describe("pointer error", func() { + Context("err pointer var", func() { + It("should not trigger warning", func() { + err := &myError{e: "err"} + Expect(err).To(HaveOccurred()) + }) + + }) + + Context("returned value", func() { + It("should not trigger warning", func() { + err := retErr("err") + Expect(err).To(HaveOccurred()) + }) + }) + + Context("Succeed", func() { + It("should not trigger warning", func() { + Expect(retErr("err")).ToNot(Succeed()) + }) + }) +})