Example usage for org.antlr.v4.runtime ParserRuleContext getToken

List of usage examples for org.antlr.v4.runtime ParserRuleContext getToken

Introduction

In this page you can find the example usage for org.antlr.v4.runtime ParserRuleContext getToken.

Prototype

public TerminalNode getToken(int ttype, int i) 

Source Link

Usage

From source file:com.satisfyingstructures.J2S.J2SConvertBasicFor.java

License:Open Source License

public static void convert(ParserRuleContext ctx, J2SRewriter rewriter) {
    J2SConvertBasicFor converter = new J2SConvertBasicFor(rewriter);
    String couldNotConvertBecause = converter.convertBasicForStatementToForInLoopOrSayWhyNot(ctx);
    if (null != couldNotConvertBecause) {
        // Insert the original as a comment
        TerminalNode tnA = ctx.getToken(Java8Parser.FOR, 0), tnB = ctx.getToken(Java8Parser.RPAREN, 0);
        if (null != tnA && null != tnB) {
            CharStream cs = tnA.getSymbol().getInputStream();
            String s = cs.getText(Interval.of(tnA.getSymbol().getStartIndex(), tnB.getSymbol().getStopIndex()));
            rewriter.insertComment(s, ctx, J2SRewriter.CommentWhere.beforeLineBreak);
            rewriter.insertComment(//from   ww w  . j  a v a2s.  c  o  m
                    "...not converted to a for-in expression because " + couldNotConvertBecause + ".", ctx,
                    J2SRewriter.CommentWhere.beforeLineBreak);
        }
        converter.convertBasicForStatementToWhileLoop(ctx);
    }
}

From source file:com.satisfyingstructures.J2S.J2SConvertBasicFor.java

License:Open Source License

