forked from expr-lang/expr
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnode.go
177 lines (146 loc) · 2.32 KB
/
node.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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package ast
import (
"reflect"
"regexp"
"github.com/antonmedv/expr/file"
)
// Node represents items of abstract syntax tree.
type Node interface {
Location() file.Location
SetLocation(file.Location)
Type() reflect.Type
SetType(reflect.Type)
String() string
}
func Patch(node *Node, newNode Node) {
newNode.SetType((*node).Type())
newNode.SetLocation((*node).Location())
*node = newNode
}
type base struct {
loc file.Location
nodeType reflect.Type
}
func (n *base) Location() file.Location {
return n.loc
}
func (n *base) SetLocation(loc file.Location) {
n.loc = loc
}
func (n *base) Type() reflect.Type {
return n.nodeType
}
func (n *base) SetType(t reflect.Type) {
n.nodeType = t
}
type NilNode struct {
base
}
type IdentifierNode struct {
base
Value string
FieldIndex []int
Method bool // true if method, false if field
MethodIndex int // index of method, set only if Method is true
}
type IntegerNode struct {
base
Value int
}
type FloatNode struct {
base
Value float64
}
type BoolNode struct {
base
Value bool
}
type StringNode struct {
base
Value string
}
type ConstantNode struct {
base
Value any
}
type UnaryNode struct {
base
Operator string
Node Node
}
type BinaryNode struct {
base
Regexp *regexp.Regexp
Operator string
Left Node
Right Node
}
type ChainNode struct {
base
Node Node
}
type MemberNode struct {
base
Node Node
Property Node
Name string // Name of the filed or method. Used for error reporting.
Optional bool
FieldIndex []int
// TODO: Combine Method and MethodIndex into a single MethodIndex field of &int type.
Method bool
MethodIndex int
}
type SliceNode struct {
base
Node Node
From Node
To Node
}
type CallNode struct {
base
Callee Node
Arguments []Node
Typed int
Fast bool
Func *Function
}
type BuiltinNode struct {
base
Name string
Arguments []Node
Throws bool
Map Node
}
type ClosureNode struct {
base
Node Node
}
type PointerNode struct {
base
Name string
}
type ConditionalNode struct {
base
Cond Node
Exp1 Node
Exp2 Node
}
type VariableDeclaratorNode struct {
base
Name string
Value Node
Expr Node
}
type ArrayNode struct {
base
Nodes []Node
}
type MapNode struct {
base
Pairs []Node
}
type PairNode struct {
base
Key Node
Value Node
}