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); } }
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()); } }
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))); }