sig
  type java_type =
      [ `Array of Descriptor.non_void_java_type
      | `Boolean
      | `Byte
      | `Char
      | `Class of Name.for_class
      | `Double
      | `Float
      | `Int
      | `Long
      | `Short
      | `Void ]
  and non_void_java_type =
      [ `Array of Descriptor.non_void_java_type
      | `Boolean
      | `Byte
      | `Char
      | `Class of Name.for_class
      | `Double
      | `Float
      | `Int
      | `Long
      | `Short ]
  type array_type =
      [ `Array of
          [ `Array of 'a
          | `Boolean
          | `Byte
          | `Char
          | `Class of Name.for_class
          | `Double
          | `Float
          | `Int
          | `Long
          | `Short ] as 'a ]
  type error =
      Invalid_class_name
    | Invalid_array_element_type
    | Array_with_too_many_dimensions
    | Invalid_descriptor_string
    | Empty_descriptor_string
    | Invalid_field_type
    | Invalid_local_variable_type
    | Invalid_method_descriptor
    | Invalid_method_parameter_type
    | Void_not_allowed
  exception Exception of Descriptor.error
  val string_of_error : Descriptor.error -> string
  val is_primitive : Descriptor.java_type -> bool
  val filter_void :
    Descriptor.error -> Descriptor.java_type -> Descriptor.non_void_java_type
  val filter_non_array :
    Descriptor.error -> Descriptor.java_type -> Descriptor.array_type
  val java_type_of_internal_utf8 : Utils.UTF8.t -> Descriptor.java_type
  val internal_utf8_of_java_type : Descriptor.java_type -> Utils.UTF8.t
  val external_utf8_of_java_type : Descriptor.java_type -> Utils.UTF8.t
  val java_type_of_external_utf8 : Utils.UTF8.t -> Descriptor.java_type
  val equal_java_type : Descriptor.java_type -> Descriptor.java_type -> bool
  val compare_java_type : Descriptor.java_type -> Descriptor.java_type -> int
  val hash_java_type : Descriptor.java_type -> int
  type for_field = Descriptor.non_void_java_type
  val field_of_utf8 : Utils.UTF8.t -> Descriptor.for_field
  val utf8_of_field : Descriptor.for_field -> Utils.UTF8.t
  val java_type_of_external_utf8_no_void :
    Utils.UTF8.t -> Descriptor.for_field
  val java_type_of_internal_utf8_no_void :
    Utils.UTF8.t -> Descriptor.for_field
  val equal_for_field : Descriptor.for_field -> Descriptor.for_field -> bool
  val compare_for_field : Descriptor.for_field -> Descriptor.for_field -> int
  val hash_for_field : Descriptor.for_field -> int
  type for_parameter = Descriptor.non_void_java_type
  val parameter_of_utf8 : Utils.UTF8.t -> Descriptor.for_parameter
  val utf8_of_parameter : Descriptor.for_parameter -> Utils.UTF8.t
  val equal_for_parameter :
    Descriptor.for_parameter -> Descriptor.for_parameter -> bool
  val compare_for_parameter :
    Descriptor.for_parameter -> Descriptor.for_parameter -> int
  val hash_for_parameter : Descriptor.for_parameter -> int
  type for_method = Descriptor.for_parameter list * Descriptor.java_type
  val method_of_utf8 : Utils.UTF8.t -> Descriptor.for_method
  val utf8_of_method : Descriptor.for_method -> Utils.UTF8.t
  val equal_for_method :
    Descriptor.for_method -> Descriptor.for_method -> bool
  val compare_for_method :
    Descriptor.for_method -> Descriptor.for_method -> int
  val hash_for_method : Descriptor.for_method -> int
end