protected override Expression VisitVelocityExpression(VelocityExpression node)
 {
     if (_symbolDocument != null)
     {
         var extension = node as VelocityExpression;
         if (extension != null && extension.SourceInfo != null && extension.SourceInfo != _currentSourceInfo)
         {
             _currentSourceInfo = extension.SourceInfo;
             return(Expression.Block(
                        Expression.DebugInfo(_symbolDocument, _currentSourceInfo.StartLine, _currentSourceInfo.StartColumn, _currentSourceInfo.EndLine, _currentSourceInfo.EndColumn),
                        Visit(node)
                        ));
         }
     }
     return(base.VisitVelocityExpression(node));
 }
        protected virtual Expression VisitVelocityExpression(VelocityExpression node)
        {
            switch (node.VelocityExpressionType)
            {
            case VelocityExpressionType.CoerceToBoolean:
                return(VisitCoerceToBoolean((CoerceToBooleanExpression)node));

            case VelocityExpressionType.CustomDirective:
                return(VisitCustomDirective((CustomDirectiveExpression)node));

            case VelocityExpressionType.Dictionary:
                return(VisitDictionary((DictionaryExpression)node));

            case VelocityExpressionType.DictionaryString:
                return(VisitDictionaryString((DictionaryStringExpression)node));

            case VelocityExpressionType.Directive:
                return(VisitDirective((Directive)node));

            case VelocityExpressionType.DirectiveWord:
                return(VisitDirectiveWord((DirectiveWord)node));

            case VelocityExpressionType.Foreach:
                return(VisitForeach((ForeachExpression)node));

            case VelocityExpressionType.GlobalVariable:
                return(VisitGlobalVariable((GlobalVariableExpression)node));

            case VelocityExpressionType.IndexInvocation:
                return(VisitIndexInvocation((IndexInvocationExpression)node));

            case VelocityExpressionType.IntegerRange:
                return(VisitIntegerRange((IntegerRangeExpression)node));

            case VelocityExpressionType.InterpolatedString:
                return(VisitInterpolatedString((InterpolatedStringExpression)node));

            case VelocityExpressionType.Binary:
                return(VisitBinaryOperation((BinaryOperationExpression)node));

            case VelocityExpressionType.MethodInvocation:
                return(VisitMethodInvocation((MethodInvocationExpression)node));

            case VelocityExpressionType.ObjectArray:
                return(VisitObjectArray((ObjectArrayExpression)node));

            case VelocityExpressionType.PropertyAccess:
                return(VisitPropertyAccess((PropertyAccessExpression)node));

            case VelocityExpressionType.Reference:
                return(VisitReference((ReferenceExpression)node));

            case VelocityExpressionType.RenderableExpression:
                return(VisitRenderableExpression((RenderableExpression)node));

            case VelocityExpressionType.RenderedBlock:
                return(VisitRenderedBlock((RenderedBlock)node));

            case VelocityExpressionType.SetDirective:
                return(VisitSetDirective((SetDirective)node));

            case VelocityExpressionType.SetMember:
                return(VisitSetMember((SetMemberExpression)node));

            case VelocityExpressionType.SetIndex:
                return(VisitSetIndex((SetIndexExpression)node));

            case VelocityExpressionType.TemplatedForeach:
                return(VisitTemplatedForEach((TemplatedForeachExpression)node));

            case VelocityExpressionType.Variable:
                return(VisitVariable((VariableExpression)node));

            case VelocityExpressionType.TemporaryVariableScope:
                return(VisitTemporaryVariableScope((TemporaryVariableScopeExpression)node));

            default:
                throw new InvalidOperationException($"Unexpected VelocityExpressionType: {node.VelocityExpressionType}");
            }
        }