sig
  type access = [ `Default | `Private | `Protected | `Public ]
  type attributes = {
    synthetic : bool;
    deprecated : bool;
    other : (string * string) list;
  }
  type visibility = RTVisible | RTInvisible
  type field_kind = NotFinal | Final | Volatile
  type constant_attribute =
      [ `Double of float
      | `Float of float
      | `Int of int32
      | `Long of int64
      | `String of JBasics.jstr ]
  type class_field = {
    cf_signature : JBasics.field_signature;
    cf_class_signature : JBasics.class_field_signature;
    cf_generic_signature : JSignature.fieldTypeSignature option;
    cf_access : JClass.access;
    cf_static : bool;
    cf_synthetic : bool;
    cf_enum : bool;
    cf_kind : JClass.field_kind;
    cf_value : JClass.constant_attribute option;
    cf_transient : bool;
    cf_annotations : (JBasics.annotation * JClass.visibility) list;
    cf_other_flags : int list;
    cf_attributes : JClass.attributes;
  }
  type interface_field = {
    if_signature : JBasics.field_signature;
    if_class_signature : JBasics.class_field_signature;
    if_generic_signature : JSignature.fieldTypeSignature option;
    if_synthetic : bool;
    if_value : JClass.constant_attribute option;
    if_annotations : (JBasics.annotation * JClass.visibility) list;
    if_other_flags : int list;
    if_attributes : JClass.attributes;
  }
  type any_field =
      InterfaceField of JClass.interface_field
    | ClassField of JClass.class_field
  type 'a implementation = Native | Java of 'Stdlib.Lazy.t
  type method_annotations = {
    ma_global : (JBasics.annotation * JClass.visibility) list;
    ma_parameters : (JBasics.annotation * JClass.visibility) list list;
  }
  type method_parameter_attribute = {
    mp_name : string option;
    mp_final : bool;
    mp_synthetic : bool;
    mp_mandated : bool;
  }
  type 'a concrete_method = {
    cm_signature : JBasics.method_signature;
    cm_class_method_signature : JBasics.class_method_signature;
    cm_static : bool;
    cm_final : bool;
    cm_synchronized : bool;
    cm_strict : bool;
    cm_access : JClass.access;
    cm_generic_signature : JSignature.methodTypeSignature option;
    cm_bridge : bool;
    cm_varargs : bool;
    cm_synthetic : bool;
    cm_other_flags : int list;
    cm_exceptions : JBasics.class_name list;
    cm_attributes : JClass.attributes;
    cm_parameters : JClass.method_parameter_attribute list;
    cm_annotations : JClass.method_annotations;
    cm_implementation : 'JClass.implementation;
  }
  type abstract_method = {
    am_signature : JBasics.method_signature;
    am_class_method_signature : JBasics.class_method_signature;
    am_access : [ `Default | `Private | `Protected | `Public ];
    am_generic_signature : JSignature.methodTypeSignature option;
    am_bridge : bool;
    am_varargs : bool;
    am_synthetic : bool;
    am_other_flags : int list;
    am_exceptions : JBasics.class_name list;
    am_attributes : JClass.attributes;
    am_parameters : JClass.method_parameter_attribute list;
    am_annotations : JClass.method_annotations;
    am_annotation_default : JBasics.element_value option;
  }
  type 'a jmethod =
      AbstractMethod of JClass.abstract_method
    | ConcreteMethod of 'JClass.concrete_method
  type inner_class = {
    ic_class_name : JBasics.class_name option;
    ic_outer_class_name : JBasics.class_name option;
    ic_source_name : string option;
    ic_access : JClass.access;
    ic_static : bool;
    ic_final : bool;
    ic_synthetic : bool;
    ic_annotation : bool;
    ic_enum : bool;
    ic_other_flags : int list;
    ic_type : [ `Abstract | `ConcreteClass | `Interface ];
  }
  type 'a jclass = {
    c_name : JBasics.class_name;
    c_version : JBasics.version;
    c_access : [ `Default | `Public ];
    c_final : bool;
    c_abstract : bool;
    c_super_class : JBasics.class_name option;
    c_generic_signature : JSignature.classSignature option;
    c_fields : JClass.class_field JBasics.FieldMap.t;
    c_interfaces : JBasics.class_name list;
    c_consts : JBasics.constant array;
    c_sourcefile : string option;
    c_deprecated : bool;
    c_enclosing_method :
      (JBasics.class_name * JBasics.method_signature option) option;
    c_source_debug_extention : string option;
    c_inner_classes : JClass.inner_class list;
    c_synthetic : bool;
    c_enum : bool;
    c_annotations : (JBasics.annotation * JClass.visibility) list;
    c_other_flags : int list;
    c_other_attributes : (string * string) list;
    c_methods : 'JClass.jmethod JBasics.MethodMap.t;
  }
  type 'a jinterface = {
    i_name : JBasics.class_name;
    i_version : JBasics.version;
    i_access : [ `Default | `Public ];
    i_interfaces : JBasics.class_name list;
    i_generic_signature : JSignature.classSignature option;
    i_consts : JBasics.constant array;
    i_sourcefile : string option;
    i_deprecated : bool;
    i_source_debug_extention : string option;
    i_inner_classes : JClass.inner_class list;
    i_annotation : bool;
    i_annotations : (JBasics.annotation * JClass.visibility) list;
    i_other_attributes : (string * string) list;
    i_other_flags : int list;
    i_fields : JClass.interface_field JBasics.FieldMap.t;
    i_methods : 'JClass.jmethod JBasics.MethodMap.t;
  }
  type 'a interface_or_class =
      JInterface of 'JClass.jinterface
    | JClass of 'JClass.jclass
  val get_name : 'JClass.interface_or_class -> JBasics.class_name
  val get_consts : 'JClass.interface_or_class -> JBasics.constant array
  val get_access : 'JClass.interface_or_class -> [ `Default | `Public ]
  val get_sourcefile : 'JClass.interface_or_class -> string option
  val is_deprecated : 'JClass.interface_or_class -> bool
  val is_final : 'JClass.interface_or_class -> bool
  val get_inner_classes :
    'JClass.interface_or_class -> JClass.inner_class list
  val get_other_attributes :
    'JClass.interface_or_class -> (string * string) list
  val get_initializer :
    'JClass.interface_or_class -> 'JClass.concrete_method option
  val get_other_flags : 'JClass.interface_or_class -> int list
  val get_method_signature : 'JClass.jmethod -> JBasics.method_signature
  val get_class_method_signature :
    'JClass.jmethod -> JBasics.class_method_signature
  val get_method_visibility : 'JClass.jmethod -> JClass.access
  val is_static_method : 'JClass.jmethod -> bool
  val is_final_method : 'JClass.jmethod -> bool
  val is_synchronized_method : 'JClass.jmethod -> bool
  val get_method :
    'JClass.interface_or_class ->
    JBasics.method_signature -> 'JClass.jmethod
  val get_concrete_method :
    'JClass.interface_or_class ->
    JBasics.method_signature -> 'JClass.concrete_method
  val get_methods :
    'JClass.interface_or_class -> 'JClass.jmethod JBasics.MethodMap.t
  val get_concrete_methods :
    'JClass.interface_or_class ->
    'JClass.concrete_method JBasics.MethodMap.t
  val defines_method :
    'JClass.interface_or_class -> JBasics.method_signature -> bool
  val get_field_signature : JClass.any_field -> JBasics.field_signature
  val get_class_field_signature :
    JClass.any_field -> JBasics.class_field_signature
  val get_field_visibility : JClass.any_field -> JClass.access
  val is_static_field : JClass.any_field -> bool
  val is_final_field : JClass.any_field -> bool
  val get_field :
    'JClass.interface_or_class ->
    JBasics.field_signature -> JClass.any_field
  val get_fields :
    'JClass.interface_or_class -> JClass.any_field JBasics.FieldMap.t
  val defines_field :
    'JClass.interface_or_class -> JBasics.field_signature -> bool
  val cf_iter :
    (JClass.class_field -> unit) -> 'JClass.interface_or_class -> unit
  val if_iter :
    (JClass.interface_field -> unit) -> 'JClass.interface_or_class -> unit
  val f_iter :
    (JClass.any_field -> unit) -> 'JClass.interface_or_class -> unit
  val cf_fold :
    (JClass.class_field -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val if_fold :
    (JClass.interface_field -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val f_fold :
    (JClass.any_field -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val cm_iter :
    ('JClass.concrete_method -> unit) ->
    'JClass.interface_or_class -> unit
  val am_iter :
    (JClass.abstract_method -> unit) -> 'JClass.interface_or_class -> unit
  val m_iter :
    ('JClass.jmethod -> unit) -> 'JClass.interface_or_class -> unit
  val cm_fold :
    ('JClass.concrete_method -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val am_fold :
    (JClass.abstract_method -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val m_fold :
    ('JClass.jmethod -> '-> 'b) ->
    'JClass.interface_or_class -> '-> 'b
  val map_concrete_method :
    ?force:bool ->
    ('-> 'b) -> 'JClass.concrete_method -> 'JClass.concrete_method
  val map_concrete_method_with_native :
    ('JClass.implementation -> 'JClass.implementation) ->
    'JClass.concrete_method -> 'JClass.concrete_method
  val map_class :
    ?force:bool -> ('-> 'b) -> 'JClass.jclass -> 'JClass.jclass
  val map_interface :
    ?force:bool -> ('-> 'b) -> 'JClass.jinterface -> 'JClass.jinterface
  val map_interface_or_class :
    ?force:bool ->
    ('-> 'b) ->
    'JClass.interface_or_class -> 'JClass.interface_or_class
  val map_class_with_native :
    ('JClass.implementation -> 'JClass.implementation) ->
    'JClass.jclass -> 'JClass.jclass
  val map_interface_with_native :
    ('JClass.implementation -> 'JClass.implementation) ->
    'JClass.jinterface -> 'JClass.jinterface
  val map_interface_or_class_with_native :
    ('JClass.implementation -> 'JClass.implementation) ->
    'JClass.interface_or_class -> 'JClass.interface_or_class
  val map_class_context :
    ?force:bool ->
    ('JClass.concrete_method -> '-> 'b) ->
    'JClass.jclass -> 'JClass.jclass
  val map_interface_context :
    ?force:bool ->
    ('JClass.concrete_method -> '-> 'b) ->
    'JClass.jinterface -> 'JClass.jinterface
  val map_interface_or_class_context :
    ?force:bool ->
    ('JClass.concrete_method -> '-> 'b) ->
    'JClass.interface_or_class -> 'JClass.interface_or_class
  val map_class_with_native_context :
    ('JClass.concrete_method ->
     'JClass.implementation -> 'JClass.implementation) ->
    'JClass.jclass -> 'JClass.jclass
  val map_interface_with_native_context :
    ('JClass.concrete_method ->
     'JClass.implementation -> 'JClass.implementation) ->
    'JClass.jinterface -> 'JClass.jinterface
  val map_interface_or_class_with_native_context :
    ('JClass.concrete_method ->
     'JClass.implementation -> 'JClass.implementation) ->
    'JClass.interface_or_class -> 'JClass.interface_or_class
  val remove_invokedynamic :
    JCode.jcode JClass.interface_or_class ->
    JBasics.method_signature ->
    int ->
    prefix:string ->
    JCode.jcode JClass.interface_or_class *
    JCode.jcode JClass.interface_or_class
  val remove_invokedynamics_in_method :
    JCode.jcode JClass.interface_or_class ->
    JBasics.method_signature ->
    prefix:string ->
    JCode.jcode JClass.interface_or_class *
    JCode.jcode JClass.interface_or_class JBasics.ClassMap.t
  val remove_invokedynamics :
    JCode.jcode JClass.interface_or_class ->
    prefix:string ->
    JCode.jcode JClass.interface_or_class *
    JCode.jcode JClass.interface_or_class JBasics.ClassMap.t
end