Beispiel #1
0
        public Ust VisitExpressionList(JavaParser.ExpressionListContext context)
        {
            Expression[] exprs  = context.expression().Select(expr => (Expression)Visit(expr)).ToArray();
            var          result = new ArgsUst(exprs, context.GetTextSpan());

            return(result);
        }
        public Ust VisitForControl(JavaParser.ForControlContext context)
        {
            JavaParser.EnhancedForControlContext forEach = context.enhancedForControl();
            if (forEach != null)
            {
                // TODO: modifiers
                var type      = (TypeToken)Visit(forEach.typeType());
                var varDecId  = (IdToken)Visit(forEach.variableDeclaratorId());
                var expr      = (Expression)Visit(forEach.expression());
                var parent    = (JavaParser.StatementContext)context.parent;
                var statement = (Statement)Visit(parent.statement(0));

                var result = new ForeachStatement(type, varDecId, expr, statement, parent.GetTextSpan());
                return(result);
            }
            else
            {
                var initializers = new List <Statement>();
                var iterators    = new List <Expression>();

                JavaParser.ForInitContext forInit = context.forInit();
                if (forInit != null)
                {
                    var varDec = forInit.localVariableDeclaration();
                    if (varDec != null)
                    {
                        var varDecStatement = (VariableDeclarationExpression)Visit(varDec);
                        initializers.Add(new ExpressionStatement(varDecStatement));
                    }
                    else
                    {
                        initializers.AddRange(forInit.expressionList().expression()
                                              .Select(expr =>
                        {
                            var ex = (Expression)Visit(expr);
                            return(ex == null ? null : new ExpressionStatement(ex, expr.GetTextSpan()));
                        }).Where(stmt => stmt != null).ToArray());
                    }
                }
                Expression condition = context.expression() == null ? null : (Expression)Visit(context.expression());

                JavaParser.ExpressionListContext forUpdate = context.forUpdate;
                if (forUpdate != null)
                {
                    iterators.AddRange(forUpdate.expression()
                                       .Select(expr => (Expression)Visit(expr))
                                       .Where(iter => iter != null).ToArray());
                }

                var parent    = (JavaParser.StatementContext)context.parent;
                var statement = (Statement)Visit(parent.statement(0));
                var result    = new ForStatement(initializers, condition, iterators, statement, parent.GetTextSpan());
                return(result);
            }
        }
Beispiel #3
0
 public Ust VisitArguments(JavaParser.ArgumentsContext context)
 {
     JavaParser.ExpressionListContext expressionList = context.expressionList();
     if (expressionList != null)
     {
         var result = (ArgsUst)Visit(expressionList);
         return(result);
     }
     else
     {
         return(new ArgsUst());
     }
 }
