// VisitExpression implements corresponding Visitor interface method func (v *evalVisitor) VisitExpression(node *ast.Expression) interface{} { v.at(node) var result interface{} done := false v.pushExpr(node) // helper call if helperName := node.HelperName(); helperName != "" { if helper := v.findHelper(helperName); helper != zero { result = v.callHelper(helperName, helper, node) done = true } } if !done { // literal if literal, ok := node.LiteralStr(); ok { if val := v.evalField(v.curCtx(), literal, true); val.IsValid() { result = val.Interface() done = true } } } if !done { // field path if path := node.FieldPath(); path != nil { // @todo Find a cleaner way ! Don't break the pattern ! // this is an exception to visitor pattern, because we need to pass the info // that this path is at root of current expression if val := v.evalPathExpression(path, true); val != nil { result = val } } } v.popExpr() return result }
// isHelperCall returns true if given expression is a helper call func (v *evalVisitor) isHelperCall(node *ast.Expression) bool { if helperName := node.HelperName(); helperName != "" { return v.findHelper(helperName) != zero } return false }