/** * Verifies that the actual <code>{@link Rule}</code> partially matches a given input. * * @param prefixToBeMatched the prefix that must be fully matched * @param remainingInput the remainder of the input, which is not to be matched * @return this assertion object. */ public ParserAssert matchesPrefix(String prefixToBeMatched, String remainingInput) { isNotNull(); try { JavaScriptTree tree = (JavaScriptTree) actual.parse(prefixToBeMatched + remainingInput); SyntaxToken lastToken = tree.getLastToken(); if (prefixToBeMatched.length() != lastToken.column() + lastToken.text().length()) { throw new RecognitionException( 0, "Rule '" + getRuleName() + "' should match:\n" + prefixToBeMatched + "\nwhen followed by:\n" + remainingInput); } } catch (RecognitionException e) { throw new RecognitionException( 0, e.getMessage() + "\n" + "Rule '" + getRuleName() + "' should match:\n" + prefixToBeMatched + "\nwhen followed by:\n" + remainingInput); } return this; }
@Override public void visitNode(Tree tree) { Tree parent = parent(tree); while (parent.is(Kind.BLOCK)) { parent = parent(parent); } if (!parent.is(LOOP_KINDS)) { return; } IterationStatementTree loopTree = (IterationStatementTree) parent; if (tree.is(Kind.CONTINUE_STATEMENT) || (!parent.is(Kind.FOR_IN_STATEMENT) && !canExecuteMoreThanOnce(loopTree))) { SyntaxToken keyword = ((JavaScriptTree) tree).getFirstToken(); addIssue( keyword, String.format("Remove this \"%s\" statement or make it conditional", keyword.text())); } }