func (s *state) evalFieldChain(dot, receiver reflect.Value, node *expr.IdentityNode, ident []string, args []expr.Node, final reflect.Value) reflect.Value {
	n := len(ident)
	for i := 0; i < n-1; i++ {
		receiver = s.evalField(dot, ident[i], node, nil, zero, receiver)
	}
	// Now if it's a method, it gets the arguments.
	return s.evalField(dot, ident[n-1], node, args, final, receiver)
}
// evalFieldChain evaluates .X.Y.Z possibly followed by arguments.
// dot is the environment in which to evaluate arguments, while
// receiver is the value being walked along the chain.
evalFieldChain evaluates .X.Y.Z possibly followed by arguments.
dot is the environment in which to evaluate arguments, while
receiver is the value being walked along the chain.
// evalFieldChain evaluates . X . Y . Z possibly followed by arguments . // dot is the environment in which to evaluate arguments while // receiver is the value being walked along the chain .
func (s *state) evalFieldChain(dot, receiver reflect.Value, node *expr.IdentityNode, ident []string, args []expr.Node, final reflect.Value) reflect.Value {
	n := len(ident)
	for i := 0; i < n-1; i++ {
		receiver = s.evalField(dot, ident[i], node, nil, zero, receiver)
	}
	return s.evalField(dot, ident[n-1], node, args, final, receiver)
}
func ( s * state ) evalFieldChain ( dot , receiver reflect . Value , node * expr . IdentityNode , ident [ ] string , args [ ] expr . Node , final reflect . Value ) reflect . Value { n := len ( ident ) for i := 0 ; i < n - 1 ; i ++ { receiver = s . evalField ( dot , ident [ i ] , node , nil , zero , receiver ) } return s . evalField ( dot , ident [ n - 1 ] , node , args , final , receiver ) }
evalFieldChain evaluates .X.Y.Z possibly followed by arguments.
evalFieldChain evaluates . X . Y . Z possibly followed by arguments .
// Now if it's a method, it gets the arguments.