@Override
 public SignatureVisitor visitInterfaceBound() {
   if (state != FORMAL && state != BOUND) {
     throw new IllegalArgumentException();
   }
   SignatureVisitor v = sv == null ? null : sv.visitInterfaceBound();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public SignatureVisitor visitExceptionType() {
   if (state != RETURN) {
     throw new IllegalStateException();
   }
   SignatureVisitor v = sv == null ? null : sv.visitExceptionType();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public void visitTypeArgument() {
   if (state != CLASS_TYPE) {
     throw new IllegalStateException();
   }
   if (sv != null) {
     sv.visitTypeArgument();
   }
 }
 @Override
 public SignatureVisitor visitArrayType() {
   if (type != TYPE_SIGNATURE || state != EMPTY) {
     throw new IllegalStateException();
   }
   state = SIMPLE_TYPE;
   SignatureVisitor v = sv == null ? null : sv.visitArrayType();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public SignatureVisitor visitParameterType() {
   if (type != METHOD_SIGNATURE || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
     throw new IllegalArgumentException();
   }
   state = PARAM;
   SignatureVisitor v = sv == null ? null : sv.visitParameterType();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public SignatureVisitor visitSuperclass() {
   if (type != CLASS_SIGNATURE || (state & (EMPTY | FORMAL | BOUND)) == 0) {
     throw new IllegalArgumentException();
   }
   state = SUPER;
   SignatureVisitor v = sv == null ? null : sv.visitSuperclass();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public SignatureVisitor visitClassBound() {
   if (state != FORMAL) {
     throw new IllegalStateException();
   }
   state = BOUND;
   SignatureVisitor v = sv == null ? null : sv.visitClassBound();
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public void visitEnd() {
   if (state != CLASS_TYPE) {
     throw new IllegalStateException();
   }
   state = END;
   if (sv != null) {
     sv.visitEnd();
   }
 }
 @Override
 public void visitInnerClassType(final String name) {
   if (state != CLASS_TYPE) {
     throw new IllegalStateException();
   }
   CheckMethodAdapter.checkIdentifier(name, "inner class name");
   if (sv != null) {
     sv.visitInnerClassType(name);
   }
 }
 @Override
 public SignatureVisitor visitTypeArgument(final char wildcard) {
   if (state != CLASS_TYPE) {
     throw new IllegalStateException();
   }
   if ("+-=".indexOf(wildcard) == -1) {
     throw new IllegalArgumentException();
   }
   SignatureVisitor v = sv == null ? null : sv.visitTypeArgument(wildcard);
   return new CheckSignatureAdapter(TYPE_SIGNATURE, v);
 }
 @Override
 public void visitClassType(final String name) {
   if (type != TYPE_SIGNATURE || state != EMPTY) {
     throw new IllegalStateException();
   }
   CheckMethodAdapter.checkInternalName(name, "class name");
   state = CLASS_TYPE;
   if (sv != null) {
     sv.visitClassType(name);
   }
 }
 @Override
 public void visitTypeVariable(final String name) {
   if (type != TYPE_SIGNATURE || state != EMPTY) {
     throw new IllegalStateException();
   }
   CheckMethodAdapter.checkIdentifier(name, "type variable");
   state = SIMPLE_TYPE;
   if (sv != null) {
     sv.visitTypeVariable(name);
   }
 }
 @Override
 public SignatureVisitor visitReturnType() {
   if (type != METHOD_SIGNATURE || (state & (EMPTY | FORMAL | BOUND | PARAM)) == 0) {
     throw new IllegalArgumentException();
   }
   state = RETURN;
   SignatureVisitor v = sv == null ? null : sv.visitReturnType();
   CheckSignatureAdapter cv = new CheckSignatureAdapter(TYPE_SIGNATURE, v);
   cv.canBeVoid = true;
   return cv;
 }
 @Override
 public void visitFormalTypeParameter(final String name) {
   if (type == TYPE_SIGNATURE || (state != EMPTY && state != FORMAL && state != BOUND)) {
     throw new IllegalStateException();
   }
   CheckMethodAdapter.checkIdentifier(name, "formal type parameter");
   state = FORMAL;
   if (sv != null) {
     sv.visitFormalTypeParameter(name);
   }
 }
 @Override
 public void visitBaseType(final char descriptor) {
   if (type != TYPE_SIGNATURE || state != EMPTY) {
     throw new IllegalStateException();
   }
   if (descriptor == 'V') {
     if (!canBeVoid) {
       throw new IllegalArgumentException();
     }
   } else {
     if ("ZCBSIFJD".indexOf(descriptor) == -1) {
       throw new IllegalArgumentException();
     }
   }
   state = SIMPLE_TYPE;
   if (sv != null) {
     sv.visitBaseType(descriptor);
   }
 }