check for redundant modifier
This commit is contained in:
parent
daf94e4e8e
commit
85db5df9c1
|
|
@ -0,0 +1,85 @@
|
|||
package com.puppycrawl.tools.checkstyle.checks;
|
||||
|
||||
import java.util.Stack;
|
||||
|
||||
import com.puppycrawl.tools.checkstyle.api.Check;
|
||||
import com.puppycrawl.tools.checkstyle.api.DetailAST;
|
||||
import com.puppycrawl.tools.checkstyle.JavaTokenTypes;
|
||||
|
||||
public class RedundantModifierCheck extends Check implements JavaTokenTypes
|
||||
{
|
||||
private final Stack mInInterface = new Stack();
|
||||
|
||||
public void beginTree()
|
||||
{
|
||||
super.beginTree();
|
||||
mInInterface.clear();
|
||||
}
|
||||
|
||||
public int[] getDefaultTokens()
|
||||
{
|
||||
return new int[] {MODIFIERS, INTERFACE_DEF, CLASS_DEF};
|
||||
}
|
||||
|
||||
public void visitToken(DetailAST aAST)
|
||||
{
|
||||
switch (aAST.getType())
|
||||
{
|
||||
case INTERFACE_DEF:
|
||||
mInInterface.push(Boolean.TRUE);
|
||||
break;
|
||||
case CLASS_DEF:
|
||||
mInInterface.push(Boolean.FALSE);
|
||||
break;
|
||||
case MODIFIERS:
|
||||
|
||||
// modifiers of the interface itself (public interface X)
|
||||
// will be below the INTERFACE_DEF node. Example:
|
||||
|
||||
// public interface X {void y();}
|
||||
|
||||
// INTERFACE_DEF
|
||||
// + MODUFIERS
|
||||
// + public
|
||||
// + OBJ_BLOCK
|
||||
// + ...
|
||||
|
||||
if (inInterfaceBlock(aAST)) {
|
||||
DetailAST ast = (DetailAST) aAST.getFirstChild();
|
||||
while (ast != null) {
|
||||
String modifier = ast.getText();
|
||||
if ("public".equals(modifier)
|
||||
|| "abstract".equals(modifier))
|
||||
{
|
||||
log(ast.getLineNo(),
|
||||
ast.getColumnNo(),
|
||||
"redundantModifier",
|
||||
new String[] {modifier});
|
||||
}
|
||||
ast = (DetailAST) ast.getNextSibling();
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/** @return whether currently in an interface block,
|
||||
* i.e. in an OBJ_BLOCK of an INTERFACE_DEF
|
||||
*/
|
||||
private boolean inInterfaceBlock(DetailAST aAST)
|
||||
{
|
||||
if (mInInterface.empty()) {
|
||||
return false;
|
||||
}
|
||||
if (aAST.getParent().getType() == INTERFACE_DEF) {
|
||||
int size = mInInterface.size();
|
||||
return size > 1 && Boolean.TRUE.equals(mInInterface.get(size - 2));
|
||||
}
|
||||
else {
|
||||
return Boolean.TRUE.equals(mInInterface.peek());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package com.puppycrawl.tools.checkstyle;
|
||||
|
||||
import com.puppycrawl.tools.checkstyle.api.LocalizedMessages;
|
||||
import com.puppycrawl.tools.checkstyle.api.Check;
|
||||
import com.puppycrawl.tools.checkstyle.checks.RedundantModifierCheck;
|
||||
|
||||
public class RedundantModifierTest extends AbstractCheckTestCase
|
||||
{
|
||||
public RedundantModifierTest(String aName)
|
||||
{
|
||||
super(aName);
|
||||
}
|
||||
|
||||
public void testIt()
|
||||
throws Exception
|
||||
{
|
||||
final LocalizedMessages msgs = new LocalizedMessages(8);
|
||||
final TreeWalker walker = new TreeWalker(msgs);
|
||||
final CheckConfiguration config = new CheckConfiguration();
|
||||
config.setClassname(RedundantModifierCheck.class.getName());
|
||||
final Check c = config.createInstance(
|
||||
Thread.currentThread().getContextClassLoader());
|
||||
walker.registerCheck(c, config);
|
||||
final String fname = CheckerTest.getPath("InputModifier.java");
|
||||
final String[] lines = getLines(fname);
|
||||
walker.walk(getAST(fname, lines), lines, fname);
|
||||
assertEquals(2, msgs.getMessages().length);
|
||||
int idx = 0;
|
||||
verifyMessage(msgs, idx++, 32, 9, "Redundant 'public' modifier.");
|
||||
verifyMessage(msgs, idx++, 38, 9, "Redundant 'abstract' modifier.");
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue