1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195
|
(* TEST
flags = "-I ${ocamlsrcdir}/parsing";
include ocamlcommon;
expect;
*)
[@@@alert "-deprecated"]
module L = Longident
[%%expect {|
module L = Longident
|}]
let flatten_ident = L.flatten (L.Lident "foo")
[%%expect {|
val flatten_ident : string list = ["foo"]
|}]
let flatten_dot = L.flatten (L.Ldot (L.Lident "M", "foo"))
[%%expect {|
val flatten_dot : string list = ["M"; "foo"]
|}]
let flatten_apply = L.flatten (L.Lapply (L.Lident "F", L.Lident "X"))
[%%expect {|
>> Fatal error: Longident.flat
Exception: Misc.Fatal_error.
|}]
let unflatten_empty = L.unflatten []
[%%expect {|
val unflatten_empty : L.t option = None
|}]
let unflatten_sing = L.unflatten ["foo"]
[%%expect {|
val unflatten_sing : L.t option = Some (L.Lident "foo")
|}]
let unflatten_dot = L.unflatten ["M"; "N"; "foo"]
[%%expect {|
val unflatten_dot : L.t option =
Some (L.Ldot (L.Ldot (L.Lident "M", "N"), "foo"))
|}]
let last_ident = L.last (L.Lident "foo")
[%%expect {|
val last_ident : string = "foo"
|}]
let last_dot = L.last (L.Ldot (L.Lident "M", "foo"))
[%%expect {|
val last_dot : string = "foo"
|}]
let last_apply = L.last (L.Lapply (L.Lident "F", L.Lident "X"))
[%%expect {|
>> Fatal error: Longident.last
Exception: Misc.Fatal_error.
|}]
let last_dot_apply = L.last
(L.Ldot (L.Lapply (L.Lident "F", L.Lident "X"), "foo"))
[%%expect {|
val last_dot_apply : string = "foo"
|}];;
type parse_result = { flat: L.t; spec:L.t; any_is_correct:bool }
let test specialized s =
let spec = specialized (Lexing.from_string s) in
{ flat = L.parse s;
spec;
any_is_correct = Parse.longident (Lexing.from_string s) = spec;
}
let parse_empty = L.parse ""
let parse_empty_val = Parse.longident (Lexing.from_string "")
[%%expect {|
type parse_result = { flat : L.t; spec : L.t; any_is_correct : bool; }
val test : (Lexing.lexbuf -> L.t) -> string -> parse_result = <fun>
val parse_empty : L.t = L.Lident ""
Exception:
Syntaxerr.Error
(Syntaxerr.Other
{Location.loc_start =
{Lexing.pos_fname = ""; pos_lnum = 1; pos_bol = 0; pos_cnum = 0};
loc_end =
{Lexing.pos_fname = ""; pos_lnum = 1; pos_bol = 0; pos_cnum = 0};
loc_ghost = false}).
|}]
let parse_ident = test Parse.val_ident "foo"
[%%expect {|
val parse_ident : parse_result =
{flat = L.Lident "foo"; spec = L.Lident "foo"; any_is_correct = true}
|}]
let parse_dot = test Parse.val_ident "M.foo"
[%%expect {|
val parse_dot : parse_result =
{flat = L.Ldot (L.Lident "M", "foo"); spec = L.Ldot (L.Lident "M", "foo");
any_is_correct = true}
|}]
let parse_path = test Parse.val_ident "M.N.foo"
[%%expect {|
val parse_path : parse_result =
{flat = L.Ldot (L.Ldot (L.Lident "M", "N"), "foo");
spec = L.Ldot (L.Ldot (L.Lident "M", "N"), "foo"); any_is_correct = true}
|}]
let parse_complex = test Parse.type_ident "M.F(M.N).N.foo"
(* the result below is a known misbehavior of Longident.parse
which does not handle applications properly. *)
[%%expect {|
val parse_complex : parse_result =
{flat =
L.Ldot (L.Ldot (L.Ldot (L.Ldot (L.Lident "M", "F(M"), "N)"), "N"), "foo");
spec =
L.Ldot
(L.Ldot
(L.Lapply (L.Ldot (L.Lident "M", "F"), L.Ldot (L.Lident "M", "N")),
"N"),
"foo");
any_is_correct = true}
|}]
let parse_op = test Parse.val_ident "M.(.%.()<-)"
(* the result below is another known misbehavior of Longident.parse. *)
[%%expect {|
val parse_op : parse_result =
{flat = L.Ldot (L.Ldot (L.Ldot (L.Lident "M", "("), "%"), "()<-)");
spec = L.Ldot (L.Lident "M", ".%.()<-"); any_is_correct = true}
|}]
let parse_let_op = test Parse.val_ident "M.(let+*!)"
[%%expect {|
val parse_let_op : parse_result =
{flat = L.Ldot (L.Lident "M", "(let+*!)");
spec = L.Ldot (L.Lident "M", "let+*!"); any_is_correct = true}
|}]
let constr = test Parse.constr_ident "true"
[%%expect{|
val constr : parse_result =
{flat = L.Lident "true"; spec = L.Lident "true"; any_is_correct = true}
|}]
let prefix_constr = test Parse.constr_ident "A.B.C.(::)"
[%%expect{|
val prefix_constr : parse_result =
{flat = L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "B"), "C"), "(::)");
spec = L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "B"), "C"), "::");
any_is_correct = true}
|}]
let mod_ext = test Parse.extended_module_path "A.F(B.C(X)).G(Y).D"
[%%expect{|
val mod_ext : parse_result =
{flat =
L.Ldot (L.Ldot (L.Ldot (L.Ldot (L.Lident "A", "F(B"), "C(X))"), "G(Y)"),
"D");
spec =
L.Ldot
(L.Lapply
(L.Ldot
(L.Lapply (L.Ldot (L.Lident "A", "F"),
L.Lapply (L.Ldot (L.Lident "B", "C"), L.Lident "X")),
"G"),
L.Lident "Y"),
"D");
any_is_correct = true}
|}]
let string_of_longident lid = Format.asprintf "%a" Pprintast.longident lid
[%%expect{|
val string_of_longident : Longident.t -> string = <fun>
|}]
let str_empty = string_of_longident parse_empty
[%%expect {|
val str_empty : string = ""
|}]
let str_ident = string_of_longident parse_ident.flat
[%%expect {|
val str_ident : string = "foo"
|}]
let str_dot = string_of_longident parse_dot.flat
[%%expect {|
val str_dot : string = "M.foo"
|}]
let str_path = string_of_longident parse_path.flat
[%%expect {|
val str_path : string = "M.N.foo"
|}]
let str_complex = string_of_longident
(let (&.) p word = L.Ldot(p, word) in
L.Lapply(L.Lident "M" &. "F", L.Lident "M" &. "N") &. "N" &. "foo")
[%%expect{|
val str_complex : string = "M.F(M.N).N.foo"
|}]
|