ident.mli 3.83 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
(**************************************************************************)
(*                                                                        *)
(*  Copyright (C) 2010-                                                   *)
(*    Francois Bobot                                                      *)
(*    Jean-Christophe Filliatre                                           *)
(*    Johannes Kanig                                                      *)
(*    Andrei Paskevich                                                    *)
(*                                                                        *)
(*  This software is free software; you can redistribute it and/or        *)
(*  modify it under the terms of the GNU Library General Public           *)
(*  License version 2.1, with the special exception on linking            *)
(*  described in file LICENSE.                                            *)
(*                                                                        *)
(*  This software is distributed in the hope that it will be useful,      *)
(*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *)
(*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                  *)
(*                                                                        *)
(**************************************************************************)

MARCHE Claude's avatar
MARCHE Claude committed
20 21
(** Identifiers *)

MARCHE Claude's avatar
MARCHE Claude committed
22 23 24 25 26 27 28
(** {2 Labels} *)

type label = string * Loc.position option

val label : ?loc:Loc.position -> string -> label

(** {2 Identifiers} *)
29 30

type ident = private {
31 32
  id_string : string;       (* non-unique name *)
  id_origin : origin;       (* origin of the ident *)
Andrei Paskevich's avatar
Andrei Paskevich committed
33
  id_label  : label list;   (* identifier labels *)
Andrei Paskevich's avatar
Andrei Paskevich committed
34
  id_tag    : Hashweak.tag; (* unique magical tag *)
35 36 37 38 39 40 41 42 43 44 45
}

and origin =
  | User of Loc.position
  | Derived of ident
  | Fresh

module Sid : Set.S with type elt = ident
module Mid : Map.S with type key = ident
module Hid : Hashtbl.S with type key = ident

46 47
val id_equal : ident -> ident -> bool

Andrei Paskevich's avatar
Andrei Paskevich committed
48 49
val id_hash : ident -> int

50 51
(* a user-created type of unregistered identifiers *)
type preid
52

53 54
(* register a pre-ident (never use this function) *)
val id_register : preid -> ident
55

56
(* create a fresh pre-ident *)
Andrei Paskevich's avatar
Andrei Paskevich committed
57
val id_fresh : ?labels:(label list) -> string -> preid
58

59
(* create a localized pre-ident *)
Andrei Paskevich's avatar
Andrei Paskevich committed
60
val id_user : ?labels:(label list) -> string -> Loc.position -> preid
61 62

(* create a derived pre-ident *)
Andrei Paskevich's avatar
Andrei Paskevich committed
63
val id_derive : ?labels:(label list) -> string -> ident -> preid
64

Andrei Paskevich's avatar
Andrei Paskevich committed
65 66
(* create a derived pre-ident with the same name and labels *)
val id_clone : ?labels:(label list) -> ident -> preid
67 68

(* create a duplicate pre-ident *)
Andrei Paskevich's avatar
Andrei Paskevich committed
69
val id_dup : ?labels:(label list) -> ident -> preid
70

71 72
(* id_derived_from i1 i2 <=> i1 is derived from i2 *)
val id_derived_from : ident -> ident -> bool
73

Francois Bobot's avatar
Francois Bobot committed
74 75 76
(* id_derived_from i1 i2 <=> i1 is derived from i2 *)
val id_from_user : ident -> Loc.position option

77 78
(** Unique persistent names for pretty printing *)

79
type ident_printer
80

81 82
val create_ident_printer :
  ?sanitizer : (string -> string) -> string list -> ident_printer
MARCHE Claude's avatar
MARCHE Claude committed
83
(** start a new printer with a sanitizing function and a blacklist *)
84

85 86
val id_unique :
  ident_printer -> ?sanitizer : (string -> string) -> ident -> string
87
(** use ident_printer to generate a unique name for ident
MARCHE Claude's avatar
MARCHE Claude committed
88
    an optional sanitizer is applied over the printer's sanitizer *)
89

90
val string_unique : ident_printer -> string -> string
MARCHE Claude's avatar
MARCHE Claude committed
91
(** Uniquify string *)
92

93
val forget_id : ident_printer -> ident -> unit
MARCHE Claude's avatar
MARCHE Claude committed
94
(** forget an ident *)
95

96
val forget_all : ident_printer -> unit
MARCHE Claude's avatar
MARCHE Claude committed
97
(** forget all idents *)
98 99

val sanitizer : (char -> string) -> (char -> string) -> string -> string
MARCHE Claude's avatar
MARCHE Claude committed
100 101 102
(** generic sanitizer taking a separate encoder for the first letter *)

(** various character encoders *)
103 104 105 106 107 108

val char_to_alpha : char -> string
val char_to_lalpha : char -> string
val char_to_ualpha : char -> string
val char_to_alnum : char -> string
val char_to_alnumus : char -> string
109