Skip to content

Commit

Permalink
fix: 事前にtype-switchの位置を調べてそこではエラーが出ないようにした
Browse files Browse the repository at this point in the history
  • Loading branch information
sanposhiho committed Sep 19, 2020
1 parent 4d50e19 commit a372cda
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 3 deletions.
6 changes: 6 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,19 +1,25 @@
github.com/sanposhiho/tools v0.4.5 h1:pXf98dp7iQLmfXcDKDXUyAAjLYcZc9AENSGaU2OnNNI=
github.com/sanposhiho/tools v0.4.5/go.mod h1:59aVZoWPC49+9aLqjfYxCX6iyckGwaz+LaP6nI95s+s=
github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9 h1:psW17arqaxU48Z5kZ0CQnkZWQJsqcURM6tKiBApRjXI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200822124328-c89045814202 h1:VvcQYSHwXgi7W+TpUR6A9g6Up98WAHf3f/ulnJ62IyA=
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208 h1:qwRHBd0NqMbJxfbotnDhm2ByMI1Shq4Y6oRJo21SGJA=
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200902171120-36b1a880d5d1 h1:5SfEmaQTww9A35eeANMuoDMDbba7pCPVplPWQ72i5lY=
Expand Down
16 changes: 16 additions & 0 deletions testdata/src/a/a.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,25 @@
package a

import (
"strings"
)

func p(x int) int {
return x + 1
}

func multiple(val interface{}, times uint) interface{} {

switch hogehoge := val.(type) {
case int:
return 12
case string:
return strings.Repeat(hogehoge, int(times))
default:
return nil
}
}

func noUseParams(params string) int {
a := 12
println(a)
Expand Down
68 changes: 65 additions & 3 deletions wastedassign.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
package wastedassign

import (
"go/ast"
"go/token"

"github.com/sanposhiho/tools/go/analysis/passes/buildssa"
"github.com/sanposhiho/tools/go/analysis/passes/inspect"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/ast/inspector"
"golang.org/x/tools/go/ssa"
)

Expand All @@ -15,12 +20,30 @@ var Analyzer = &analysis.Analyzer{
Run: run,
Requires: []*analysis.Analyzer{
buildssa.Analyzer,
inspect.Analyzer,
},
}

type wastedAssignStruct struct {
pos token.Pos
reason string
}

func run(pass *analysis.Pass) (interface{}, error) {
s := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)

// type switchのあるlineの検出
typeSwitchPos := map[int]bool{}
inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
inspect.Preorder([]ast.Node{new(ast.TypeSwitchStmt)}, func(n ast.Node) {
switch n := n.(type) {
case *ast.TypeSwitchStmt:
typeSwitchPos[pass.Fset.Position(n.Pos()).Line] = true
}
})

wastedAssignMap := []wastedAssignStruct{}

s := pass.ResultOf[buildssa.Analyzer].(*buildssa.SSA)
for _, sf := range s.SrcFuncs {
for _, bl := range sf.Blocks {
blCopy := *bl
Expand All @@ -32,8 +55,11 @@ func run(pass *analysis.Pass) (interface{}, error) {
for _, op := range ist.Operands(buf[:0]) {
if (*op) != nil && opInLocals(sf.Locals, op) {
if reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op, nil); reason != notWasted {
if ist.Pos() != 0 {
pass.Reportf(ist.Pos(), reason.String())
if ist.Pos() != 0 && !typeSwitchPos[pass.Fset.Position(ist.Pos()).Line] {
wastedAssignMap = append(wastedAssignMap, wastedAssignStruct{
pos: ist.Pos(),
reason: reason.String(),
})
}
}
}
Expand All @@ -42,9 +68,45 @@ func run(pass *analysis.Pass) (interface{}, error) {
}
}
}
for _, was := range wastedAssignMap {
pass.Reportf(was.pos, was.reason)
}
return nil, nil
}

func searchTypeSwitchStmt(bodyList []ast.Stmt) []token.Pos {
result := []token.Pos{}

for _, l := range bodyList {
switch a := l.(type) {
case *ast.IfStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, re...)
case *ast.BlockStmt:
re := searchTypeSwitchStmt(a.List)
result = append(result, re...)
case *ast.SwitchStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, a.Pos())
result = append(result, re...)
case *ast.TypeSwitchStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, re...)
case *ast.SelectStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, re...)
case *ast.ForStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, re...)
case *ast.RangeStmt:
re := searchTypeSwitchStmt(a.Body.List)
result = append(result, re...)
}
}

return result
}

type wastedReason string

const (
Expand Down

0 comments on commit a372cda

Please sign in to comment.