/** Adapted from {@link TypeDeclaration#traverse}. */
 private void traverse(TypeDeclaration type) {
   // Don't visit javadoc.
   // Don't visit annotations.
   if (type.superclass != null) {
     type.superclass.traverse(this, type.scope);
   }
   if (type.superInterfaces != null) {
     int length = type.superInterfaces.length;
     for (int i = 0; i < length; i++) {
       type.superInterfaces[i].traverse(this, type.scope);
     }
   }
   if (type.typeParameters != null) {
     int length = type.typeParameters.length;
     for (int i = 0; i < length; i++) {
       type.typeParameters[i].traverse(this, type.scope);
     }
   }
   if (type.memberTypes != null) {
     int length = type.memberTypes.length;
     for (int i = 0; i < length; i++) {
       type.memberTypes[i].traverse(this, type.scope);
     }
   }
   if (type.fields != null) {
     int length = type.fields.length;
     for (int i = 0; i < length; i++) {
       FieldDeclaration field;
       if ((field = type.fields[i]).isStatic()) {
         field.traverse(this, type.staticInitializerScope);
       } else {
         field.traverse(this, type.initializerScope);
       }
     }
   }
   if (type.methods != null) {
     int length = type.methods.length;
     for (int i = 0; i < length; i++) {
       type.methods[i].traverse(this, type.scope);
     }
   }
 }