Esempio n. 1
0
        public override AstNode VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression)
        {
            if (unaryOperatorExpression.Operator == UnaryOperatorType.Increment ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.Decrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement)
            {
                var rr = (OperatorResolveResult)this.Resolver.ResolveNode(unaryOperatorExpression, null);
                if (Helpers.IsFloatType(rr.Type, this.Resolver) || Helpers.Is64Type(rr.Type, this.Resolver))
                {
                    return(base.VisitUnaryOperatorExpression(unaryOperatorExpression));
                }

                UnaryOperatorExpression clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                if (clonUnaryOperatorExpression == null)
                {
                    clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                }

                bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                              clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                var isStatement = unaryOperatorExpression.Parent is ExpressionStatement;
                var isIncr      = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;
                AssignmentExpression ae;

                if (rr.UserDefinedOperatorMethod != null)
                {
                    ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(), clonUnaryOperatorExpression);
                }
                else
                {
                    ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(),
                                                  new BinaryOperatorExpression(clonUnaryOperatorExpression.Expression.Clone(), isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, new PrimitiveExpression(1)));
                }


                if (isPost && !isStatement)
                {
                    return(new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new IdentifierExpression("Bridge"), "Script"), "Identity"), clonUnaryOperatorExpression.Expression.Clone(), ae));
                }
                else
                {
                    if (isStatement)
                    {
                        return(ae);
                    }

                    return(new ParenthesizedExpression(ae));
                }
            }

            return(base.VisitUnaryOperatorExpression(unaryOperatorExpression));
        }
Esempio n. 2
0
        public override AstNode VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression)
        {
            if (unaryOperatorExpression.Operator == UnaryOperatorType.Increment ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.Decrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement)
            {
                var clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);

                if (clonUnaryOperatorExpression == null)
                {
                    clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                }

                bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                              clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                var isStatement = unaryOperatorExpression.Parent is ExpressionStatement;
                var isIncr      = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                var ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(),
                                                  new BinaryOperatorExpression(clonUnaryOperatorExpression.Expression.Clone(), isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, new PrimitiveExpression(1)));

                if (isPost && !isStatement)
                {
                    return(new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new IdentifierExpression("Bridge"), "Script"), "Identity"), clonUnaryOperatorExpression.Expression.Clone(), ae));
                }
                else
                {
                    if (isStatement)
                    {
                        return(ae);
                    }

                    return(new ParenthesizedExpression(ae));
                }
            }

            return(base.VisitUnaryOperatorExpression(unaryOperatorExpression));
        }
Esempio n. 3
0
        public override void VisitUnaryOperatorExpression(UnaryOperatorExpression unary)
        {
            base.VisitUnaryOperatorExpression (unary);

            Identifier identifier = unary.FindIdentifier();
            if (identifier == null)
                return;

            switch (unary.Operator)
            {
                case UnaryOperatorType.Increment:
                case UnaryOperatorType.Decrement:
                    unary.ReplaceWith (GetAssignmentExpression (identifier, unary));
                    break;

                case UnaryOperatorType.PostDecrement:
                case UnaryOperatorType.PostIncrement:

                    var variable = new IdentifierExpression (identifier.Name);
                    var name = new PrimitiveExpression (identifier.Name);

                    unary.ReplaceWith (GetHookExpression ("LogPostfix", GetSubmissionId(), GetId(), unary.Clone(), name, variable));
                    break;
            }
        }
Esempio n. 4
0
        public override void VisitUnaryOperatorExpression(UnaryOperatorExpression unary)
        {
            base.VisitUnaryOperatorExpression(unary);

            Identifier identifier = unary.FindIdentifier();

            if (identifier == null)
            {
                return;
            }

            switch (unary.Operator)
            {
            case UnaryOperatorType.Increment:
            case UnaryOperatorType.Decrement:
                unary.ReplaceWith(GetAssignmentExpression(identifier, unary));
                break;

            case UnaryOperatorType.PostDecrement:
            case UnaryOperatorType.PostIncrement:

                var variable = new IdentifierExpression(identifier.Name);
                var name     = new PrimitiveExpression(identifier.Name);

                unary.ReplaceWith(GetHookExpression("LogPostfix", GetSubmissionId(), GetId(), unary.Clone(), name, variable));
                break;
            }
        }
