explicitreturn/analyzer/analyzer.go

56 lines
1.2 KiB
Go

package analyzer
import (
"flag"
"go/ast"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/passes/inspect"
"golang.org/x/tools/go/ast/inspector"
)
var Analyzer = &analysis.Analyzer{
Name: "explicitreturn",
Doc: "Enforces explicit return statements",
Flags: flag.FlagSet{},
Run: run,
Requires: []*analysis.Analyzer{inspect.Analyzer},
}
func run(pass *analysis.Pass) (interface{}, error) {
inspector := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
// only filter function defintions
nodeFilter := []ast.Node{
(*ast.FuncDecl)(nil),
(*ast.FuncLit)(nil),
}
inspector.Preorder(nodeFilter, func(node ast.Node) {
var funcBody *ast.BlockStmt
switch n := node.(type) {
case *ast.FuncLit:
funcBody = n.Body
for _, statement := range funcBody.List {
s, ok := statement.(*ast.ReturnStmt)
if ok && s.Results == nil {
pass.Reportf(s.Pos(), "implicit return found for anonymous function")
}
}
case *ast.FuncDecl:
funcBody = n.Body
for _, statement := range funcBody.List {
s, ok := statement.(*ast.ReturnStmt)
if ok && s.Results == nil {
pass.Reportf(s.Return, "implicit return found in function %s", n.Name)
}
}
default:
return
}
})
return nil, nil
}