1 package net.sourceforge.pmd.rules.optimization; 2 3 import java.util.Set; 4 5 import net.sourceforge.pmd.AbstractRule; 6 import net.sourceforge.pmd.RuleContext; 7 import net.sourceforge.pmd.SourceType; 8 import net.sourceforge.pmd.ast.ASTName; 9 import net.sourceforge.pmd.ast.ASTPrimaryExpression; 10 import net.sourceforge.pmd.ast.ASTPrimaryPrefix; 11 import net.sourceforge.pmd.ast.ASTPrimarySuffix; 12 import net.sourceforge.pmd.ast.Node; 13 import net.sourceforge.pmd.util.CollectionUtil; 14 15 public class UnnecessaryWrapperObjectCreation extends AbstractRule { 16 17 private static final Set<String> prefixSet = CollectionUtil.asSet(new String[] { 18 "Byte.valueOf", 19 "Short.valueOf", 20 "Integer.valueOf", 21 "Long.valueOf", 22 "Float.valueOf", 23 "Double.valueOf", 24 "Character.valueOf" 25 }); 26 27 private static final Set<String> suffixSet = CollectionUtil.asSet(new String[] { 28 "toString", 29 "byteValue", 30 "shortValue", 31 "intValue", 32 "longValue", 33 "floatValue", 34 "doubleValue", 35 "charValue" 36 }); 37 38 public Object visit(ASTPrimaryPrefix node, Object data) { 39 if (node.jjtGetNumChildren() == 0 || !node.jjtGetChild(0).getClass().equals(ASTName.class)) { 40 return super.visit(node, data); 41 } 42 43 String image = ((ASTName) node.jjtGetChild(0)).getImage(); 44 if (image.startsWith("java.lang.")) { 45 image = image.substring(10); 46 } 47 48 boolean checkBoolean = ((RuleContext) data).getSourceType().compareTo(SourceType.JAVA_15) >= 0; 49 50 if (prefixSet.contains(image)||(checkBoolean && "Boolean.valueOf".equals(image))) { 51 ASTPrimaryExpression parent = (ASTPrimaryExpression) node.jjtGetParent(); 52 if (parent.jjtGetNumChildren() >= 3) { 53 Node n = parent.jjtGetChild(2); 54 if (n instanceof ASTPrimarySuffix) { 55 ASTPrimarySuffix suffix = (ASTPrimarySuffix) n; 56 image = suffix.getImage(); 57 58 if (suffixSet.contains(image)||(checkBoolean && "booleanValue".equals(image))) { 59 super.addViolation(data, node); 60 return data; 61 } 62 } 63 } 64 } 65 return super.visit(node, data); 66 } 67 68 }