1 package net.sourceforge.pmd.lang.java.rule.optimizations; 2 3 import java.util.Set; 4 5 import net.sourceforge.pmd.RuleContext; 6 import net.sourceforge.pmd.lang.java.ast.ASTName; 7 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryExpression; 8 import net.sourceforge.pmd.lang.java.ast.ASTPrimaryPrefix; 9 import net.sourceforge.pmd.lang.java.ast.ASTPrimarySuffix; 10 import net.sourceforge.pmd.lang.java.rule.AbstractJavaRule; 11 import net.sourceforge.pmd.lang.LanguageVersion; 12 import net.sourceforge.pmd.lang.ast.Node; 13 import net.sourceforge.pmd.util.CollectionUtil; 14 15 public class UnnecessaryWrapperObjectCreationRule extends AbstractJavaRule { 16 17 private static final Set<String> PREFIX_SET = 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> SUFFIX_SET = 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) instanceof ASTName)) { 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).getLanguageVersion().compareTo(LanguageVersion.JAVA_15) >= 0; 49 50 if (PREFIX_SET.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 (SUFFIX_SET.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 }