/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.java.rule.unnecessary;
import java.util.Set;
import net.sourceforge.pmd.lang.java.ast.ASTAllocationExpression;
import net.sourceforge.pmd.lang.java.ast.ASTClassOrInterfaceType;
import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression;
import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix;
import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule;
import net.sourceforge.pmd.util.CollectionUtil;
public class UnnecessaryConversionTemporaryRule extends AbstractJavaRule {
private boolean inPrimaryExpressionContext;
private ASTPrimaryExpression primary;
private boolean usingPrimitiveWrapperAllocation;
private static final Set<String> PRIMITIVE_WRAPPERS = CollectionUtil
.asSet(new String[] { "Integer", "Boolean", "Double", "Long", "Short", "Byte", "Float" });
public Object visit(ASTPrimaryExpression node, Object data) {
if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0
|| !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
return super.visit(node, data);
}
// TODO... hmmm... is this inPrimaryExpressionContext gibberish
// necessary?
inPrimaryExpressionContext = true;
primary = node;
super.visit(node, data);
inPrimaryExpressionContext = false;
usingPrimitiveWrapperAllocation = false;
return data;
}
public Object visit(ASTAllocationExpression node, Object data) {
if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
return super.visit(node, data);
}
if (!PRIMITIVE_WRAPPERS.contains(node.jjtGetChild(0).getImage())) {
return super.visit(node, data);
}
usingPrimitiveWrapperAllocation = true;
return super.visit(node, data);
}
public Object visit(ASTPrimarySuffix node, Object data) {
if (inPrimaryExpressionContext && usingPrimitiveWrapperAllocation) {
if (node.hasImageEqualTo("toString")) {
if (node.jjtGetParent() == primary) {
addViolation(data, node);
}
}
}
return super.visit(node, data);
}
}