From 3f4e4cf94596eaae380385d81f9a629fbee0eb7d Mon Sep 17 00:00:00 2001 From: Teddy Wing Date: Sat, 20 May 2023 21:31:05 +0200 Subject: 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. --- defererr.go | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'defererr.go') 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 }, ) -- cgit v1.2.3