aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--defererr.go16
-rw-r--r--testdata/signature.go13
2 files changed, 29 insertions, 0 deletions
diff --git a/defererr.go b/defererr.go
index 063da7e..4d1ba6b 100644
--- a/defererr.go
+++ b/defererr.go
@@ -176,6 +176,21 @@ func checkFunctions(pass *analysis.Pass, node ast.Node) {
// TODO: Get returnStmt.Results[error index from function result signature]
// If not variable and name not [error variable name from defer], report diagnostic
+ returnError := returnStmt.Results[errorReturnIndex]
+ t := pass.TypesInfo.Types[returnError]
+ fmt.Printf("returnStmt value type: %#v\n", t)
+ fmt.Printf("returnStmt type type: %#v\n", t.Type)
+
+ // TODO: Require t.Type to be *types.Named
+ _, ok = t.Type.(*types.Named)
+ if !ok {
+ // TODO: report
+ return true
+ }
+
+ fmt.Printf("returnError: %#v\n", returnError)
+ if returnError.Name == x {
+ }
return true
},
@@ -266,6 +281,7 @@ func checkErrorAssignedInDefer(
isErrorNameInReturnSignature := false
+ // TODO: Use the var name in return statement checks.
for _, errorReturnIdent := range errorReturnField.Names {
if ident.Name == errorReturnIdent.Name {
// Report if no matches
diff --git a/testdata/signature.go b/testdata/signature.go
index d780240..c839934 100644
--- a/testdata/signature.go
+++ b/testdata/signature.go
@@ -29,3 +29,16 @@ func doesDeclareErrInSignature() (err error) {
return nil // want "does not return 'err'"
}
+
+func good() (err error) {
+ err = nil
+ if err != nil {
+ return err
+ }
+
+ defer func() {
+ err = errors.New("defer error")
+ }()
+
+ return err
+}