コード例 #1
0
 /// <inheritdoc/>
 protected override bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx)
 {
     WrapIfNecessaryAndHandle(obj.LeftExpression, ctx);
     ctx.Writer.Write($" {CSharpKeywordsUtils.OperatorSymbol(obj.OperatorType)} ");
     WrapIfNecessaryAndHandle(obj.RightExpression, ctx);
     return(true);
 }
コード例 #2
0
        /// <inheritdoc />
        protected override bool HandleDynamic(CodeUnaryOperatorExpression obj, Context ctx)
        {
            string operatorSymbol = VisualBasicKeywordsUtils.UnaryOperatorSymbol(obj.Operator);

            if (operatorSymbol != null)
            {
                ctx.Writer.Write(operatorSymbol);
                WrapIfNecessaryAndHandle(obj.Expression, ctx);
                return(true);
            }

            if (obj.Operator == CodeUnaryOperatorType.PostDecrement ||
                obj.Operator == CodeUnaryOperatorType.PostIncrement ||
                obj.Operator == CodeUnaryOperatorType.PreDecrement ||
                obj.Operator == CodeUnaryOperatorType.PreIncrement)
            {
                //TODO this is ok when used as an expression, but not when used as a statement. Should be replaced with a method invocation, and add a library
                bool isIncrement = obj.Operator == CodeUnaryOperatorType.PostIncrement ||
                                   obj.Operator == CodeUnaryOperatorType.PreIncrement;
                bool isPre = obj.Operator == CodeUnaryOperatorType.PreDecrement ||
                             obj.Operator == CodeUnaryOperatorType.PreIncrement;

                CodeExpression toReturn;

                if (isPre)
                {
                    toReturn = obj.Expression;
                }
                else
                {
                    toReturn = new CodeBinaryOperatorExpressionMore(
                        obj.Expression,
                        isIncrement ? CodeBinaryOperatorTypeMore.Subtract : CodeBinaryOperatorTypeMore.Add,
                        Primitives.Int(1));
                }

                var lambda = new CodeLambdaDeclarationExpression(
                    new CodeCommentStatement(obj.Operator.ToString("G")),
                    new CodeOperationAssignmentStatement(
                        obj.Expression,
                        isIncrement ? CodeBinaryOperatorTypeMore.Add : CodeBinaryOperatorTypeMore.Subtract,
                        Primitives.Int(1)),
                    new CodeMethodReturnStatement(toReturn));
                ctx.HandlerProvider.ExpressionHandler.Handle(new CodeMethodInvokeExpression(lambda, "Invoke"), ctx);
                return(true);
            }
            return(false);
        }
コード例 #3
0
        /// <inheritdoc />
        protected override bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx)
        {
            if (obj.OperatorType == CodeBinaryOperatorTypeMore.NullCoalescing)
            {
                ctx.Writer.Write("If(");
                ctx.HandlerProvider.ExpressionHandler.Handle(obj.LeftExpression, ctx);
                ctx.Writer.Write(", ");
                ctx.HandlerProvider.ExpressionHandler.Handle(obj.RightExpression, ctx);
                ctx.Writer.Write(")");
            }
            else
            {
                WrapIfNecessaryAndHandle(obj.LeftExpression, ctx);
                ctx.Writer.Write($" {VisualBasicKeywordsUtils.OperatorSymbol(obj.OperatorType)} ");
                WrapIfNecessaryAndHandle(obj.RightExpression, ctx);
            }

            return(true);
        }
コード例 #4
0
 /// <inheritdoc cref="ICodeObjectHandler{T}.Handle"/>
 protected abstract bool HandleDynamic(CodeBinaryOperatorExpressionMore obj, Context ctx);