Ejemplo n.º 1
0
        /// <inheritdoc/>
        protected override bool HandleDynamic(CodeUnaryOperatorExpression obj, Context ctx)
        {
            string operatorSymbol = CSharpKeywordsUtils.UnaryOperatorSymbol(obj.Operator, out var isOperatorAfterExpression);

            if (!isOperatorAfterExpression)
            {
                ctx.Writer.Write(operatorSymbol);
            }
            WrapIfNecessaryAndHandle(obj.Expression, ctx);
            if (isOperatorAfterExpression)
            {
                ctx.Writer.Write(operatorSymbol);
            }
            return(true);
        }
Ejemplo n.º 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);
        }
 /// <inheritdoc cref="ICodeObjectHandler{T}.Handle"/>
 protected abstract bool HandleDynamic(CodeUnaryOperatorExpression obj, Context ctx);
Ejemplo n.º 4
0
 public void VisitUnary(CodeUnaryOperatorExpression u)
 {
     writer.Write(OpToString(u.Operator));
     Write(u.Expression, operatorPrecedence[u.Operator]);
 }