示例#1
0
        private BoundExpression BindCoalesceExpression(CoalesceExpressionSyntax node)
        {
            // COALESCE(e1, e2, .. eN)
            //
            // ====>
            //
            // CASE
            //   WHEN e1 IS NOT NULL THEN e1
            //   ..
            //   WHEN e2 IS NOT NULL THEN e2
            //   ELSE
            //     eN
            // END

            var boundArguments = BindToCommonType(node.ArgumentList.Arguments);
            var caseLabelCount = node.ArgumentList.Arguments.Count - 1;
            var caseLabels     = new BoundCaseLabel[caseLabelCount];

            for (var i = 0; i < caseLabelCount; i++)
            {
                var argument              = node.ArgumentList.Arguments[i];
                var boundArgument         = boundArguments[i];
                var boundIsNullExpression = new BoundIsNullExpression(boundArgument);
                var boundIsNullNegation   = BindUnaryExpression(argument.Span, UnaryOperatorKind.LogicalNot, boundIsNullExpression);
                var caseLabel             = new BoundCaseLabel(boundIsNullNegation, boundArgument);
                caseLabels[i] = caseLabel;
            }

            var elseExpresion = boundArguments.Last();

            return(new BoundCaseExpression(caseLabels, elseExpresion));
        }
示例#2
0
 public virtual void VisitCoalesceExpression(CoalesceExpressionSyntax node)
 {
     DefaultVisit(node);
 }
示例#3
0
 public virtual TResult VisitCoalesceExpression(CoalesceExpressionSyntax node)
 {
     return(DefaultVisit(node));
 }