private String convertBasicForStatementToForInLoopOrSayWhyNot(ParserRuleContext ctx) {
    int forRule = ctx.getRuleIndex();
    if (forRule != Java8Parser.RULE_basicForStatement && forRule != Java8Parser.RULE_basicForStatementNoShortIf)
        return "statement kind is not as expected"; // not our expected parameter type
    // Get to know more about our for statement
    // 'for' '(' forInit? ';' expression? ';' forUpdate? ')' ( statement | statementNoShortIf )
    Boolean noShortIf = forRule == Java8Parser.RULE_basicForStatementNoShortIf;
    Java8Parser.ForInitContext forInitCtx = ctx.getChild(Java8Parser.ForInitContext.class, 0);
    Java8Parser.ExpressionContext expressionCtx = ctx.getChild(Java8Parser.ExpressionContext.class, 0);
    Java8Parser.ForUpdateContext forUpdateCtx = ctx.getChild(Java8Parser.ForUpdateContext.class, 0);
    ParserRuleContext statementCtx = ctx.getChild(
            noShortIf ? Java8Parser.StatementNoShortIfContext.class : Java8Parser.StatementContext.class, 0);
    ParserRuleContext statementSubCtx = statementCtx.getChild(ParserRuleContext.class, 0);
    ParserRuleContext statementSubSubCtx = statementSubCtx.getChild(ParserRuleContext.class, 0);
    Boolean statementisEmpty = statementSubSubCtx.getRuleIndex() == Java8Parser.RULE_emptyStatement;
    /*/*from w w  w. j  a v  a2 s  . c o  m*/
    'for' '(' forInit? ';' expression? ';' forUpdate? ')' ( statement | statementNoShortIf )
            
    Swift 3.0 has got rid of for(;;) statements for stong business cases such as...
        'It is rarely used'
        'not very Swift-like'
        'The value of this construct is limited'
    ...and other total crap.
            
    We can convert simple equivalents of
        for ( i = startvalue ; i < endvalue ; i += step)
    to
        for i in start..<end
    or
        for i in start.stride(to: end by: step)
            
    To identify this we look for
    1) have a forUpdate, which...
        a) operates on a single loop variable
            forUpdate().statementExpressionList().statementExpression().count()==1
        b) incorporates increment or decrement by a constant step (++i,i++,i+=step,--i,i--,i-=step,)
            statementExpression rule is RULE_(assignment|preinc|postinc|predec|postdec)
        c) operates on the same variable tested in expression (compare - 2b)
    2) have an expression, which...
        a) should be a simple comparison (<,<=,!=,>,>=, implicit non-zero)
        b) one side should be same as the loop var (compare - 1c)
        c) other side should not mutate within the loop - we can't tell this, too difficult
    3) forInit
        a) must be
            i) empty(start with loop var existing value), or
            ii) simple init of a single loop var, or
            iii) simple declaration of a loop var
    */
    // 1) Update statement. We need one...
    if (null == forUpdateCtx)
        return "it lacks an update statement";
    // 1a) and it must operate on a single variable
    if (forUpdateCtx.statementExpressionList().getChildCount() != 1)
        return "there is more than one expression in the update statement";
    // 1b) and it must be a simple increment or decrement
    Java8Parser.StatementExpressionContext updateStatementExpressionCtx = forUpdateCtx.statementExpressionList()
            .statementExpression(0);
    //  statementExpression : assignment | preIncrementExpression | preDecrementExpression
    //                                   | postIncrementExpression | postDecrementExpression
    //                                   | methodInvocation | classInstanceCreationExpression
    ParserRuleContext updateExpressionCtx = updateStatementExpressionCtx.getChild(ParserRuleContext.class, 0);
    int updateExpressionRule = updateExpressionCtx.getRuleIndex();
    boolean ascending_sequence;
    boolean open_interval;
    ParserRuleContext stepExpressionCtx = null;
    switch (updateExpressionRule) {

    // unaryExpression : preIncrementExpression | preDecrementExpression
    //                 | '+' unaryExpression | '-' unaryExpression
    //                 | unaryExpressionNotPlusMinus
    // preDecrementExpression : '--' unaryExpression
    // preIncrementExpression : '++' unaryExpression
    case Java8Parser.RULE_preDecrementExpression:
        ascending_sequence = false;
        break;
    case Java8Parser.RULE_preIncrementExpression:
        ascending_sequence = true;
        break;

    // postfixExpression : ( primary | expressionName ) ( '++' | '--')*
    // postIncrementExpression : postfixExpression '++'
    // postDecrementExpression : postfixExpression '--'
    case Java8Parser.RULE_postDecrementExpression:
        ascending_sequence = false;
        break;
    case Java8Parser.RULE_postIncrementExpression:
        ascending_sequence = true;
        break;

    // assignment : leftHandSide assignmentOperator expression
    // leftHandSide : expressionName | fieldAccess | arrayAccess
    case Java8Parser.RULE_assignment:
        if (null != updateStatementExpressionCtx.assignment().leftHandSide().arrayAccess())
            return "cant convert a loop variable that is an array element";
        TerminalNode node = updateStatementExpressionCtx.assignment().assignmentOperator()
                .getChild(TerminalNode.class, 0);
        switch (node.getSymbol().getType()) {
        case Java8Parser.ADD_ASSIGN:
            ascending_sequence = true;
            break;
        case Java8Parser.SUB_ASSIGN:
            ascending_sequence = false;
            break;
        case Java8Parser.ASSIGN: // possibilities too complex to warrant extracting simple a=a+1 cases
        default:
            return "potentially too complex to create a sequence from this update operation";
        }
        stepExpressionCtx = updateStatementExpressionCtx.assignment().expression();
        break;
    default: // methodInvocation | classInstanceCreationExpression
        return "the expression in the update statement is too complex";
    }
    // In each of the cases that we have not rejected, the loop variable is in the first child rule context of the
    // update statement. Get the text of the variable, rather than analysing the graph any further, as the
    // possibilities are endless; all that we require is that the loop variable text matches that in the text
    // expression and the init expression.
    ParserRuleContext loopVariable_updated_Ctx = updateExpressionCtx.getChild(ParserRuleContext.class, 0);
    String loopVariableTxt = loopVariable_updated_Ctx.getText(); // we want original text

    // 2) Expression
    if (null == expressionCtx)
        return "it lacks a test expression";
    // expression : lambdaExpression | assignmentExpression
    if (null != expressionCtx.lambdaExpression())
        return "cannot convert a lambda expression";
    // assignmentExpression : conditionalExpression | assignment
    if (null != expressionCtx.assignmentExpression().assignment())
        return "cannot convert an assignment within the test expression";
    // 2a) must be a simple relation:
    // Descend the chain of expression rule pass-through branches until we find the one that is significant, then
    // test to see if expression contains a terminal that is one of !=, <, <=, >, >=.
    ParserRuleContext testExpressionCtx = J2SGrammarUtils.descendToSignificantExpression(expressionCtx);
    int testExpressionRule = testExpressionCtx.getRuleIndex();
    TerminalNode node = testExpressionCtx.getChild(TerminalNode.class, 0);
    int testOperatorType = null != node ? node.getSymbol().getType() : 0;
    switch (testOperatorType) {
    case Java8Parser.NOTEQUAL:
        open_interval = true;
        break;
    case Java8Parser.LE:
        open_interval = false;
        break;
    case Java8Parser.GE:
        open_interval = false;
        break;

    case Java8Parser.LT: // can occur in relational and shift expressions
    case Java8Parser.GT: // can occur in relational and shift expressions
        if (testExpressionRule == Java8Parser.RULE_relationalExpression) {
            open_interval = true;
            break;
        }
    default:
        return "can only convert test expressions that use !=, <, <=, > or >=";
    }
    // 2b) relation must be testing same var as changed in update expression
    // The loop variable could be on the left or the right of the comparison operator
    int i;
    ParserRuleContext loopVariable_tested_Ctx = null;
    for (i = 0; i < 2; i++) {
        loopVariable_tested_Ctx = testExpressionCtx.getChild(ParserRuleContext.class, i);
        if (null != loopVariable_tested_Ctx && loopVariableTxt.equals(loopVariable_tested_Ctx.getText()))
            break; // found matching loop variable
        loopVariable_tested_Ctx = null;
    }
    if (null == loopVariable_tested_Ctx || (i == 1 && testExpressionCtx.getChildCount() > 3))
        return "the test expression must be testing the same variable as changed in update expression";
    ParserRuleContext terminalValueCtx = testExpressionCtx.getChild(ParserRuleContext.class, i ^ 1);
    // 2c) the terminal value side should not mutate within the loop
    // - way too difficult for us to determine this

    // 3) Loop init expression. Must be either...
    ParserRuleContext initialValueCtx;
    if (null == forInitCtx) // a) empty
    {
        // Using the loop variable's existing value from outside the scope
        initialValueCtx = loopVariable_tested_Ctx;
    } else if (null != forInitCtx.statementExpressionList()) // b) a simple init of a single loop var
    {
        /*
                // Could not convert...
                // for (i = 0; i<10; i++)
                // ...to a for..in statement because can only work with an assignment expression for loop variable initialisation.
                i = 0; while i<10  {j += 1 i += 1; }
        */
        if (forInitCtx.statementExpressionList().getChildCount() != 1)
            return "can only work with initialisation of a single loop variable";
        Java8Parser.StatementExpressionContext initExpressionCtx = forInitCtx.statementExpressionList()
                .statementExpression(0);
        if (null == initExpressionCtx.assignment())
            return "can only work with an assignment expression for loop variable initialisation";
        if (!loopVariableTxt.equals(initExpressionCtx.assignment().leftHandSide().getText()))
            return "the initialised variable is different from the updated variable"; // different to the loop variable
        initialValueCtx = initExpressionCtx.assignment().expression();
    } else if (null != forInitCtx.localVariableDeclaration()) // c) a simple decl of a single loop var
    {
        // localVariableDeclaration : variableModifier* unannType variableDeclaratorList
        Java8Parser.VariableDeclaratorListContext vdlc = forInitCtx.localVariableDeclaration()
                .variableDeclaratorList();
        // variableDeclaratorList : variableDeclarator (',' variableDeclarator)*
        if (vdlc.getChildCount() != 1)
            return "can only work with declaration of a single loop variable";
        Java8Parser.VariableDeclaratorContext vdc = vdlc.variableDeclarator(0);
        // variableDeclarator : variableDeclaratorId ('=' variableInitializer)?
        if (!loopVariableTxt.equals(vdc.getChild(0).getText()))
            return "the declared loop variable is be different from the updated variable";
        initialValueCtx = vdc.variableInitializer();
        if (null == initialValueCtx)
            return "there is no initialiser for the loop variable";
    } else
        return "loop initialisation is in unexpected form";

    // Now we have all the components we need
    String forInLoopText;
    // Use actual text with replacements
    String initialValueTxt = rewriter.getText(initialValueCtx);
    String terminalValueTxt = rewriter.getText(terminalValueCtx);
    // !!!: watch out...
    // if we use the actual text from the update expression, we can find that the pre/post-inc/dec has been
    // converted to the add/sub-assign form and because structure is lost when rewriting, the new form can
    // stick to the variable when we retrieve it. There's no easy solution for this (and any similar occurrences),
    // but we side step it by getting the text of loop variable from the test expression:
    loopVariableTxt = rewriter.getText(loopVariable_tested_Ctx);
    if (null != stepExpressionCtx || !ascending_sequence) {
        String stepExpressionText = stepExpressionCtx == null ? "-1"
                : ascending_sequence ? rewriter.getText(stepExpressionCtx)
                        : "-(" + rewriter.getText(stepExpressionCtx) + ")";
        forInLoopText = "for " + loopVariableTxt + " in " + loopVariableTxt + ".stride(from: " + initialValueTxt
                + (open_interval ? ", to: " : ", through: ") + terminalValueTxt + ", by: " + stepExpressionText
                + ")";
    } else {
        forInLoopText = "for " + loopVariableTxt + " in " + initialValueTxt
                + (open_interval ? " ..< " : " ... ") + terminalValueTxt;
    }

    Token startToken = ctx.getToken(Java8Parser.FOR, 0).getSymbol();
    Token endToken = ctx.getToken(Java8Parser.RPAREN, 0).getSymbol();

    CharStream cs = startToken.getInputStream();
    String originalExpressionTxt = cs.getText(Interval.of(startToken.getStartIndex(), endToken.getStopIndex()));
    rewriter.insertComment(originalExpressionTxt + " converted to", ctx,
            J2SRewriter.CommentWhere.beforeLineBreak);

    int startIndex = startToken.getTokenIndex();
    int endIndex = endToken.getTokenIndex();

    // Problem: (see notes in J2SRewriter.replaceAndAdjustWhitespace) Before converting to for-in, the loop will
    // also have had parentheses removed (and other transforms); rewriter may have coallesced some of the changes
    // so that the old end boundary no longer exists. (- a shortcoming of TokenStreamRewriter)
    // Workaround: test if endIndex is straddled by changed interval, and if so, extend our interval to the end of
    // the change. (Pretty horrendous to have to work around this here, but I don't yet see an easy way of fixing
    // the underlying problem or a generalised way of working around it.)
    Interval interval = rewriter.getChangedIntervalContaining(endIndex, endIndex);
    if (null != interval && interval.a <= endIndex && interval.b > endIndex)
        endIndex = interval.b;

    rewriter.replaceAndAdjustWhitespace(startIndex, endIndex, forInLoopText);

    return null;
}

