-
Notifications
You must be signed in to change notification settings - Fork 4
/
interface.go
121 lines (118 loc) · 2.87 KB
/
interface.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package switcher
import "golang.org/x/tools/go/ssa"
// Switcher represents a ssa instruction switcher
type Switcher interface {
CaseAlloc(inst *ssa.Alloc)
CasePhi(inst *ssa.Phi)
CaseCall(inst *ssa.Call)
CaseBinOp(inst *ssa.BinOp)
CaseUnOp(inst *ssa.UnOp)
CaseChangeType(inst *ssa.ChangeType)
CaseConvert(inst *ssa.Convert)
CaseChangeInterface(inst *ssa.ChangeInterface)
CaseSliceToArrayPointer(inst *ssa.SliceToArrayPointer)
CaseMakeInterface(inst *ssa.MakeInterface)
CaseMakeClosure(inst *ssa.MakeClosure)
CaseMakeMap(inst *ssa.MakeMap)
CaseMakeChan(inst *ssa.MakeChan)
CaseMakeSlice(inst *ssa.MakeSlice)
CaseSlice(inst *ssa.Slice)
CaseFieldAddr(inst *ssa.FieldAddr)
CaseField(inst *ssa.Field)
CaseIndexAddr(inst *ssa.IndexAddr)
CaseIndex(inst *ssa.Index)
CaseLookup(inst *ssa.Lookup)
CaseSelect(inst *ssa.Select)
CaseRange(inst *ssa.Range)
CaseNext(inst *ssa.Next)
CaseTypeAssert(inst *ssa.TypeAssert)
CaseExtract(inst *ssa.Extract)
CaseJump(inst *ssa.Jump)
CaseIf(inst *ssa.If)
CaseReturn(inst *ssa.Return)
CaseRunDefers(inst *ssa.RunDefers)
CasePanic(inst *ssa.Panic)
CaseGo(inst *ssa.Go)
CaseDefer(inst *ssa.Defer)
CaseSend(inst *ssa.Send)
CaseStore(inst *ssa.Store)
CaseMapUpdate(inst *ssa.MapUpdate)
CaseDebugRef(inst *ssa.DebugRef)
}
// Apply call specific method based on type of the instruction
func Apply(s Switcher, _inst ssa.Instruction) {
switch inst := _inst.(type) {
case *ssa.Alloc:
s.CaseAlloc(inst)
case *ssa.Phi:
s.CasePhi(inst)
case *ssa.Call:
s.CaseCall(inst)
case *ssa.BinOp:
s.CaseBinOp(inst)
case *ssa.UnOp:
s.CaseUnOp(inst)
case *ssa.ChangeType:
s.CaseChangeType(inst)
case *ssa.Convert:
s.CaseConvert(inst)
case *ssa.ChangeInterface:
s.CaseChangeInterface(inst)
case *ssa.SliceToArrayPointer:
s.CaseSliceToArrayPointer(inst)
case *ssa.MakeInterface:
s.CaseMakeInterface(inst)
case *ssa.MakeClosure:
s.CaseMakeClosure(inst)
case *ssa.MakeMap:
s.CaseMakeMap(inst)
case *ssa.MakeChan:
s.CaseMakeChan(inst)
case *ssa.MakeSlice:
s.CaseMakeSlice(inst)
case *ssa.Slice:
s.CaseSlice(inst)
case *ssa.FieldAddr:
s.CaseFieldAddr(inst)
case *ssa.Field:
s.CaseField(inst)
case *ssa.IndexAddr:
s.CaseIndexAddr(inst)
case *ssa.Index:
s.CaseIndex(inst)
case *ssa.Lookup:
s.CaseLookup(inst)
case *ssa.Select:
s.CaseSelect(inst)
case *ssa.Range:
s.CaseRange(inst)
case *ssa.Next:
s.CaseNext(inst)
case *ssa.TypeAssert:
s.CaseTypeAssert(inst)
case *ssa.Extract:
s.CaseExtract(inst)
case *ssa.Jump:
s.CaseJump(inst)
case *ssa.If:
s.CaseIf(inst)
case *ssa.Return:
s.CaseReturn(inst)
case *ssa.RunDefers:
s.CaseRunDefers(inst)
case *ssa.Panic:
s.CasePanic(inst)
case *ssa.Go:
s.CaseGo(inst)
case *ssa.Defer:
s.CaseDefer(inst)
case *ssa.Send:
s.CaseSend(inst)
case *ssa.Store:
s.CaseStore(inst)
case *ssa.MapUpdate:
s.CaseMapUpdate(inst)
case *ssa.DebugRef:
s.CaseDebugRef(inst)
}
}