private ImmutableArray <BoundExpression> BindCaseResultExpressions(CaseExpressionSyntax node) { var elseExpression = node.ElseLabel == null ? Enumerable.Empty <ExpressionSyntax>() : new[] { node.ElseLabel.Expression }; var expressions = node.CaseLabels.Select(l => l.ThenExpression).Concat(elseExpression).ToImmutableArray(); return(BindToCommonType(expressions)); }
private BoundExpression BindRegularCase(CaseExpressionSyntax node) { // CASE // WHEN e1 THEN r1 // WHEN e2 THEN r2 // ... // ELSE re // END CASE var boundResults = BindCaseResultExpressions(node); var boundCaseLabels = node.CaseLabels.Select((l, i) => new BoundCaseLabel(BindExpression(l.WhenExpression), boundResults[i])).ToImmutableArray(); var boundElse = node.ElseLabel == null ? null : boundResults.Last(); EnsureCaseLabelsEvaluateToBool(node.CaseLabels, boundCaseLabels); return(new BoundCaseExpression(boundCaseLabels, boundElse)); }
private BoundExpression BindSearchedCase(CaseExpressionSyntax node) { // CASE x // WHEN e1 THEN r1 // WHEN e2 THEN r2 // ... // ELSE re // END CASE // // ==> // // CASE // WHEN x = e1 THEN r1 // WHEN x = e2 THEN r2 // ... // ELSE re // END CASE var boundInput = BindExpression(node.InputExpression); var boundResults = BindCaseResultExpressions(node); var boundCaseLabels = (from t in node.CaseLabels.Select((c, i) => Tuple.Create(c, i)) let caseLabel = t.Item1 let i = t.Item2 let boundWhen = BindExpression(caseLabel.WhenExpression) let boundCondition = BindBinaryExpression(caseLabel.WhenExpression.Span, BinaryOperatorKind.Equal, boundInput, boundWhen) let boundThen = boundResults[i] select new BoundCaseLabel(boundCondition, boundThen)).ToImmutableArray(); var boundElse = node.ElseLabel == null ? null : boundResults.Last(); EnsureCaseLabelsEvaluateToBool(node.CaseLabels, boundCaseLabels); return(new BoundCaseExpression(boundCaseLabels, boundElse)); }
public virtual void VisitCaseExpression(CaseExpressionSyntax node) { DefaultVisit(node); }
private BoundExpression BindCaseExpression(CaseExpressionSyntax node) { return(node.InputExpression == null ? BindRegularCase(node) : BindSearchedCase(node)); }
public virtual TResult VisitCaseExpression(CaseExpressionSyntax node) { return(DefaultVisit(node)); }