Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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));
        }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
 public virtual void VisitCaseExpression(CaseExpressionSyntax node)
 {
     DefaultVisit(node);
 }
Ejemplo n.º 5
0
 private BoundExpression BindCaseExpression(CaseExpressionSyntax node)
 {
     return(node.InputExpression == null
                ? BindRegularCase(node)
                : BindSearchedCase(node));
 }
Ejemplo n.º 6
0
 public virtual TResult VisitCaseExpression(CaseExpressionSyntax node)
 {
     return(DefaultVisit(node));
 }