sig
  type location = Utils.u1 list
  type intervals = (Utils.u2 * Utils.u2 * Utils.u2) list
  type target =
      Typecast of Utils.u2
    | Typecast_loc of Utils.u2 * Annotation.location
    | Instance_of of Utils.u2
    | Instance_of_loc of Utils.u2 * Annotation.location
    | New of Utils.u2
    | New_loc of Utils.u2 * Annotation.location
    | Method_receiver
    | Local_variable of Annotation.intervals
    | Local_variable_loc of Annotation.intervals * Annotation.location
    | Method_return_type
    | Method_return_type_loc of Annotation.location
    | Method_parameter of Utils.u1
    | Method_parameter_loc of Utils.u1 * Annotation.location
    | Field
    | Field_loc of Annotation.location
    | Class_type_parameter_bound of Utils.u1 * Utils.u1
    | Class_type_parameter_bound_loc of Utils.u1 * Utils.u1 *
        Annotation.location
    | Method_type_parameter_bound of Utils.u1 * Utils.u1
    | Method_type_parameter_bound_loc of Utils.u1 * Utils.u1 *
        Annotation.location
    | Super_type of Utils.u2
    | Super_type_loc of Utils.u2 * Annotation.location
    | Thrown_exception of Utils.u2
    | Type_argument_constructor_call of Utils.u2 * Utils.u1
    | Type_argument_constructor_call_loc of Utils.u2 * Utils.u1 *
        Annotation.location
    | Type_argument_method_call of Utils.u2 * Utils.u1
    | Type_argument_method_call_loc of Utils.u2 * Utils.u1 *
        Annotation.location
    | Wildcard_bound of Annotation.target
    | Wildcard_bound_loc of Annotation.target * Annotation.location
    | Class_literal of Utils.u2
    | Class_literal_loc of Utils.u2 * Annotation.location
    | Method_type_parameter of Utils.u1
    | Class_type_parameter of Utils.u1
  type primitive_type =
      [ `Boolean | `Byte | `Char | `Double | `Float | `Int | `Long | `Short ]
  type info_element_value =
      Primitive of Annotation.primitive_type * Utils.u2
    | String of Utils.u2
    | Enum of Utils.u2 * Utils.u2
    | Class of Utils.u2
    | Annotation of Annotation.info
    | Array of Utils.u2 * Annotation.info_element_value array
  and info = {
    type_index : Utils.u2;
    num_element_value_pairs : Utils.u2;
    element_value_pairs : (Utils.u2 * Annotation.info_element_value) array;
  }
  and extended_info = {
    ext_type_index : Utils.u2;
    ext_num_element_value_pairs : Utils.u2;
    ext_element_value_pairs :
      (Utils.u2 * Annotation.info_element_value) array;
    ext_target : Annotation.target;
  }
  type error =
      Invalid_tag of Utils.UChar.t
    | Inconsistent_primitive_value
    | Invalid_string_value of Utils.u2
    | Invalid_enum_value of Utils.u2 * Utils.u2
    | Invalid_class_value of Utils.u2
    | Invalid_annotation_type_value of Utils.u2
    | Invalid_element_name of Utils.u2
    | Invalid_list_length of int
    | Invalid_target of int
  exception Exception of Annotation.error
  val string_of_error : Annotation.error -> string
  val read_target : InputStream.t -> Annotation.target
  val write_target : OutputStream.t -> Annotation.target -> unit
  val read_info_element_value :
    InputStream.t -> Annotation.info_element_value
  val write_info_element_value :
    OutputStream.t -> Annotation.info_element_value -> unit
  val read_info : InputStream.t -> Annotation.info
  val write_info : OutputStream.t -> Annotation.info -> unit
  val read_extended_info : InputStream.t -> Annotation.extended_info
  val write_extended_info :
    OutputStream.t -> Annotation.extended_info -> unit
  type element_value =
      Boolean_value of bool
    | Byte_value of int
    | Char_value of Utils.UChar.t
    | Double_value of float
    | Float_value of float
    | Int_value of int32
    | Long_value of int64
    | Short_value of int
    | String_value of Utils.UTF8.t
    | Enum_value of Name.for_class * Name.for_field
    | Class_value of Name.for_class
    | Annotation_value of Annotation.t
    | Array_value of Annotation.element_value list
  and t = Name.for_class * (Utils.UTF8.t * Annotation.element_value) list
  and extended =
      Name.for_class * (Utils.UTF8.t * Annotation.element_value) list *
      Annotation.target
  val equal_element_value :
    Annotation.element_value -> Annotation.element_value -> bool
  val compare_element_value :
    Annotation.element_value -> Annotation.element_value -> int
  val hash_element_value : Annotation.element_value -> int
  val equal : Annotation.t -> Annotation.t -> bool
  val compare : Annotation.t -> Annotation.t -> int
  val hash : Annotation.t -> int
  val equal_extended : Annotation.extended -> Annotation.extended -> bool
  val compare_extended : Annotation.extended -> Annotation.extended -> int
  val hash_extended : Annotation.extended -> int
  val decode_element_value :
    ConstantPool.t ->
    Annotation.info_element_value -> Annotation.element_value
  val decode : ConstantPool.t -> Annotation.info -> Annotation.t
  val decode_extended :
    ConstantPool.t -> Annotation.extended_info -> Annotation.extended
  val encode_element_value :
    ConstantPool.extendable ->
    Annotation.element_value -> Annotation.info_element_value
  val encode : ConstantPool.extendable -> Annotation.t -> Annotation.info
  val encode_extended :
    ConstantPool.extendable ->
    Annotation.extended -> Annotation.extended_info
end