package org.ovirt.checkstyle.checks;
import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
import com.puppycrawl.tools.checkstyle.api.DetailAST;
import com.puppycrawl.tools.checkstyle.api.TokenTypes;
/**
* Make sure that classes have no-argument constructor (with any access modifier), i.e. either explicit or <a
* href="http://docs.oracle.com/javase/specs/jls/se7/html/jls-8.html#jls-8.8.9">default</a> constructor without
* arguments.
*/
public class NoArgConstructorCheck extends AbstractCheck {
private boolean run = true;
public void setRun(boolean run) {
this.run = run;
}
@Override
public int[] getDefaultTokens() {
return new int[] { TokenTypes.CLASS_DEF };
}
@Override
public void visitToken(DetailAST classDef) {
if (!run) {
return;
}
DetailAST objBlock = classDef.findFirstToken(TokenTypes.OBJBLOCK);
DetailAST child = objBlock.getFirstChild();
boolean hasExplicitCtor = false;
while (child != null) {
if (child.getType() == TokenTypes.CTOR_DEF) {
hasExplicitCtor = true;
DetailAST ctorParams = child.findFirstToken(TokenTypes.PARAMETERS);
if (ctorParams.getChildCount() == 0) {
// Found no-argument constructor
return;
}
}
child = child.getNextSibling();
}
if (hasExplicitCtor) {
DetailAST classIdent = classDef.findFirstToken(TokenTypes.LITERAL_CLASS).getNextSibling();
log(classIdent.getLineNo(), classIdent.getColumnNo(),
"Class {0} must have a no-argument constructor (with any access modifier)",
classIdent.getText());
}
}
}