From source file:com.satisfyingstructures.J2S.J2SConverter.java

License:Open Source License

private void mapClassIdentifierInContext(ParserRuleContext ctx) {
    TerminalNode tn = ctx.getToken(Java8Parser.Identifier, 0);
    Token classIdentifierToken = null != tn ? tn.getSymbol() : null;
    if (null == classIdentifierToken)
        return;/*from  w  ww. j  a v  a  2 s.  com*/
    String stringInJava = classIdentifierToken.getText();
    String stringInSwift = types.map(stringInJava);
    if (null != stringInSwift && !stringInSwift.equals(stringInJava))
        rewriter.replace(classIdentifierToken, stringInSwift);
}

From source file:com.satisfyingstructures.J2S.J2SConverter.java

License:Open Source License

private void removeParenthesesAroundExpression(ParserRuleContext ctx) {
    TerminalNode leftParenTN = ctx.getToken(Java8Parser.LPAREN, 0);
    TerminalNode rightParenTN = ctx.getToken(Java8Parser.RPAREN, 0);
    if (null == leftParenTN || null == rightParenTN)
        return;/*  ww  w .  j  a  v a2  s  .  c  o m*/
    rewriter.deleteAndAdjustWhitespace(leftParenTN);
    rewriter.deleteAndAdjustWhitespace(rightParenTN);
}

