@@ -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 {
8382func (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
433430func (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 }
0 commit comments