aboutsummaryrefslogtreecommitdiffstats
path: root/defererr.go
diff options
context:
space:
mode:
authorTeddy Wing2023-05-20 21:31:05 +0200
committerTeddy Wing2023-05-20 21:31:05 +0200
commit3f4e4cf94596eaae380385d81f9a629fbee0eb7d (patch)
tree3b2bb755878c4cddd08aeeb89e6111457831140f /defererr.go
parent856f21083e814176f9584cdb3d5df4cfdffc4834 (diff)
downloadgodefererr-3f4e4cf94596eaae380385d81f9a629fbee0eb7d.tar.bz2
Report when error declaration in signature is needed
While looking at the assignments in the `defer`, if we encounter an `error`-type assignment, emit a diagnostic if the error named in the lhs of the assignment is not present in the return signature's names. Not sure if this makes sense to me yet. I probably only want to report a problem for a non-declare assignment of an error value when the error type in the return signature is _not_ named at all.
Diffstat (limited to 'defererr.go')
-rw-r--r--defererr.go37
1 files changed, 37 insertions, 0 deletions
diff --git a/defererr.go b/defererr.go
index 338f2c1..8d1cb51 100644
--- a/defererr.go
+++ b/defererr.go
@@ -62,6 +62,7 @@ func run(pass *analysis.Pass) (interface{}, error) {
if len(funcDecl.Type.Results.List[errorReturnIndex].Names) > 0 {
fmt.Printf("return error var name: %#v\n", funcDecl.Type.Results.List[errorReturnIndex].Names[0])
}
+ errorReturnField := funcDecl.Type.Results.List[errorReturnIndex]
ast.Inspect(
funcDecl.Body,
@@ -133,6 +134,25 @@ func run(pass *analysis.Pass) (interface{}, error) {
if named.Obj().Name() == "error" {
deferAssignsError = true
+
+ isErrorNameInReturnSignature := false
+
+ for _, errorReturnIdent := range errorReturnField.Names {
+ if ident.Name == errorReturnIdent.Name {
+ // Report if no matches
+ isErrorNameInReturnSignature = true
+ }
+ }
+
+ if !isErrorNameInReturnSignature {
+ pass.Reportf(
+ errorReturnField.Pos(),
+ "return signature should be '(err error)'", // TODO: Use name from ident.Name
+ // errorReturnField,
+ )
+
+ break
+ }
}
}
@@ -142,6 +162,23 @@ func run(pass *analysis.Pass) (interface{}, error) {
// TODO: Check that funcDecl declares error in signature (check before ast.Inspect on function body, report here)
+ // isErrorNameInReturnSignature := false
+ //
+ // for _, errorReturnIdent := range errorReturnField.Names {
+ // if ident.Name == errorReturnIdent.Name {
+ // // Report if no matches
+ // isErrorNameInReturnSignature = true
+ // }
+ // }
+ //
+ // if !isErrorNameInReturnSignature {
+ // pass.Reportf(
+ // errorReturnField.Pos(),
+ // "return signature should be '(err error)' (TODO)",
+ // errorReturnField,
+ // )
+ // }
+
return true
},
)