From source file:com.satisfyingstructures.J2S.J2SConverter.java

License:Open Source License

private void convertPrimaryVariants(ParserRuleContext ctx) {
    // To be called with one of the primaryNoNewArray_lf~ rules.
    // Convert 'this' to 'self' and '.' 'class' to '.' 'Type' 
    int ctxRuleIndex = ctx.getRuleIndex();
    switch (ctxRuleIndex) {
    case Java8Parser.RULE_primaryNoNewArray:
    case Java8Parser.RULE_primaryNoNewArray_lfno_arrayAccess:
    case Java8Parser.RULE_primaryNoNewArray_lfno_primary:
    case Java8Parser.RULE_primaryNoNewArray_lfno_primary_lfno_arrayAccess_lfno_primary:
        break;//from  ww w  .j  a v a2 s .  c  om
    default:
        return;
    }
    TerminalNode tn;
    if (null != (tn = ctx.getToken(Java8Parser.THIS, 0)))
        rewriter.replace(tn, "self");
    else if (null != (tn = ctx.getToken(Java8Parser.CLASS, 0)))
        rewriter.replace(tn, "Type");
}

From source file:de.bioviz.parser.BioParserListener.java

License:Open Source License

/**
 * This gets an ID for Droplets, Fluids, Mixers and Pins.
 * <p>/*from   ww  w  . j  ava  2 s  .c om*/
 * The parameters should be of Type FluidIDContext, DropletIDContext,
 * MixerIDContext or PinIDContext, otherwise an IllegalArgumentException is
 * thrown.
 *
 * @param ctx
 *       the context
 * @return the ID as int
 * @throws IllegalArgumentException
 *       if the type is wrong
 */
