protected override BoundExpression RewriteCaseExpression(BoundCaseExpression node)
        {
            var whenPassthru = CurrentPassthru;

            var labels = node.CaseLabels;

            foreach (var oldLabel in labels)
            {
                _passthruStack.Push(whenPassthru);
                var when = RewriteExpression(oldLabel.Condition);
                _passthruStack.Pop();

                var thenPassthru = Expression.Or(whenPassthru, Expression.Not(when));

                _passthruStack.Push(thenPassthru);
                var then = RewriteExpression(oldLabel.ThenExpression);
                _passthruStack.Pop();

                var label = oldLabel.Update(when, then);

                labels = labels.Replace(oldLabel, label);

                whenPassthru = Expression.Or(whenPassthru, when);
            }

            _passthruStack.Push(whenPassthru);
            var elseExpression = RewriteExpression(node.ElseExpression);

            _passthruStack.Pop();

            return(node.Update(labels, elseExpression));
        }
Beispiel #2
0
        private Expression BuildCaseLabel(BoundCaseExpression caseExpression, int caseLabelIndex)
        {
            if (caseLabelIndex == caseExpression.CaseLabels.Length)
            {
                return(caseExpression.ElseExpression == null
                           ? BuildNullValue(caseExpression.Type)
                           : BuildLiftedExpression(caseExpression.ElseExpression));
            }

            var caseLabel = caseExpression.CaseLabels[caseLabelIndex];
            var condition = caseLabel.Condition;
            var result    = caseLabel.ThenExpression;

            return
                (Expression.Condition(
                     Expression.Equal(
                         BuildLiftedExpression(condition),
                         BuildNullableTrue()
                         ),
                     BuildLiftedExpression(result),
                     BuildCaseLabel(caseExpression, caseLabelIndex + 1)
                     ));
        }
Beispiel #3
0
 private Expression BuildCaseExpression(BoundCaseExpression expression)
 {
     return(BuildCaseLabel(expression, 0));
 }