sig
  type class_signature = {
    formal_type_parameters : Signature.formal_type_parameter list;
    super_class_signature : Signature.class_type_signature;
    super_interface_signatures : Signature.class_type_signature list;
  }
  and formal_type_parameter = {
    identifier : Utils.UTF8.t;
    class_bound : Signature.field_type_signature;
    interface_bounds : Signature.field_type_signature list;
  }
  and field_type_signature =
      Class_type_signature of Signature.class_type_signature
    | Array_type_signature of Signature.array_type_signature
    | Type_variable_signature of Signature.type_variable_signature
  and class_type_signature = {
    qualified_class_name : Name.for_class;
    type_arguments : Signature.type_argument list;
    signature_suffix : Signature.class_type_signature_suffix list;
  }
  and array_type_signature = Signature.type_signature
  and type_signature =
      Field_type_signature of Signature.field_type_signature
    | Base_type of Descriptor.java_type
  and type_variable_signature = Utils.UTF8.t
  and type_argument =
      Star
    | Plus of Signature.field_type_signature
    | Minus of Signature.field_type_signature
    | Simple of Signature.field_type_signature
  and class_type_signature_suffix = {
    suffix_identifier : Utils.UTF8.t;
    suffix_type_arguments : Signature.type_argument list;
  }
  and method_signature = {
    formal_type_params : Signature.formal_type_parameter list;
    types : Signature.type_signature list;
    return : Signature.type_signature;
    throws_signatures : Signature.throws_signature list;
  }
  and throws_signature =
      Throws_class_type_signature of Signature.class_type_signature
    | Throws_type_variable_signature of Signature.type_variable_signature
  val equal_class_signature :
    Signature.class_signature -> Signature.class_signature -> bool
  val equal_formal_type_parameter :
    Signature.formal_type_parameter ->
    Signature.formal_type_parameter -> bool
  val equal_field_type_signature :
    Signature.field_type_signature -> Signature.field_type_signature -> bool
  val equal_class_type_signature :
    Signature.class_type_signature -> Signature.class_type_signature -> bool
  val equal_array_type_signature :
    Signature.array_type_signature -> Signature.array_type_signature -> bool
  val equal_type_signature :
    Signature.type_signature -> Signature.type_signature -> bool
  val equal_type_variable_signature :
    Signature.type_variable_signature ->
    Signature.type_variable_signature -> bool
  val equal_type_argument :
    Signature.type_argument -> Signature.type_argument -> bool
  val equal_class_type_signature_suffix :
    Signature.class_type_signature_suffix ->
    Signature.class_type_signature_suffix -> bool
  val equal_method_signature :
    Signature.method_signature -> Signature.method_signature -> bool
  val equal_throws_signature :
    Signature.throws_signature -> Signature.throws_signature -> bool
  val compare_class_signature :
    Signature.class_signature -> Signature.class_signature -> int
  val compare_formal_type_parameter :
    Signature.formal_type_parameter -> Signature.formal_type_parameter -> int
  val compare_field_type_signature :
    Signature.field_type_signature -> Signature.field_type_signature -> int
  val compare_class_type_signature :
    Signature.class_type_signature -> Signature.class_type_signature -> int
  val compare_array_type_signature :
    Signature.array_type_signature -> Signature.array_type_signature -> int
  val compare_type_signature :
    Signature.type_signature -> Signature.type_signature -> int
  val compare_type_variable_signature :
    Signature.type_variable_signature ->
    Signature.type_variable_signature -> int
  val compare_type_argument :
    Signature.type_argument -> Signature.type_argument -> int
  val compare_class_type_signature_suffix :
    Signature.class_type_signature_suffix ->
    Signature.class_type_signature_suffix -> int
  val compare_method_signature :
    Signature.method_signature -> Signature.method_signature -> int
  val compare_throws_signature :
    Signature.throws_signature -> Signature.throws_signature -> int
  val hash_class_signature : Signature.class_signature -> int
  val hash_formal_type_parameter : Signature.formal_type_parameter -> int
  val hash_field_type_signature : Signature.field_type_signature -> int
  val hash_class_type_signature : Signature.class_type_signature -> int
  val hash_array_type_signature : Signature.array_type_signature -> int
  val hash_type_signature : Signature.type_signature -> int
  val hash_type_variable_signature : Signature.type_variable_signature -> int
  val hash_type_argument : Signature.type_argument -> int
  val hash_class_type_signature_suffix :
    Signature.class_type_signature_suffix -> int
  val hash_method_signature : Signature.method_signature -> int
  val hash_throws_signature : Signature.throws_signature -> int
  type error =
      Invalid_signature_type_header of Utils.UChar.t
    | Invalid_signature_primitive_character of Utils.UChar.t
    | Invalid_signature_type of Descriptor.java_type
    | Invalid_class_signature of Utils.UTF8.t
    | Invalid_field_signature of Utils.UTF8.t
    | Invalid_method_signature of Utils.UTF8.t
    | Extra_elements_after_class_signature of Utils.UTF8.t
    | Extra_elements_after_field_signature of Utils.UTF8.t
    | Extra_elements_after_method_signature of Utils.UTF8.t
  exception Exception of Signature.error
  val string_of_error : Signature.error -> string
  val class_signature_of_utf8 : Utils.UTF8.t -> Signature.class_signature
  val utf8_of_class_signature : Signature.class_signature -> Utils.UTF8.t
  val field_type_signature_of_utf8 :
    Utils.UTF8.t -> Signature.field_type_signature
  val utf8_of_field_type_signature :
    Signature.field_type_signature -> Utils.UTF8.t
  val method_signature_of_utf8 : Utils.UTF8.t -> Signature.method_signature
  val utf8_of_method_signature : Signature.method_signature -> Utils.UTF8.t
end