Skip to content

Commit

Permalink
Better support for defer func literals
Browse files Browse the repository at this point in the history
  • Loading branch information
bombsimon committed Nov 24, 2020
1 parent 52b83c4 commit a6e08b3
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 6 deletions.
30 changes: 24 additions & 6 deletions wsl.go
Original file line number Diff line number Diff line change
Expand Up @@ -338,10 +338,10 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {

// We could potentially have a block which require us to check the first
// argument before ruling out an allowed cuddle.
var assignedFirstInBlock []string
var calledOrAssignedFirstInBlock []string

if firstBodyStatement != nil {
assignedFirstInBlock = p.findLHS(firstBodyStatement)
calledOrAssignedFirstInBlock = append(p.findLHS(firstBodyStatement), p.findRHS(firstBodyStatement)...)
}

var (
Expand Down Expand Up @@ -453,7 +453,7 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {
continue
}

if atLeastOneInListsMatch(assignedOnLineAbove, assignedFirstInBlock) {
if atLeastOneInListsMatch(assignedOnLineAbove, calledOrAssignedFirstInBlock) {
continue
}

Expand Down Expand Up @@ -548,7 +548,7 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {
}

if !atLeastOneInListsMatch(rightAndLeftHandSide, assignedOnLineAbove) {
if !atLeastOneInListsMatch(assignedOnLineAbove, assignedFirstInBlock) {
if !atLeastOneInListsMatch(assignedOnLineAbove, calledOrAssignedFirstInBlock) {
p.addError(t.Pos(), reasonRangeCuddledWithoutUse)
}
}
Expand Down Expand Up @@ -591,6 +591,24 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {
continue
}

// Allow use to cuddled defer func literals with usages on line
// abouve. Example:
// b := getB()
// defer func() {
// makesSenseToUse(b)
// }()
if c, ok := t.Call.Fun.(*ast.FuncLit); ok {
funcLitFirstStmt := append(p.findLHS(c.Body), p.findRHS(c.Body)...)

if atLeastOneInListsMatch(assignedOnLineAbove, funcLitFirstStmt) {
continue
}
}

if atLeastOneInListsMatch(assignedOnLineAbove, calledOrAssignedFirstInBlock) {
continue
}

if !atLeastOneInListsMatch(rightAndLeftHandSide, assignedOnLineAbove) {
p.addError(t.Pos(), reasonDeferCuddledWithOtherVar)
}
Expand All @@ -611,7 +629,7 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {
// comments regarding variable usages on the line before or as the
// first line in the block for details.
if !atLeastOneInListsMatch(rightAndLeftHandSide, assignedOnLineAbove) {
if !atLeastOneInListsMatch(assignedOnLineAbove, assignedFirstInBlock) {
if !atLeastOneInListsMatch(assignedOnLineAbove, calledOrAssignedFirstInBlock) {
p.addError(t.Pos(), reasonForCuddledAssignWithoutUse)
}
}
Expand Down Expand Up @@ -654,7 +672,7 @@ func (p *Processor) parseBlockStatements(statements []ast.Stmt) {
if !atLeastOneInListsMatch(rightHandSide, assignedOnLineAbove) {
// Allow type assertion on variables used in the first case
// immediately.
if !atLeastOneInListsMatch(assignedOnLineAbove, assignedFirstInBlock) {
if !atLeastOneInListsMatch(assignedOnLineAbove, calledOrAssignedFirstInBlock) {
p.addError(t.Pos(), reasonTypeSwitchCuddledWithoutUse)
}
}
Expand Down
16 changes: 16 additions & 0 deletions wsl_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1215,6 +1215,22 @@ func TestShouldAddEmptyLines(t *testing.T) {
reasonAssignsCuddleAssign,
},
},
{
description: "should allow defer func literals just like any block",
code: []byte(`package main
func main() {
tx := BeginTx(db)
defer func() {
EndTx(tx, err)
}()
i := 100
defer func() {
i = 0
}()
}`),
},
}

for _, tc := range cases {
Expand Down

0 comments on commit a6e08b3

Please sign in to comment.