Skip to content

build(deps): bump github.com/alexkohler/nakedret to 2.0.1 #3760

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Apr 14, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24
github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0
github.com/OpenPeeDeeP/depguard v1.1.1
github.com/alexkohler/nakedret/v2 v2.0.1
github.com/alexkohler/prealloc v1.0.0
github.com/alingse/asasalint v0.0.11
github.com/ashanbrown/forbidigo v1.5.1
Expand Down
2 changes: 2 additions & 0 deletions go.sum

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

121 changes: 7 additions & 114 deletions pkg/golinters/nakedret.go
Original file line number Diff line number Diff line change
@@ -1,134 +1,27 @@
package golinters

import (
"fmt"
"go/ast"
"go/token"
"sync"

"github.com/alexkohler/nakedret/v2"
"golang.org/x/tools/go/analysis"

"github.com/golangci/golangci-lint/pkg/config"
"github.com/golangci/golangci-lint/pkg/golinters/goanalysis"
"github.com/golangci/golangci-lint/pkg/lint/linter"
"github.com/golangci/golangci-lint/pkg/result"
)

const nakedretName = "nakedret"

//nolint:dupl
func NewNakedret(settings *config.NakedretSettings) *goanalysis.Linter {
var mu sync.Mutex
var resIssues []goanalysis.Issue

analyzer := &analysis.Analyzer{
Name: nakedretName,
Doc: goanalysis.TheOnlyanalyzerDoc,
Run: func(pass *analysis.Pass) (any, error) {
issues := runNakedRet(pass, settings)

if len(issues) == 0 {
return nil, nil
}

mu.Lock()
resIssues = append(resIssues, issues...)
mu.Unlock()

return nil, nil
},
var maxLines int
if settings != nil {
maxLines = settings.MaxFuncLines
}

analyzer := nakedret.NakedReturnAnalyzer(uint(maxLines))

return goanalysis.NewLinter(
nakedretName,
"Finds naked returns in functions greater than a specified function length",
[]*analysis.Analyzer{analyzer},
nil,
).WithIssuesReporter(func(*linter.Context) []goanalysis.Issue {
return resIssues
}).WithLoadMode(goanalysis.LoadModeSyntax)
}

func runNakedRet(pass *analysis.Pass, settings *config.NakedretSettings) []goanalysis.Issue {
var issues []goanalysis.Issue

for _, file := range pass.Files {
v := nakedretVisitor{
maxLength: settings.MaxFuncLines,
f: pass.Fset,
}

ast.Walk(&v, file)

for i := range v.issues {
issues = append(issues, goanalysis.NewIssue(&v.issues[i], pass))
}
}

return issues
}

type nakedretVisitor struct {
maxLength int
f *token.FileSet
issues []result.Issue
}

func (v *nakedretVisitor) processFuncDecl(funcDecl *ast.FuncDecl) {
file := v.f.File(funcDecl.Pos())
functionLineLength := file.Position(funcDecl.End()).Line - file.Position(funcDecl.Pos()).Line

// Scan the body for usage of the named returns
for _, stmt := range funcDecl.Body.List {
s, ok := stmt.(*ast.ReturnStmt)
if !ok {
continue
}

if len(s.Results) != 0 {
continue
}

file := v.f.File(s.Pos())
if file == nil || functionLineLength <= v.maxLength {
continue
}
if funcDecl.Name == nil {
continue
}

v.issues = append(v.issues, result.Issue{
FromLinter: nakedretName,
Text: fmt.Sprintf("naked return in func `%s` with %d lines of code",
funcDecl.Name.Name, functionLineLength),
Pos: v.f.Position(s.Pos()),
})
}
}

func (v *nakedretVisitor) Visit(node ast.Node) ast.Visitor {
funcDecl, ok := node.(*ast.FuncDecl)
if !ok {
return v
}

var namedReturns []*ast.Ident

// We've found a function
if funcDecl.Type != nil && funcDecl.Type.Results != nil {
for _, field := range funcDecl.Type.Results.List {
for _, ident := range field.Names {
if ident != nil {
namedReturns = append(namedReturns, ident)
}
}
}
}

if len(namedReturns) == 0 || funcDecl.Body == nil {
return v
}

v.processFuncDecl(funcDecl)
return v
).WithLoadMode(goanalysis.LoadModeSyntax)
}
10 changes: 7 additions & 3 deletions test/testdata/nakedret.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
//golangcitest:args -Enakedret
package testdata

import "fmt"

func NakedretIssue() (a int, b string) {
if a > 0 {
return
return // want "naked return in func `NakedretIssue` with 33 lines of code"
}

fmt.Println("nakedret")
Comment on lines +8 to +11
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ldez were these fmt.Println() updates intentional?

should it still test the edge case of 31 lines, by removing two // ... lines below?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes the println is intentional, because I wanted to have at least one std import.


if b == "" {
return 0, "0"
}
Expand All @@ -30,8 +34,8 @@ func NakedretIssue() (a int, b string) {
// ...
// ...

// len of this function is 31
return // want "naked return in func `NakedretIssue` with 31 lines of code"
// len of this function is 33
return // want "naked return in func `NakedretIssue` with 33 lines of code"
}

func NoNakedretIssue() (a int, b string) {
Expand Down