public void endVisit(ConstructorDeclaration constructorDeclaration, ClassScope classScope) {
   if (((constructorDeclaration.bits & ASTNode.IsDefaultConstructor) == 0)
       && !constructorDeclaration.isClinit()) {
     endVisitPreserved(constructorDeclaration.bodyStart, constructorDeclaration.bodyEnd);
   }
   popParent();
 }
  /*
   * Returns true if the constructor is directly involved in a cycle.
   * Given most constructors aren't, we only allocate the visited list
   * lazily.
   */
  public boolean isRecursive(ArrayList visited) {
    if (this.binding == null
        || this.constructorCall == null
        || this.constructorCall.binding == null
        || this.constructorCall.isSuperAccess()
        || !this.constructorCall.binding.isValidBinding()) {
      return false;
    }

    ConstructorDeclaration targetConstructor =
        ((ConstructorDeclaration)
            this.scope.referenceType().declarationOf(this.constructorCall.binding.original()));
    if (this == targetConstructor) return true; // direct case

    if (visited == null) { // lazy allocation
      visited = new ArrayList(1);
    } else {
      int index = visited.indexOf(this);
      if (index >= 0) return index == 0; // only blame if directly part of the cycle
    }
    visited.add(this);

    return targetConstructor.isRecursive(visited);
  }
 public boolean visit(ConstructorDeclaration constructorDeclaration, ClassScope classScope) {
   if (((constructorDeclaration.bits & ASTNode.IsDefaultConstructor) == 0)
       && !constructorDeclaration.isClinit()) {
     removeLocals(
         constructorDeclaration.arguments,
         constructorDeclaration.declarationSourceStart,
         constructorDeclaration.declarationSourceEnd);
     removeLocals(
         constructorDeclaration.statements,
         constructorDeclaration.declarationSourceStart,
         constructorDeclaration.declarationSourceEnd);
   }
   pushParent(constructorDeclaration);
   return true;
 }