Esempio n. 5
0
        public override AstNode VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression)
        {
            if (this.Rules.Integer == IntegerRule.Managed && (unaryOperatorExpression.Operator == UnaryOperatorType.Increment ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.Decrement ||
                unaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement))
            {
                var rr = this.Resolver.ResolveNode(unaryOperatorExpression, null);

                if (rr is ErrorResolveResult)
                {
                    UnaryOperatorExpression clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                    if (clonUnaryOperatorExpression == null)
                    {
                        clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                    }

                    bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                                  clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                    var isStatement = unaryOperatorExpression.Parent is ExpressionStatement;
                    var isIncr = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;
                    AssignmentExpression ae;

                    ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(), new BinaryOperatorExpression(clonUnaryOperatorExpression.Expression.Clone(), isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, new PrimitiveExpression(1)));

                    if (isPost && !isStatement)
                    {
                        return new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE) { IsDoubleColon = true }), "Script"), "Identity"), clonUnaryOperatorExpression.Expression.Clone(), ae);
                    }
                    else
                    {
                        if (isStatement)
                        {
                            return ae;
                        }

                        return new ParenthesizedExpression(ae);
                    }
                }
                else
                {
                    var orr = (OperatorResolveResult)rr;

                    if (Helpers.IsFloatType(orr.Type, this.Resolver) || Helpers.Is64Type(orr.Type, this.Resolver))
                    {
                        return base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                    }

                    UnaryOperatorExpression clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                    if (clonUnaryOperatorExpression == null)
                    {
                        clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                    }

                    bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                                  clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                    var isStatement = unaryOperatorExpression.Parent is ExpressionStatement;
                    var isIncr = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;
                    AssignmentExpression ae;

                    if (orr.UserDefinedOperatorMethod != null)
                    {
                        ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(), clonUnaryOperatorExpression);
                    }
                    else
                    {
                        ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(),
                                 new BinaryOperatorExpression(clonUnaryOperatorExpression.Expression.Clone(), isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, new PrimitiveExpression(1)));
                    }

                    if (isPost && !isStatement)
                    {
                        return new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE) { IsDoubleColon = true }), "Script"), "Identity"), clonUnaryOperatorExpression.Expression.Clone(), ae);
                    }
                    else
                    {
                        if (isStatement)
                        {
                            return ae;
                        }

                        return new ParenthesizedExpression(ae);
                    }
                }
            }

            return base.VisitUnaryOperatorExpression(unaryOperatorExpression);
        }