private int getID(final ParserRuleContext ctx) {
    if (ctx == null) {
        return 0;
    } else {
        if (!(ctx instanceof FluidIDContext || ctx instanceof DropletIDContext || ctx instanceof PinIDContext
                || ctx instanceof MixerIDContext)) {
            logger.error("Could not parse an ID for the given type.");
            throw new IllegalArgumentException("Could not parse an ID for the given type.");
        }
        return Integer.parseInt(ctx.getToken(Bio.Integer, 0).getText());
    }
}

From source file:eric.bottard.tis100.NodeCompilationListener.java

License:Apache License

private int lineForLabel(ParserRuleContext ctx) {
    String label = ctx.getToken(Tis100Parser.ID, 0).getText();
    Integer line = labels.get(label);
    if (line == null) {
        throw new IllegalStateException(String.format("No label %s", label));
    }//from w  ww . j  a va  2  s .  com
    return line;
}

From source file:org.tvl.goworks.editor.go.formatting.GoIndentTask.java

License:Open Source License

@RuleDependencies({ @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_constDecl, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_typeDecl, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_varDecl, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_importDecl, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_block, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_literalValue, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_structType, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_interfaceType, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_exprSwitchStmt, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_typeSwitchStmt, version = 0),
        @RuleDependency(recognizer = GoParser.class, rule = GoParser.RULE_selectStmt, version = 0), })
private int getIndent(ParseTree node) throws BadLocationException {
    //        System.out.println(node.toStringTree(parser));
    int nodeLineStart = -1;

    for (ParseTree current = node; current != null; current = current.getParent()) {
        if (!(current instanceof RuleNode)) {
            continue;
        }//from   ww  w  .ja v  a 2s.co m

        ParserRuleContext ruleContext = (ParserRuleContext) ((RuleNode) current).getRuleContext();
        if (nodeLineStart == -1) {
            nodeLineStart = context.lineStartOffset(ruleContext.start.getStartIndex());
        }

        switch (ruleContext.getRuleIndex()) {
        case GoParser.RULE_constDecl:
        case GoParser.RULE_typeDecl:
        case GoParser.RULE_varDecl:
        case GoParser.RULE_importDecl: {
            TerminalNode leftParen = ruleContext.getToken(GoParser.LeftParen, 0);
            if (leftParen == null) {
                continue;
            }

            // get the indent of the line where the block starts
            int blockLineOffset = context.lineStartOffset(leftParen.getSymbol().getStartIndex());
            int blockIndent = context.lineIndent(blockLineOffset);
            if (nodeLineStart == blockLineOffset) {
                return blockIndent;
            }

            if (node instanceof TerminalNode) {
                // no extra indent if the first node on the line is the closing brace of the block
                if (node == ruleContext.getToken(GoParser.RightParen, 0)) {
                    return blockIndent;
                }
            }

            return blockIndent + getCodeStyle().getIndentSize();
        }

        case GoParser.RULE_block:
        case GoParser.RULE_literalValue:
        case GoParser.RULE_structType:
        case GoParser.RULE_interfaceType:
        case GoParser.RULE_exprSwitchStmt:
        case GoParser.RULE_typeSwitchStmt:
        case GoParser.RULE_selectStmt: {
            TerminalNode leftBrace = ruleContext.getToken(GoParser.LeftBrace, 0);
            if (leftBrace == null) {
                continue;
            }

            // get the indent of the line where the block starts
            int blockLineOffset = context.lineStartOffset(leftBrace.getSymbol().getStartIndex());
            int blockIndent = context.lineIndent(blockLineOffset);
            if (nodeLineStart == blockLineOffset) {
                return blockIndent;
            }

            if (node instanceof TerminalNode) {
                // no extra indent if the first node on the line is the closing brace of the block
                if (node == ruleContext.getToken(GoParser.RightBrace, 0)) {
                    return blockIndent;
                } else {
                    Token symbol = ((TerminalNode) node).getSymbol();
                    switch (symbol.getType()) {
                    case GoParser.Case:
                    case GoParser.Default:
                        return blockIndent;

                    default:
                        break;
                    }
                }
            }

            return blockIndent + getCodeStyle().getIndentSize();
        }

        default:
            if (current.getParent() == null) {
                int outerLineOffset = context.lineStartOffset(ruleContext.start.getStartIndex());
                int outerIndent = context.lineIndent(outerLineOffset);
                return outerIndent;
            }

            continue;
        }
    }

    return 0;
}