private boolean hasAssignmentOperator(Node node) {
   if (node instanceof ASTStatementExpression || node instanceof ASTExpression) {
     if (node.jjtGetNumChildren() >= 2 && node.jjtGetChild(1) instanceof ASTAssignmentOperator) {
       return true;
     }
   }
   return false;
 }
示例#2
0
文件: FooRule.java 项目: Monits/pmd
 protected void apply(Node node, RuleContext ctx) {
   for (int i = 0; i < node.jjtGetNumChildren(); i++) {
     apply(node.jjtGetChild(i), ctx);
   }
   if ("Foo".equals(node.getImage())) {
     addViolation(ctx, node);
   }
 }
  private boolean isStandAlonePostfix(Node primaryExpression) {
    if (!(primaryExpression instanceof ASTPostfixExpression)
        || !(primaryExpression.jjtGetParent() instanceof ASTStatementExpression)) {
      return false;
    }

    ASTPrimaryPrefix pf =
        (ASTPrimaryPrefix) ((ASTPrimaryExpression) primaryExpression.jjtGetChild(0)).jjtGetChild(0);
    if (pf.usesThisModifier()) {
      return true;
    }

    return thirdChildHasDottedName(primaryExpression);
  }
示例#4
0
 public ElementNode(
     DocumentNode document,
     IdGenerator idGenerator,
     ElementNode parent,
     Node node,
     int siblingPosition) {
   this.document = document;
   this.parent = parent;
   this.node = node;
   this.id = idGenerator.getNextId();
   this.siblingPosition = siblingPosition;
   if (node.jjtGetNumChildren() > 0) {
     this.children = new NodeInfo[node.jjtGetNumChildren()];
     for (int i = 0; i < children.length; i++) {
       children[i] = new ElementNode(document, idGenerator, this, node.jjtGetChild(i), i);
     }
   } else {
     this.children = null;
   }
   document.nodeToElementNode.put(node, this);
 }
  public boolean isOnLeftHandSide() {
    // I detest this method with every atom of my being
    Node primaryExpression;
    if (location.jjtGetParent() instanceof ASTPrimaryExpression) {
      primaryExpression = location.jjtGetParent().jjtGetParent();
    } else if (location.jjtGetParent().jjtGetParent() instanceof ASTPrimaryExpression) {
      primaryExpression = location.jjtGetParent().jjtGetParent().jjtGetParent();
    } else {
      throw new RuntimeException(
          "Found a NameOccurrence that didn't have an ASTPrimary Expression as parent or grandparent.  Parent = "
              + location.jjtGetParent()
              + " and grandparent = "
              + location.jjtGetParent().jjtGetParent());
    }

    if (isStandAlonePostfix(primaryExpression)) {
      return true;
    }

    if (primaryExpression.jjtGetNumChildren() <= 1) {
      return false;
    }

    if (!(primaryExpression.jjtGetChild(1) instanceof ASTAssignmentOperator)) {
      return false;
    }

    if (isPartOfQualifiedName() /* or is an array type */) {
      return false;
    }

    if (isCompoundAssignment(primaryExpression)) {
      return false;
    }

    return true;
  }
示例#6
0
 @Override
 public Object visit(ASTCatchStatement catchStmt, Object data) {
   String target =
       catchStmt
           .jjtGetChild(0)
           .findChildrenOfType(ASTVariableDeclaratorId.class)
           .get(0)
           .getImage();
   // Inspect all the throw stmt inside the catch stmt
   List<ASTThrowStatement> lstThrowStatements =
       catchStmt.findDescendantsOfType(ASTThrowStatement.class);
   for (ASTThrowStatement throwStatement : lstThrowStatements) {
     Node n = throwStatement.jjtGetChild(0).jjtGetChild(0);
     if (n instanceof ASTCastExpression) {
       ASTPrimaryExpression expr = (ASTPrimaryExpression) n.jjtGetChild(1);
       if (expr.jjtGetNumChildren() > 1 && expr.jjtGetChild(1) instanceof ASTPrimaryPrefix) {
         RuleContext ctx = (RuleContext) data;
         addViolation(ctx, throwStatement);
       }
       continue;
     }
     // Retrieve all argument for the throw exception (to see if the
     // original exception is preserved)
     ASTArgumentList args = throwStatement.getFirstDescendantOfType(ASTArgumentList.class);
     if (args != null) {
       Node parent = args.jjtGetParent().jjtGetParent();
       if (parent instanceof ASTAllocationExpression) {
         // maybe it is used inside a anonymous class
         ck(data, target, throwStatement, parent);
       } else {
         ck(data, target, throwStatement, args);
       }
     } else {
       Node child = throwStatement.jjtGetChild(0);
       while (child != null && child.jjtGetNumChildren() > 0 && !(child instanceof ASTName)) {
         child = child.jjtGetChild(0);
       }
       if (child != null) {
         if (child instanceof ASTName
             && !target.equals(child.getImage())
             && !child.hasImageEqualTo(target + FILL_IN_STACKTRACE)) {
           Map<VariableNameDeclaration, List<NameOccurrence>> vars =
               ((ASTName) child).getScope().getDeclarations(VariableNameDeclaration.class);
           for (Map.Entry<VariableNameDeclaration, List<NameOccurrence>> entry : vars.entrySet()) {
             VariableNameDeclaration decl = entry.getKey();
             List<NameOccurrence> occurrences = entry.getValue();
             if (decl.getImage().equals(child.getImage())) {
               if (!isInitCauseCalled(target, occurrences)) {
                 args =
                     decl.getNode().jjtGetParent().getFirstDescendantOfType(ASTArgumentList.class);
                 if (args != null) {
                   ck(data, target, throwStatement, args);
                 }
               }
             }
           }
         } else if (child instanceof ASTClassOrInterfaceType) {
           addViolation(data, throwStatement);
         }
       }
     }
   }
   return super.visit(catchStmt, data);
 }
 private boolean thirdChildHasDottedName(Node primaryExpression) {
   Node thirdChild = primaryExpression.jjtGetChild(0).jjtGetChild(0).jjtGetChild(0);
   return thirdChild instanceof ASTName && ((ASTName) thirdChild).getImage().indexOf('.') == -1;
 }
 private boolean isCompoundAssignment(Node primaryExpression) {
   return ((ASTAssignmentOperator) primaryExpression.jjtGetChild(1)).isCompound();
 }