View Javadoc

    1   /**
    2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
    3    */
    4   package net.sourceforge.pmd.rules;
    5
    6   import java.util.Set;
    7
    8   import net.sourceforge.pmd.AbstractRule;
    9   import net.sourceforge.pmd.ast.ASTAllocationExpression;
    10  import net.sourceforge.pmd.ast.ASTClassOrInterfaceType;
    11  import net.sourceforge.pmd.ast.ASTPrimaryExpression;
    12  import net.sourceforge.pmd.ast.ASTPrimarySuffix;
    13  import net.sourceforge.pmd.ast.SimpleNode;
    14  import net.sourceforge.pmd.util.CollectionUtil;
    15
    16  public class UnnecessaryConversionTemporary extends AbstractRule {
    17
    18      private boolean inPrimaryExpressionContext;
    19      private ASTPrimaryExpression primary;
    20      private boolean usingPrimitiveWrapperAllocation;
    21
    22      private static final Set<String> primitiveWrappers = CollectionUtil.asSet(
    23      	new String[] {"Integer", "Boolean", "Double", "Long", "Short", "Byte", "Float"}
    24      	);
    25
    26      public UnnecessaryConversionTemporary() {
    27      }
    28
    29      public Object visit(ASTPrimaryExpression node, Object data) {
    30          if (node.jjtGetNumChildren() == 0 || (node.jjtGetChild(0)).jjtGetNumChildren() == 0 || !(node.jjtGetChild(0).jjtGetChild(0) instanceof ASTAllocationExpression)) {
    31              return super.visit(node, data);
    32          }
    33          // TODO... hmmm... is this inPrimaryExpressionContext gibberish necessary?
    34          inPrimaryExpressionContext = true;
    35          primary = node;
    36          super.visit(node, data);
    37          inPrimaryExpressionContext = false;
    38          usingPrimitiveWrapperAllocation = false;
    39          return data;
    40      }
    41
    42      public Object visit(ASTAllocationExpression node, Object data) {
    43          if (!inPrimaryExpressionContext || !(node.jjtGetChild(0) instanceof ASTClassOrInterfaceType)) {
    44              return super.visit(node, data);
    45          }
    46          if (!primitiveWrappers.contains(((SimpleNode) node.jjtGetChild(0)).getImage())) {
    47              return super.visit(node, data);
    48          }
    49          usingPrimitiveWrapperAllocation = true;
    50          return super.visit(node, data);
    51      }
    52
    53      public Object visit(ASTPrimarySuffix node, Object data) {
    54          if (inPrimaryExpressionContext && usingPrimitiveWrapperAllocation) {
    55              if (node.hasImageEqualTo("toString")) {
    56                  if (node.jjtGetParent() == primary) {
    57                      addViolation(data, node);
    58                  }
    59              }
    60          }
    61          return super.visit(node, data);
    62      }
    63
    64  }