Skip to content

Commit ddf617f

Browse files
committed
code review.
1 parent 6c2f5ec commit ddf617f

File tree

1 file changed

+46
-45
lines changed

1 file changed

+46
-45
lines changed

wastedassign.go

Lines changed: 46 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package wastedassign
22

33
import (
4-
"fmt"
4+
"errors"
55
"go/ast"
66
"go/token"
77
"go/types"
@@ -14,7 +14,7 @@ import (
1414

1515
const doc = "wastedassign finds wasted assignment statements."
1616

17-
// Analyzer is ...
17+
// Analyzer is the wastedassign analyzer.
1818
var Analyzer = &analysis.Analyzer{
1919
Name: "wastedassign",
2020
Doc: doc,
@@ -31,8 +31,7 @@ type wastedAssignStruct struct {
3131

3232
func run(pass *analysis.Pass) (interface{}, error) {
3333
// Plundered from buildssa.Run.
34-
mode := ssa.NaiveForm
35-
prog := ssa.NewProgram(pass.Fset, mode)
34+
prog := ssa.NewProgram(pass.Fset, ssa.NaiveForm)
3635

3736
// Create SSA packages for all imports.
3837
// Order is not significant.
@@ -73,12 +72,12 @@ func run(pass *analysis.Pass) (interface{}, error) {
7372

7473
fn := pass.TypesInfo.Defs[fdecl.Name].(*types.Func)
7574
if fn == nil {
76-
return nil, fmt.Errorf("failed to get func's typesinfo")
75+
return nil, errors.New("failed to get func's typesinfo")
7776
}
7877

7978
f := ssapkg.Prog.FuncValue(fn)
8079
if f == nil {
81-
return nil, fmt.Errorf("failed to get func's SSA-form intermediate representation")
80+
return nil, errors.New("failed to get func's SSA-form intermediate representation")
8281
}
8382

8483
var addAnons func(f *ssa.Function)
@@ -96,41 +95,50 @@ func run(pass *analysis.Pass) (interface{}, error) {
9695
typeSwitchPos := map[int]bool{}
9796
inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector)
9897
inspect.Preorder([]ast.Node{new(ast.TypeSwitchStmt)}, func(n ast.Node) {
99-
switch n := n.(type) {
100-
case *ast.TypeSwitchStmt:
98+
if _, ok := n.(*ast.TypeSwitchStmt); ok {
10199
typeSwitchPos[pass.Fset.Position(n.Pos()).Line] = true
102100
}
103101
})
104102

105-
wastedAssignMap := []wastedAssignStruct{}
103+
var wastedAssignMap []wastedAssignStruct
106104

107105
for _, sf := range srcFuncs {
108106
for _, bl := range sf.Blocks {
109107
blCopy := *bl
110108
for _, ist := range bl.Instrs {
111109
blCopy.Instrs = rmInstrFromInstrs(blCopy.Instrs, ist)
112-
switch ist.(type) {
113-
case *ssa.Store:
114-
var buf [10]*ssa.Value
115-
for _, op := range ist.Operands(buf[:0]) {
116-
if (*op) != nil && opInLocals(sf.Locals, op) {
117-
if reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op, nil); reason != notWasted {
118-
if ist.Pos() != 0 && !typeSwitchPos[pass.Fset.Position(ist.Pos()).Line] {
119-
wastedAssignMap = append(wastedAssignMap, wastedAssignStruct{
120-
pos: ist.Pos(),
121-
reason: reason.String(),
122-
})
123-
}
124-
}
125-
}
110+
if _, ok := ist.(*ssa.Store); !ok {
111+
continue
112+
}
113+
114+
var buf [10]*ssa.Value
115+
for _, op := range ist.Operands(buf[:0]) {
116+
if (*op) == nil || !opInLocals(sf.Locals, op) {
117+
continue
126118
}
119+
120+
reason := isNextOperationToOpIsStore([]*ssa.BasicBlock{&blCopy}, op, nil)
121+
if reason == notWasted {
122+
continue
123+
}
124+
125+
if ist.Pos() == 0 || typeSwitchPos[pass.Fset.Position(ist.Pos()).Line] {
126+
continue
127+
}
128+
129+
wastedAssignMap = append(wastedAssignMap, wastedAssignStruct{
130+
pos: ist.Pos(),
131+
reason: reason.String(),
132+
})
127133
}
128134
}
129135
}
130136
}
137+
131138
for _, was := range wastedAssignMap {
132139
pass.Reportf(was.pos, was.reason)
133140
}
141+
134142
return nil, nil
135143
}
136144

@@ -150,28 +158,31 @@ func (wr wastedReason) String() string {
150158
return "wasted assignment"
151159
case notWasted:
152160
return ""
161+
default:
162+
return ""
153163
}
154-
return ""
155164
}
156165

157-
func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap *map[int]bool) wastedReason {
158-
wastedReasons := []wastedReason{}
159-
wastedReasonsCurrentBls := []wastedReason{}
166+
func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, haveCheckedMap map[int]bool) wastedReason {
167+
var wastedReasons []wastedReason
168+
var wastedReasonsCurrentBls []wastedReason
160169

161170
if haveCheckedMap == nil {
162-
haveCheckedMap = &map[int]bool{}
171+
haveCheckedMap = map[int]bool{}
163172
}
164173

165174
for _, bl := range bls {
166-
if (*haveCheckedMap)[bl.Index] == true {
175+
if haveCheckedMap[bl.Index] {
167176
continue
168177
}
169-
(*haveCheckedMap)[bl.Index] = true
178+
179+
haveCheckedMap[bl.Index] = true
170180
breakFlag := false
171181
for _, ist := range bl.Instrs {
172182
if breakFlag {
173183
break
174184
}
185+
175186
switch w := ist.(type) {
176187
case *ssa.Store:
177188
var buf [10]*ssa.Value
@@ -196,6 +207,7 @@ func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, hav
196207
}
197208
}
198209
}
210+
199211
if len(bl.Succs) != 0 && !breakFlag {
200212
wastedReason := isNextOperationToOpIsStore(rmSameBlock(bl.Succs, bl), currentOp, haveCheckedMap)
201213
if wastedReason == notWasted {
@@ -207,17 +219,15 @@ func isNextOperationToOpIsStore(bls []*ssa.BasicBlock, currentOp *ssa.Value, hav
207219

208220
wastedReasons = append(wastedReasons, wastedReasonsCurrentBls...)
209221

210-
if len(wastedReasons) != 0 {
211-
if containReassignedSoon(wastedReasons) {
212-
return reassignedSoon
213-
}
214-
return noUseUntilReturn
222+
if len(wastedReasons) != 0 && containReassignedSoon(wastedReasons) {
223+
return reassignedSoon
215224
}
225+
216226
return noUseUntilReturn
217227
}
218228

219229
func rmSameBlock(bls []*ssa.BasicBlock, currentBl *ssa.BasicBlock) []*ssa.BasicBlock {
220-
rto := []*ssa.BasicBlock{}
230+
var rto []*ssa.BasicBlock
221231

222232
for _, bl := range bls {
223233
if bl != currentBl {
@@ -227,15 +237,6 @@ func rmSameBlock(bls []*ssa.BasicBlock, currentBl *ssa.BasicBlock) []*ssa.BasicB
227237
return rto
228238
}
229239

230-
func containNotWasted(ws []wastedReason) bool {
231-
for _, w := range ws {
232-
if w == notWasted {
233-
return true
234-
}
235-
}
236-
return false
237-
}
238-
239240
func containReassignedSoon(ws []wastedReason) bool {
240241
for _, w := range ws {
241242
if w == reassignedSoon {

0 commit comments

Comments
 (0)