: super(declaringType, name) {
     parameters = new ArrayList<ParameterInfo>();
     exceptions = new ArrayList<TypeInfo>();
     genericArguments = new ArrayList<TypeInfo>();
     annotations = new ArrayList<AnnotationValue>();
     codeGenerator = new CodeGenerator(this);
 }
        static void emitNumericConversion(CodeGenerator generator, TypeInfo fromType, TypeInfo toType) {
            switch (fromType.NumericTypeKind) {
            case Byte:
            case Char:
            case Short:
            case Int:
                switch (toType.NumericTypeKind) {
                case Byte:
                    generator.emit(Opcode.I2b);
                    break;
                case Char:
                    generator.emit(Opcode.I2c);
                    break;
                case Short:
                    generator.emit(Opcode.I2s);
                    break;
                case Long:
                    generator.emit(Opcode.I2l);
                    break;
                case Float:
                    generator.emit(Opcode.I2f);
                    break;
                case Double:
                    generator.emit(Opcode.I2d);
                    break;
                }
                break;

            case Long:
                switch (toType.TypeKind) {
                case Byte:
                    generator.emit(Opcode.L2i);
                    generator.emit(Opcode.I2b);
                    break;
                case Char:
                    generator.emit(Opcode.L2i);
                    generator.emit(Opcode.I2c);
                    break;
                case Short:
                    generator.emit(Opcode.L2i);
                    generator.emit(Opcode.I2s);
                    break;
                case Int:
                    generator.emit(Opcode.L2i);
                    break;
                case Float:
                    generator.emit(Opcode.L2f);
                    break;
                case Double:
                    generator.emit(Opcode.L2d);
                    break;
                }
                break;

            case Float:
                switch (toType.TypeKind) {
                case Byte:
                    generator.emit(Opcode.F2i);
                    generator.emit(Opcode.I2b);
                    break;
                case Char:
                    generator.emit(Opcode.F2i);
                    generator.emit(Opcode.I2c);
                    break;
                case Short:
                    generator.emit(Opcode.F2i);
                    generator.emit(Opcode.I2s);
                    break;
                case Int:
                    generator.emit(Opcode.F2i);
                    break;
                case Long:
                    generator.emit(Opcode.F2l);
                    break;
                case Double:
                    generator.emit(Opcode.F2d);
                    break;
                }
                break;

            case Double:
                switch (toType.TypeKind) {
                case Byte:
                    generator.emit(Opcode.D2i);
                    generator.emit(Opcode.I2b);
                    break;
                case Char:
                    generator.emit(Opcode.D2i);
                    generator.emit(Opcode.I2c);
                    break;
                case Short:
                    generator.emit(Opcode.D2i);
                    generator.emit(Opcode.I2s);
                    break;
                case Int:
                    generator.emit(Opcode.D2i);
                    break;
                case Long:
                    generator.emit(Opcode.D2l);
                    break;
                case Float:
                    generator.emit(Opcode.D2f);
                    break;
                }
                break;
            }
        }
 void accept(MethodVisitor visitor) {
     if (defaultValue != null) {
         var v = visitor.visitAnnotationDefault();
         defaultValue.accept(v);
         v.visitEnd();
     }
     foreach (var p in parameters) {
         foreach (var a in p.Annotations) {
             a.accept(visitor.visitParameterAnnotation(p.Position, a.Type.Descriptor, a.IsRuntimeVisible));
         }
     }
     foreach (var a in annotations) {
         a.accept(visitor.visitAnnotation(a.Type.Descriptor, a.IsRuntimeVisible));
     }
     codeGenerator.accept(visitor);
     visitor.visitEnd();
     codeGenerator = null;
 }
 static void emitDoubleConstant(CodeGenerator generator, Object value) {
     double d = 0;
     if (value instanceof Double) {
         d = ((Double)value).doubleValue();
     } else if (value instanceof Float) {
         d = ((Float)value).floatValue();
     } else if (value instanceof Long) {
         d = ((Long)value).longValue();
     } else if (value instanceof Integer) {
         d = ((Integer)value).intValue();
     } else if (value instanceof Character) {
         d = ((Character)value).charValue();
     } else if (value instanceof Byte) {
         d = ((Byte)value).byteValue();
     } else if (value instanceof Short) {
         d = ((Short)value).shortValue();
     }
     if (d == 0d) {
         generator.emit(Opcode.Dconst_0);
     } else if (d == 1d) {
         generator.emit(Opcode.Dconst_1);
     } else {
         generator.emit(Opcode.Ldc, Double.valueOf(d));
     }
 }
 static void emitNewarray(CodeGenerator generator, int dimensions, TypeInfo elementType) {
     if (dimensions <= 1) {
         switch (elementType.TypeKind) {
         case Boolean:
             generator.emit(Opcode.Newarray, 4);
             break;
         case Char:
             generator.emit(Opcode.Newarray, 5);
             break;
         case Float:
             generator.emit(Opcode.Newarray, 6);
             break;
         case Double:
             generator.emit(Opcode.Newarray, 7);
             break;
         case Byte:
             generator.emit(Opcode.Newarray, 8);
             break;
         case Short:
             generator.emit(Opcode.Newarray, 9);
             break;
         case Int:
             generator.emit(Opcode.Newarray, 10);
             break;
         case Long:
             generator.emit(Opcode.Newarray, 11);
             break;
         default:
             generator.emit(Opcode.Anewarray, elementType);
             break;
         }
     } else {
         generator.emit(Opcode.Multianewarray, elementType.ArrayType, dimensions);
     }
 }
 static void emitFloatConstant(CodeGenerator generator, Object value) {
     float f = 0;
     if (value instanceof Float) {
         f = ((Float)value).floatValue();
     } else if (value instanceof Long) {
         f = ((Long)value).longValue();
     } else if (value instanceof Integer) {
         f = ((Integer)value).intValue();
     } else if (value instanceof Character) {
         f = ((Character)value).charValue();
     } else if (value instanceof Byte) {
         f = ((Byte)value).byteValue();
     } else if (value instanceof Short) {
         f = ((Short)value).shortValue();
     }
     if (f == 0f) {
         generator.emit(Opcode.Fconst_0);
     } else if (f == 1f) {
         generator.emit(Opcode.Fconst_1);
     } else if (f == 2f) {
         generator.emit(Opcode.Fconst_2);
     } else {
         generator.emit(Opcode.Ldc, Float.valueOf(f));
     }
 }
 static void emitLongConstant(CodeGenerator generator, Object value) {
     long l = 0;
     if (value instanceof Long) {
         l = ((Long)value).longValue();
     } else if (value instanceof Integer) {
         l = ((Integer)value).intValue();
     } else if (value instanceof Character) {
         l = ((Character)value).charValue();
     } else if (value instanceof Byte) {
         l = ((Byte)value).byteValue();
     } else if (value instanceof Short) {
         l = ((Short)value).shortValue();
     }
     if (l == 0) {
         generator.emit(Opcode.Lconst_0);
     } else if (l == 1) {
         generator.emit(Opcode.Lconst_1);
     } else {
         generator.emit(Opcode.Ldc, Long.valueOf(l));
     }
 }
 static void emitIntConstant(CodeGenerator generator, Object value) {
     if (value instanceof Integer) {
         BytecodeHelper.emitIntConstant(generator, ((Integer)value).intValue());
     } else if (value instanceof Character) {
         BytecodeHelper.emitIntConstant(generator, ((Character)value).charValue());
     } else if (value instanceof Byte) {
         BytecodeHelper.emitIntConstant(generator, ((Byte)value).byteValue());
     } else if (value instanceof Short) {
         BytecodeHelper.emitIntConstant(generator, ((Short)value).shortValue());
     }
 }
 static void emitIntConstant(CodeGenerator generator, int i) {
     switch (i) {
     case -1:
         generator.emit(Opcode.Iconst_M1);
         break;
     case 0:
         generator.emit(Opcode.Iconst_0);
         break;
     case 1:
         generator.emit(Opcode.Iconst_1);
         break;
     case 2:
         generator.emit(Opcode.Iconst_2);
         break;
     case 3:
         generator.emit(Opcode.Iconst_3);
         break;
     case 4:
         generator.emit(Opcode.Iconst_4);
         break;
     case 5:
         generator.emit(Opcode.Iconst_5);
         break;
     default:
         if (i >= Byte.MIN_VALUE && i <= Byte.MAX_VALUE) {
             generator.emit(Opcode.Bipush, i);
         } else if (i >= Short.MIN_VALUE && i <= Short.MAX_VALUE) {
             generator.emit(Opcode.Sipush, i);
         } else {
             generator.emit(Opcode.Ldc, (Object)i);
         }
         break;
     }
 }
 static void emitTypeof(CodeGenerator generator, Library typeSystem, TypeInfo type) {
     switch (type.TypeKind) {
     case Boolean:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Boolean").getField("TYPE"));
         break;
     case Byte:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Byte").getField("TYPE"));
         break;
     case Char:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Character").getField("TYPE"));
         break;
     case Double:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Double").getField("TYPE"));
         break;
     case Float:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Float").getField("TYPE"));
         break;
     case Int:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Integer").getField("TYPE"));
         break;
     case Long:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Long").getField("TYPE"));
         break;
     case Short:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Short").getField("TYPE"));
         break;
     case Void:
         generator.emit(Opcode.Getstatic, typeSystem.getType("java/lang/Void").getField("TYPE"));
         break;
     default:
         generator.emit(Opcode.Ldc, type);
         break;
     }
 }