using System.Linq.Expressions;

namespace ZeroFramework.DeviceCenter.Infrastructure.Specifications.Extensions
{
    internal class ParameterReplacerVisitor : ExpressionVisitor
    {
        private readonly Expression newExpression;

        private readonly ParameterExpression oldParameter;

        private ParameterReplacerVisitor(ParameterExpression oldParameter, Expression newExpression)
        {
            this.oldParameter = oldParameter;
            this.newExpression = newExpression;
        }

        internal static Expression Replace(Expression expression, ParameterExpression oldParameter, Expression newExpression)
        {
            return new ParameterReplacerVisitor(oldParameter, newExpression).Visit(expression);
        }

        protected override Expression VisitParameter(ParameterExpression p)
        {
            if (p == oldParameter)
            {
                return newExpression;
            }
            else
            {
                return p;
            }
        }
    }
}