Beispiel #4
0
        public UstNode VisitExpression(JavaParser.ExpressionContext context)
        {
            var        textSpan       = context.GetTextSpan();
            var        child0Terminal = context.GetChild(0) as ITerminalNode;
            Expression target;
            Expression result;

            if (child0Terminal != null)
            {
                switch (child0Terminal.Symbol.Type)
                {
                case JavaParser.NEW:
                    result = (Expression)Visit(context.creator());
                    return(result);

                case JavaParser.LPAREN:     // '(' type ')' expression
                    var type = (TypeToken)Visit(context.typeType());
                    target = (Expression)Visit(context.expression(0));
                    result = new CastExpression(type, target, textSpan, FileNode);
                    return(result);

                default:     // unary operator ('+', '-', '++', '--', '~', '!')
                    UnaryOperator op        = UnaryOperatorLiteral.PrefixTextUnaryOperator[child0Terminal.GetText()];
                    var           opLiteral = new UnaryOperatorLiteral(op, child0Terminal.GetTextSpan(), FileNode);
                    target = (Expression)Visit(context.expression(0));
                    result = new UnaryOperatorExpression(opLiteral, target, textSpan, FileNode);
                    return(result);
                }
            }

            ArgsNode args;
            var      child1Terminal = context.GetChild(1) as ITerminalNode;

            if (child1Terminal != null)
            {
                switch (child1Terminal.Symbol.Type)
                {
                case JavaParser.DOT:     // '.'
                    target = (Expression)Visit(context.expression(0));
                    var id = context.IDENTIFIER();
                    if (id != null)
                    {
                        result = new MemberReferenceExpression(target, (IdToken)Visit(id), textSpan, FileNode);
                        return(result);
                    }

                    var explicitGenericInvocation = context.explicitGenericInvocation();
                    if (explicitGenericInvocation != null)
                    {
                        return(VisitChildren(context).ToExpressionIfRequired());
                    }

                    var child2Terminal = context.GetChild <ITerminalNode>(1);
                    // TODO: implement
                    switch (child2Terminal.Symbol.Type)
                    {
                    case JavaParser.THIS:
                        break;

                    case JavaParser.NEW:
                        break;

                    case JavaParser.SUPER:
                        break;
                    }
                    break;

                case JavaParser.LBRACK:     // '['
                    target = (Expression)Visit(context.expression(0));
                    Expression expr = (Expression)Visit(context.expression(1));
                    args = new ArgsNode(new Expression[] { expr }, expr.TextSpan, FileNode);

                    result = new IndexerExpression(target, args, textSpan, FileNode);
                    return(result);

                case JavaParser.LPAREN:     // '('
                    target = (Expression)Visit(context.expression(0));
                    // TODO: fix with ArgsNode
                    JavaParser.ExpressionListContext expressionList = context.expressionList();

                    if (expressionList != null)
                    {
                        args = (ArgsNode)Visit(expressionList);
                    }
                    else
                    {
                        args = new ArgsNode();
                    }

                    result = new InvocationExpression(target, args, textSpan, FileNode);
                    return(result);

                case JavaParser.INSTANCEOF:     // x instanceof y -> (y)x != null
                    var expression = (Expression)Visit(context.expression(0));
                    var type       = (TypeToken)Visit(context.typeType());
                    result = new BinaryOperatorExpression
                    {
                        Left     = new CastExpression(type, expression, context.GetTextSpan(), FileNode),
                        Operator = new BinaryOperatorLiteral(BinaryOperator.NotEqual, default(TextSpan), FileNode),
                        Right    = new NullLiteral(default(TextSpan), FileNode),
                        TextSpan = context.GetTextSpan(),
                        FileNode = FileNode
                    };
                    return(result);

                case JavaParser.QUESTION:     // '?'
                    var condition = (Expression)Visit(context.expression(0));
                    var trueExpr  = (Expression)Visit(context.expression(1));
                    var falseExpr = (Expression)Visit(context.expression(2));

                    result = new ConditionalExpression(condition, trueExpr, falseExpr, textSpan, FileNode);
                    return(result);

                default:     // binary operator
                    string text = child1Terminal.GetText();
                    var    left = (Expression)Visit(context.expression(0));
                    JavaParser.ExpressionContext expr1 = context.expression(1);

                    if (expr1 != null)
                    {
                        var right = (Expression)Visit(expr1);

                        if (text == "=")
                        {
                            result = new AssignmentExpression(left, right, textSpan, FileNode);
                        }
                        else if (BinaryOperatorLiteral.TextBinaryAssignmentOperator.Contains(text))
                        {
                            BinaryOperator op;
                            if (text == ">>>=")
                            {
                                op = BinaryOperator.ShiftRight;     // TODO: fix shift operator.
                            }
                            else
                            {
                                op = BinaryOperatorLiteral.TextBinaryOperator[text.Remove(text.Length - 1)];
                            }

                            result = ConverterHelper.ConvertToAssignmentExpression(left, op, child1Terminal.GetTextSpan(), right,
                                                                                   context.GetTextSpan(), FileNode);
                        }
                        else
                        {
                            BinaryOperator op;
                            if (text == ">>>")
                            {
                                op = BinaryOperator.ShiftRight;      // TODO: fix shift operator.
                            }
                            else
                            {
                                op = BinaryOperatorLiteral.TextBinaryOperator[text];
                            }
                            var opLiteral = new BinaryOperatorLiteral(op, child1Terminal.GetTextSpan(), FileNode);

                            result = new BinaryOperatorExpression(left, opLiteral, right, textSpan, FileNode);
                        }
                    }
                    else
                    {
                        // post increment or decrement.
                        UnaryOperator op        = UnaryOperatorLiteral.PostfixTextUnaryOperator[text];
                        var           opLiteral = new UnaryOperatorLiteral(op, child1Terminal.GetTextSpan(), FileNode);

                        result = new UnaryOperatorExpression(opLiteral, left, textSpan, FileNode);
                        return(result);
                    }

                    return(result);
                }
            }

            return(Visit(context.GetChild(0)));
        }