Esempio n. 6
0
        public override AstNode VisitUnaryOperatorExpression(UnaryOperatorExpression unaryOperatorExpression)
        {
            if (this.Rules.Integer == IntegerRule.Managed && (unaryOperatorExpression.Operator == UnaryOperatorType.Increment ||
                                                              unaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement ||
                                                              unaryOperatorExpression.Operator == UnaryOperatorType.Decrement ||
                                                              unaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement))
            {
                var rr            = this.Resolver.ResolveNode(unaryOperatorExpression, null);
                var expression_rr = this.Resolver.ResolveNode(unaryOperatorExpression.Expression, null);

                if (rr is ErrorResolveResult)
                {
                    UnaryOperatorExpression clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                    if (clonUnaryOperatorExpression == null)
                    {
                        clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                    }

                    bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                                  clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                    var isStatement = unaryOperatorExpression.Parent is ExpressionStatement;
                    var isIncr      = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;
                    AssignmentExpression ae;

                    ae = new AssignmentExpression(clonUnaryOperatorExpression.Expression.Clone(), new BinaryOperatorExpression(clonUnaryOperatorExpression.Expression.Clone(), isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, new PrimitiveExpression(1)));

                    if (isPost && !isStatement)
                    {
                        return(new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                        {
                            IsDoubleColon = true
                        }), "Script"), "Identity"), clonUnaryOperatorExpression.Expression.Clone(), ae));
                    }
                    else
                    {
                        if (isStatement)
                        {
                            return(ae);
                        }

                        return(new ParenthesizedExpression(ae));
                    }
                }
                else
                {
                    var orr = (OperatorResolveResult)rr;

                    if (Helpers.IsFloatType(orr.Type, this.Resolver) || Helpers.Is64Type(orr.Type, this.Resolver))
                    {
                        return(base.VisitUnaryOperatorExpression(unaryOperatorExpression));
                    }

                    UnaryOperatorExpression clonUnaryOperatorExpression = (UnaryOperatorExpression)base.VisitUnaryOperatorExpression(unaryOperatorExpression);
                    if (clonUnaryOperatorExpression == null)
                    {
                        clonUnaryOperatorExpression = (UnaryOperatorExpression)unaryOperatorExpression.Clone();
                    }

                    bool isPost = clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostDecrement ||
                                  clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;

                    var isStatement        = unaryOperatorExpression.Parent is ExpressionStatement;
                    var isIncr             = clonUnaryOperatorExpression.Operator == UnaryOperatorType.Increment || clonUnaryOperatorExpression.Operator == UnaryOperatorType.PostIncrement;
                    var needReturnOriginal = isPost && !isStatement;

                    Expression expression      = clonUnaryOperatorExpression.Expression.Clone();
                    Expression expressionAfter = clonUnaryOperatorExpression.Expression.Clone();

                    AssignmentExpression ae = null;

                    if (orr.UserDefinedOperatorMethod != null)
                    {
                        ae = new AssignmentExpression(expressionAfter.Clone(), clonUnaryOperatorExpression);
                    }
                    else if (clonUnaryOperatorExpression.Expression is MemberReferenceExpression mre && expression_rr is MemberResolveResult member_rr)
                    {
                        if (needReturnOriginal)
                        {
                            bool isSimple = (member_rr != null &&
                                             (member_rr.TargetResult is ThisResolveResult ||
                                              member_rr.TargetResult is LocalResolveResult ||
                                              member_rr.TargetResult is TypeResolveResult ||
                                              member_rr.TargetResult is ConstantResolveResult));

                            expression = isSimple ? mre.Clone() : new MemberReferenceExpression(new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                            {
                                IsDoubleColon = true
                            }), "Script"), "ToTemp"), new PrimitiveExpression("idx" + tempKey), mre.Target.Clone()), mre.MemberName);
                            expressionAfter = new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                            {
                                IsDoubleColon = true
                            }), "Script"), "FromTemp"), new PrimitiveExpression("idx" + tempKey++), mre.Target.Clone());
                        }
                        else
                        {
                            expressionAfter = null;
                        }

                        ae = BuildMemberReferenceReplacement(isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, mre, member_rr, expressionAfter);
                    }
                    else if (clonUnaryOperatorExpression.Expression is IndexerExpression ie && expression_rr is ArrayAccessResolveResult array_rr)
                    {
                        IndexerExpression cacheIndexer = null;
                        if (needReturnOriginal)
                        {
                            var  array_target_rr = array_rr.Array as MemberResolveResult;
                            bool isSimpleTarget  = (array_target_rr != null && array_target_rr.Member is IField &&
                                                    (array_target_rr.TargetResult is ThisResolveResult ||
                                                     array_target_rr.TargetResult is LocalResolveResult ||
                                                     array_target_rr.TargetResult is TypeResolveResult ||
                                                     array_target_rr.TargetResult is ConstantResolveResult)) ||
                                                   (array_rr.Array is ThisResolveResult ||
                                                    array_rr.Array is LocalResolveResult ||
                                                    array_rr.Array is ConstantResolveResult);

                            bool simpleIndex = true;

                            foreach (var index in array_rr.Indexes)
                            {
                                var  indexMemberTargetrr = index as MemberResolveResult;
                                bool isIndexSimple       = (indexMemberTargetrr != null && indexMemberTargetrr.Member is IField &&
                                                            (indexMemberTargetrr.TargetResult is ThisResolveResult ||
                                                             indexMemberTargetrr.TargetResult is LocalResolveResult)) || index is ThisResolveResult || index is LocalResolveResult || index is ConstantResolveResult;

                                if (!isIndexSimple)
                                {
                                    simpleIndex = false;
                                    break;
                                }
                            }
                            var leftIndexerArgs  = new List <Expression>();
                            var rightIndexerArgs = new List <Expression>();

                            foreach (var index in ie.Arguments)
                            {
                                var expr = simpleIndex ? index.Clone() : new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                                {
                                    IsDoubleColon = true
                                }), "Script"), "ToTemp"), new PrimitiveExpression("idx" + tempKey), index.Clone());
                                leftIndexerArgs.Add(expr);

                                expr = simpleIndex ? index.Clone() : new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                                {
                                    IsDoubleColon = true
                                }), "Script"), "FromTemp"), new PrimitiveExpression("idx" + tempKey++), index.Clone());
                                rightIndexerArgs.Add(expr);
                            }

                            var leftExpr = new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                            {
                                IsDoubleColon = true
                            }), "Script"), "ToTemp"), new PrimitiveExpression("idx" + tempKey), ie.Target.Clone());
                            var rightExpr = new InvocationExpression(new MemberReferenceExpression(new MemberReferenceExpression(new TypeReferenceExpression(new MemberType(new SimpleType("global"), CS.NS.BRIDGE)
                            {
                                IsDoubleColon = true
                            }), "Script"), "FromTemp"), new PrimitiveExpression("idx" + tempKey++), ie.Target.Clone());

                            var leftIndexer  = new IndexerExpression(isSimpleTarget ? ie.Target.Clone() : leftExpr, leftIndexerArgs);
                            var rightIndexer = new IndexerExpression(isSimpleTarget ? ie.Target.Clone() : rightExpr, rightIndexerArgs);

                            expression   = leftIndexer;
                            cacheIndexer = rightIndexer;
                        }

                        ae = BuildIndexerReplacement(isStatement, isIncr ? BinaryOperatorType.Add : BinaryOperatorType.Subtract, ie, array_rr, cacheIndexer);
                    }