Esempio n. 1
0
        public void UpdateWithDifferentTargetOrDefaultReturnsNewLabel()
        {
            LabelTarget        target     = Expression.Label(typeof(int));
            ConstantExpression defaultVal = Expression.Constant(42);
            LabelExpression    label      = Expression.Label(target, defaultVal);

            Assert.NotSame(label, label.Update(Expression.Label(typeof(int)), defaultVal));
            Assert.NotSame(label, label.Update(target, Expression.Constant(42)));
        }
Esempio n. 2
0
        public void UpdateWithSameTargetAndDefaultReturnsSameLabel()
        {
            LabelTarget        target     = Expression.Label(typeof(int));
            ConstantExpression defaultVal = Expression.Constant(42);
            LabelExpression    label      = Expression.Label(target, defaultVal);

            Assert.Same(label, label.Update(target, defaultVal));
        }
        public T?Simplify <T>(T?expression) where T : Expression
        {
            if (expression is null)
            {
                return(null);
            }
            Expression expr = expression.Reduce() switch
            {
                UnaryExpression unaryExpr => unaryExpr.Update(Simplify(unaryExpr.Operand)),
                BinaryExpression binaryExpr => binaryExpr.Update(Simplify(binaryExpr.Left), binaryExpr.Conversion, Simplify(binaryExpr.Right)),
                LambdaExpression lambdaExpr => Expression.Lambda(Simplify(lambdaExpr.Body), lambdaExpr.Name, lambdaExpr.TailCall, Simplify(lambdaExpr.Parameters)),
                TryExpression tryExpr => tryExpr.Update(Simplify(tryExpr.Body), Simplify(tryExpr.Handlers), Simplify(tryExpr.Finally), Simplify(tryExpr.Fault)),
                NewExpression newExpr => newExpr.Update(Simplify(newExpr.Arguments)),
                GotoExpression gotoExpr => gotoExpr.Update(gotoExpr.Target, Simplify(gotoExpr.Value)),
                LoopExpression loopExpr => loopExpr.Update(loopExpr.BreakLabel, loopExpr.ContinueLabel, Simplify(loopExpr.Body)),
                BlockExpression blockExpr => blockExpr.Update(Simplify(blockExpr.Variables), Simplify(blockExpr.Expressions)),
                IndexExpression indexExpr => indexExpr.Update(Simplify(indexExpr.Object) !, Simplify(indexExpr.Arguments)),
                LabelExpression labelExpr => labelExpr.Update(labelExpr.Target, Simplify(labelExpr.DefaultValue)),
                MemberExpression memberExpr => memberExpr.Update(Simplify(memberExpr.Expression)),
                SwitchExpression switchExpr => switchExpr.Update(Simplify(switchExpr.SwitchValue), Simplify(switchExpr.Cases), Simplify(switchExpr.DefaultBody)),
                DynamicExpression dynamicExpr => dynamicExpr.Update(Simplify(dynamicExpr.Arguments)),
                ListInitExpression listInitExpr => listInitExpr.Update(Simplify(listInitExpr.NewExpression), Simplify(listInitExpr.Initializers)),
                NewArrayExpression newArrayExpr => newArrayExpr.Update(Simplify(newArrayExpr.Expressions)),
                InvocationExpression invokeExpr => invokeExpr.Update(Simplify(invokeExpr.Expression), Simplify(invokeExpr.Arguments)),
                MemberInitExpression memberInitExpr => memberInitExpr.Update(Simplify(memberInitExpr.NewExpression), memberInitExpr.Bindings),
                MethodCallExpression methodCallExpr => methodCallExpr.Update(Simplify(methodCallExpr.Object), Simplify(methodCallExpr.Arguments)),
                TypeBinaryExpression typeBinaryExpr => typeBinaryExpr.Update(Simplify(typeBinaryExpr.Expression)),
                ConditionalExpression condExpr => condExpr.Update(Simplify(condExpr.Test), Simplify(condExpr.IfTrue), Simplify(condExpr.IfFalse)),
                RuntimeVariablesExpression runtimeVarExpr => runtimeVarExpr.Update(Simplify(runtimeVarExpr.Variables)),
                _ => expression
            };

            foreach (var transform in transformers)
            {
                expr = transform.Transform(expr, this);
            }

            return((T)expr);
        }
Esempio n. 4
0
 private static Expression SetChildren(ReadOnlySpan <Expression> newChildren, LabelExpression l)
 => l.DefaultValue == null ? l : l.Update(l.Target, newChildren[0]);
Esempio n. 5
0
 /// <summary>
 /// Visits the children of the <see cref="LabelExpression" />.
 /// </summary>
 /// <param name="node">The expression to visit.</param>
 /// <returns>The modified expression, if it or any subexpression was modified;
 /// otherwise, returns the original expression.</returns>
 protected internal virtual Expression VisitLabel(LabelExpression node)
 {
     return(node.Update(VisitLabelTarget(node.Target), Visit(node.DefaultValue)));
 }
Esempio n. 6
0
 protected override Expression VisitLabel(LabelExpression node)
 {
     return(node.Update(this.VisitLabelTarget(node.Target), _defaultValue));
 }
 protected virtual Expression VisitLabel(LabelExpression node, Type expectedType)
 => node.Update(VisitLabelTarget(node.Target, expectedType), Visit(node.DefaultValue, expectedType));