/** Shortcut */
 @Override
 public void writeAsmType(Type asmType) {
   if (asmType.getSort() != Type.OBJECT && asmType.getSort() != Type.ARRAY) {
     signatureVisitor().visitBaseType(asmType.getDescriptor().charAt(0));
   }
   super.writeAsmType(asmType);
 }
  @Override
  public void writeParameterType(JvmMethodParameterKind parameterKind) {
    // This magic mimics the behavior of javac that enum constructor have these synthetic parameters
    // in erased signature, but doesn't
    // have them in generic signature. IDEA, javac and their friends rely on this behavior.
    if (parameterKind.isSkippedInGenericSignature()) {
      generic = true;

      // pushing dummy visitor, because we don't want these parameters to appear in generic JVM
      // signature
      push(new SignatureWriter());
    } else {
      push(signatureVisitor().visitParameterType());
    }
    super.writeParameterType(parameterKind);
  }
 @Override
 public void writeSuperclassEnd() {
   pop();
   super.writeSuperclassEnd();
 }
 @Override
 public void writeSuperclass() {
   push(signatureVisitor().visitSuperclass());
   super.writeSuperclass();
 }
 @Override
 public void writeReturnTypeEnd() {
   pop();
   super.writeReturnTypeEnd();
 }
 @Override
 public void writeTypeArgument(@NotNull Variance projectionKind) {
   push(signatureVisitor().visitTypeArgument(toJvmVariance(projectionKind)));
   generic = true;
   super.writeTypeArgument(projectionKind);
 }
 @Override
 public void writeClassEnd() {
   signatureVisitor().visitEnd();
   super.writeClassEnd();
 }
 @Override
 public void writeOuterClassBegin(Type resultingAsmType, String outerInternalName) {
   signatureVisitor().visitClassType(outerInternalName);
   super.writeOuterClassBegin(resultingAsmType, outerInternalName);
 }
 @Override
 public void writeClassBoundEnd() {
   pop();
   super.writeClassBoundEnd();
 }
 @Override
 public void writeClassBound() {
   push(signatureVisitor().visitClassBound());
   super.writeClassBound();
 }
 @Override
 public void writeFormalTypeParameter(String name) {
   signatureVisitor().visitFormalTypeParameter(name);
   generic = true;
   super.writeFormalTypeParameter(name);
 }
 @Override
 public void writeTypeVariable(Name name, Type asmType) {
   signatureVisitor().visitTypeVariable(name.asString());
   generic = true;
   super.writeTypeVariable(name, asmType);
 }
 @Override
 public void writeTypeArgumentEnd() {
   pop();
   super.writeTypeArgumentEnd();
 }
 @Override
 public void writeUnboundedWildcard() {
   signatureVisitor().visitTypeArgument();
   generic = true;
   super.writeUnboundedWildcard();
 }
 @Override
 public void writeInterface() {
   push(signatureVisitor().visitInterface());
   super.writeInterface();
 }
 @Override
 public void writeInterfaceEnd() {
   pop();
   super.writeInterfaceEnd();
 }
 @Override
 public void writeParametersStart() {
   super.writeParametersStart();
 }
 @Override
 public void writeClassBegin(Type asmType) {
   signatureVisitor().visitClassType(asmType.getInternalName());
   super.writeClassBegin(asmType);
 }
 @Override
 public void writeParameterTypeEnd() {
   pop();
   super.writeParameterTypeEnd();
 }
 @Override
 public void writeInnerClass(String name) {
   signatureVisitor().visitInnerClassType(name);
   super.writeInnerClass(name);
 }
 @Override
 public void writeReturnType() {
   push(signatureVisitor().visitReturnType());
   super.writeReturnType();
 }
 @Override
 public void writeArrayType() {
   push(signatureVisitor().visitArrayType());
   super.writeArrayType();
 }
 @Override
 public void writeArrayEnd() {
   pop();
   super.writeArrayEnd();
 }