-
Notifications
You must be signed in to change notification settings - Fork 0
/
checker.go
72 lines (59 loc) · 1.4 KB
/
checker.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package readonly
import (
"go/ast"
"golang.org/x/tools/go/analysis"
)
type Checker struct {
pass *analysis.Pass
}
func NewChecker(pass *analysis.Pass) Checker {
return Checker{
pass: pass,
}
}
func (s Checker) Nodes() []ast.Node {
return []ast.Node{(*ast.AssignStmt)(nil), (*ast.IncDecStmt)(nil)}
}
func (s Checker) Check(node ast.Node) {
switch node := node.(type) {
case *ast.AssignStmt:
s.checkAssignStmt(node)
case *ast.IncDecStmt:
s.checkIncDecStmt(node)
}
}
func (s Checker) checkAssignStmt(assign *ast.AssignStmt) {
for _, expr := range assign.Lhs {
s.checkLhs(expr)
}
}
func (s Checker) checkIncDecStmt(incDec *ast.IncDecStmt) {
s.checkLhs(incDec.X)
}
func (s Checker) checkLhs(lhs ast.Expr) {
switch expr := lhs.(type) {
case *ast.SelectorExpr:
s.checkSelectorLhs(expr)
case *ast.StarExpr:
s.checkStarLhs(expr)
case *ast.IndexExpr:
s.checkIndexLhs(expr)
case *ast.ParenExpr:
s.checkParenLhs(expr)
}
}
func (s Checker) checkSelectorLhs(selector *ast.SelectorExpr) {
var fieldSelector = selector.Sel
if s.pass.Pkg != s.pass.TypesInfo.ObjectOf(fieldSelector).Pkg() {
s.pass.Reportf(fieldSelector.Pos(), "readonly: field is being modified")
}
}
func (s Checker) checkStarLhs(star *ast.StarExpr) {
s.checkLhs(star.X)
}
func (s Checker) checkIndexLhs(index *ast.IndexExpr) {
s.checkLhs(index.X)
}
func (s Checker) checkParenLhs(paren *ast.ParenExpr) {
s.checkLhs(paren.X)
}