Skip to content

Commit 7ba66ee

Browse files
authored
Remove parents field for optimization (#527)
1 parent 98d79a9 commit 7ba66ee

File tree

4 files changed

+11
-12
lines changed

4 files changed

+11
-12
lines changed

Diff for: ast/node.go

+1
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ type MemberNode struct {
133133
Node Node // Node of the member access. Like "foo" in "foo.bar".
134134
Property Node // Property of the member access. For property access it is a StringNode.
135135
Optional bool // If true then the member access is optional. Like "foo?.bar".
136+
Method bool
136137
}
137138

138139
// SliceNode represents access to a slice of an array.

Diff for: checker/checker.go

+5-10
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,6 @@ type checker struct {
5454
config *conf.Config
5555
predicateScopes []predicateScope
5656
varScopes []varScope
57-
parents []ast.Node
5857
err *file.Error
5958
}
6059

@@ -83,7 +82,6 @@ type info struct {
8382
func (v *checker) visit(node ast.Node) (reflect.Type, info) {
8483
var t reflect.Type
8584
var i info
86-
v.parents = append(v.parents, node)
8785
switch n := node.(type) {
8886
case *ast.NilNode:
8987
t, i = v.NilNode(n)
@@ -130,7 +128,6 @@ func (v *checker) visit(node ast.Node) (reflect.Type, info) {
130128
default:
131129
panic(fmt.Sprintf("undefined node type (%T)", node))
132130
}
133-
v.parents = v.parents[:len(v.parents)-1]
134131
node.SetType(t)
135132
return t, i
136133
}
@@ -431,9 +428,6 @@ func (v *checker) ChainNode(node *ast.ChainNode) (reflect.Type, info) {
431428
}
432429

433430
func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) {
434-
base, _ := v.visit(node.Node)
435-
prop, _ := v.visit(node.Property)
436-
437431
// $env variable
438432
if an, ok := node.Node.(*ast.IdentifierNode); ok && an.Value == "$env" {
439433
if name, ok := node.Property.(*ast.StringNode); ok {
@@ -450,6 +444,9 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) {
450444
return anyType, info{}
451445
}
452446

447+
base, _ := v.visit(node.Node)
448+
prop, _ := v.visit(node.Property)
449+
453450
if name, ok := node.Property.(*ast.StringNode); ok {
454451
if base == nil {
455452
return v.error(node, "type %v has no field %v", base, name.Value)
@@ -498,10 +495,8 @@ func (v *checker) MemberNode(node *ast.MemberNode) (reflect.Type, info) {
498495
if field, ok := fetchField(base, propertyName); ok {
499496
return field.Type, info{}
500497
}
501-
if len(v.parents) > 1 {
502-
if _, ok := v.parents[len(v.parents)-2].(*ast.CallNode); ok {
503-
return v.error(node, "type %v has no method %v", base, propertyName)
504-
}
498+
if node.Method {
499+
return v.error(node, "type %v has no method %v", base, propertyName)
505500
}
506501
return v.error(node, "type %v has no field %v", base, propertyName)
507502
}

Diff for: parser/parser.go

+1
Original file line numberDiff line numberDiff line change
@@ -572,6 +572,7 @@ func (p *parser) parsePostfixExpression(node Node) Node {
572572
memberNode.SetLocation(propertyToken.Location)
573573

574574
if p.current.Is(Bracket, "(") {
575+
memberNode.Method = true
575576
node = &CallNode{
576577
Callee: memberNode,
577578
Arguments: p.parseArguments(),

Diff for: parser/parser_test.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -178,13 +178,13 @@ world`},
178178
{
179179
"foo.bar()",
180180
&CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: "foo"},
181-
Property: &StringNode{Value: "bar"}},
181+
Property: &StringNode{Value: "bar"}, Method: true},
182182
Arguments: []Node{}},
183183
},
184184
{
185185
`foo.bar("arg1", 2, true)`,
186186
&CallNode{Callee: &MemberNode{Node: &IdentifierNode{Value: "foo"},
187-
Property: &StringNode{Value: "bar"}},
187+
Property: &StringNode{Value: "bar"}, Method: true},
188188
Arguments: []Node{&StringNode{Value: "arg1"},
189189
&IntegerNode{Value: 2},
190190
&BoolNode{Value: true}}},
@@ -220,12 +220,14 @@ world`},
220220
Property: &StringNode{
221221
Value: "b",
222222
},
223+
Method: true,
223224
},
224225
Arguments: []Node{},
225226
},
226227
Property: &StringNode{
227228
Value: "c",
228229
},
230+
Method: true,
229231
},
230232
Arguments: []Node{},
231233
},

0 commit comments

Comments
 (0)