sig
  type typeVariable = TypeVariable of string
  type typeArgument =
      ArgumentExtends of JSignature.fieldTypeSignature
    | ArgumentInherits of JSignature.fieldTypeSignature
    | ArgumentIs of JSignature.fieldTypeSignature
    | ArgumentIsAny
  and simpleClassTypeSignature = {
    scts_name : string;
    scts_type_arguments : JSignature.typeArgument list;
  }
  and classTypeSignature = {
    cts_package : string list;
    cts_enclosing_classes : JSignature.simpleClassTypeSignature list;
    cts_simple_class_type_signature : JSignature.simpleClassTypeSignature;
  }
  and formalTypeParameter = {
    ftp_name : string;
    ftp_class_bound : JSignature.fieldTypeSignature option;
    ftp_interface_bounds : JSignature.fieldTypeSignature list;
  }
  and throwsSignature =
      ThrowsClass of JSignature.classTypeSignature
    | ThrowsTypeVariable of JSignature.typeVariable
  and typeSignature =
      GBasic of JBasics.java_basic_type
    | GObject of JSignature.fieldTypeSignature
  and classSignature = {
    cs_formal_type_parameters : JSignature.formalTypeParameter list;
    cs_super_class : JSignature.classTypeSignature;
    cs_super_interfaces : JSignature.classTypeSignature list;
  }
  and fieldTypeSignature =
      GClass of JSignature.classTypeSignature
    | GArray of JSignature.typeSignature
    | GVariable of JSignature.typeVariable
  type methodTypeSignature = {
    mts_formal_type_parameters : JSignature.formalTypeParameter list;
    mts_type_signature : JSignature.typeSignature list;
    mts_return_type : JSignature.typeSignature option;
    mts_throws : JSignature.throwsSignature list;
  }
end