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 }