@Override public int[] getDefaultTokens() { return getRequiredTokens(); }
/** * Checks whether an identifier references a field which has been already defined in class. * @param fieldDef a field definition. * @return true if an identifier references a field which has been already defined in class. */ private boolean isForwardReference(DetailAST fieldDef) { final DetailAST exprStartIdent = fieldDef.findFirstToken(TokenTypes.IDENT); final Set<DetailAST> exprIdents = getAllTokensOfType(exprStartIdent, TokenTypes.IDENT); boolean forwardReference = false; for (DetailAST ident : exprIdents) { if (classFieldNames.contains(ident.getText())) { forwardReference = true; break; } } return forwardReference; }
/** * Checks if given modifiers are valid in substate of given * state({@code Scope}), if it is it updates substate or else it * logs violation. * @param modifiersAst modifiers to process * @param state current state * @param isStateValid is main state for given modifiers is valid */ private void processModifiersSubState(DetailAST modifiersAst, ScopeState state, boolean isStateValid) { final Scope access = ScopeUtil.getScopeFromMods(modifiersAst); if (state.declarationAccess.compareTo(access) > 0) { if (isStateValid && !ignoreModifiers && !isForwardReference(modifiersAst.getParent())) { log(modifiersAst, MSG_ACCESS); } } else { state.declarationAccess = access; } }
@Test public void testTokensNotNull() { final DeclarationOrderCheck check = new DeclarationOrderCheck(); Assert.assertNotNull("Acceptable tokens should not be null", check.getAcceptableTokens()); Assert.assertNotNull("Default tokens should not be null", check.getDefaultTokens()); Assert.assertNotNull("Required tokens should not be null", check.getRequiredTokens()); }
@Test public void testImproperToken() { final DetailAST parent = new DetailAST(); parent.setType(TokenTypes.STATIC_INIT); final DetailAST array = new DetailAST(); array.setType(TokenTypes.ARRAY_INIT); parent.setFirstChild(array); final DeclarationOrderCheck check = new DeclarationOrderCheck(); check.visitToken(array); final SortedSet<LocalizedMessage> messages = check.getMessages(); assertEquals("No exception messages expected", 0, messages.size()); }
if (parentType == TokenTypes.VARIABLE_DEF && ast.getParent().getParent().getType() == TokenTypes.OBJBLOCK) { processModifiers(ast); processConstructor(ast);
/** * Processes constructor. * @param ast constructor AST. */ private void processConstructor(DetailAST ast) { final ScopeState state = scopeStates.peek(); if (state.currentScopeState > STATE_CTOR_DEF) { if (!ignoreConstructors) { log(ast, MSG_CONSTRUCTOR); } } else { state.currentScopeState = STATE_CTOR_DEF; } }
@Test public void testParents() { final DetailAST parent = new DetailAST(); parent.setType(TokenTypes.STATIC_INIT); final DetailAST method = new DetailAST(); method.setType(TokenTypes.METHOD_DEF); parent.setFirstChild(method); final DetailAST ctor = new DetailAST(); ctor.setType(TokenTypes.CTOR_DEF); method.setNextSibling(ctor); final DeclarationOrderCheck check = new DeclarationOrderCheck(); check.visitToken(method); final SortedSet<LocalizedMessage> messages1 = check.getMessages(); assertEquals("No exception messages expected", 0, messages1.size()); check.visitToken(ctor); final SortedSet<LocalizedMessage> messages2 = check.getMessages(); assertEquals("No exception messages expected", 0, messages2.size()); }
if (parentType == TokenTypes.VARIABLE_DEF && ast.getParent().getParent().getType() == TokenTypes.OBJBLOCK) { processModifiers(ast); processConstructor(ast);
@Override public int[] getAcceptableTokens() { return getRequiredTokens(); }
/** * Checks if given modifiers are valid in substate of given * state({@code Scope}), if it is it updates substate or else it * logs violation. * @param modifiersAst modifiers to process * @param state current state * @param isStateValid is main state for given modifiers is valid */ private void processModifiersSubState(DetailAST modifiersAst, ScopeState state, boolean isStateValid) { final Scope access = ScopeUtil.getScopeFromMods(modifiersAst); if (state.declarationAccess.compareTo(access) > 0) { if (isStateValid && !ignoreModifiers && !isForwardReference(modifiersAst.getParent())) { log(modifiersAst, MSG_ACCESS); } } else { state.declarationAccess = access; } }
/** * Processes constructor. * @param ast constructor AST. */ private void processConstructor(DetailAST ast) { final ScopeState state = scopeStates.peek(); if (state.currentScopeState > STATE_CTOR_DEF) { if (!ignoreConstructors) { log(ast, MSG_CONSTRUCTOR); } } else { state.currentScopeState = STATE_CTOR_DEF; } }
/** * Checks whether an identifier references a field which has been already defined in class. * @param fieldDef a field definition. * @return true if an identifier references a field which has been already defined in class. */ private boolean isForwardReference(DetailAST fieldDef) { final DetailAST exprStartIdent = fieldDef.findFirstToken(TokenTypes.IDENT); final Set<DetailAST> exprIdents = getAllTokensOfType(exprStartIdent, TokenTypes.IDENT); boolean forwardReference = false; for (DetailAST ident : exprIdents) { if (classFieldNames.contains(ident.getText())) { forwardReference = true; break; } } return forwardReference; }
@Override public int[] getDefaultTokens() { return getRequiredTokens(); }
@Override public int[] getAcceptableTokens() { return getRequiredTokens(); }