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)); }
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) )); }
private Expression BuildCaseExpression(BoundCaseExpression expression) { return(BuildCaseLabel(expression, 0)); }