Skip to content

Commit f1835c4

Browse files
flambda-backend: New extensions API, supporting maturity levels (#1454)
* New extensions API, supporting for maturity levels * Fix ocamldoc failure * Nick's suggestions, plus some cleaning up * Refactor [fail] in the style of [Base.failwithf] --------- Co-authored-by: Nick Roberts <[email protected]>
1 parent 1deb5af commit f1835c4

24 files changed

+460
-255
lines changed

.depend

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ utils/int_replace_polymorphic_compare.cmx : \
128128
utils/int_replace_polymorphic_compare.cmi
129129
utils/int_replace_polymorphic_compare.cmi :
130130
utils/language_extension.cmo : \
131+
utils/misc.cmi \
131132
utils/language_extension.cmi
132133
utils/language_extension.cmx : \
134+
utils/misc.cmx \
133135
utils/language_extension.cmi
134136
utils/language_extension.cmi :
135137
utils/lazy_backtrack.cmo : \
@@ -534,6 +536,7 @@ parsing/parser.cmo : \
534536
parsing/parsetree.cmi \
535537
parsing/longident.cmi \
536538
parsing/location.cmi \
539+
parsing/jane_syntax_parsing.cmi \
537540
parsing/jane_syntax.cmi \
538541
parsing/docstrings.cmi \
539542
utils/clflags.cmi \
@@ -547,6 +550,7 @@ parsing/parser.cmx : \
547550
parsing/parsetree.cmi \
548551
parsing/longident.cmx \
549552
parsing/location.cmx \
553+
parsing/jane_syntax_parsing.cmx \
550554
parsing/jane_syntax.cmx \
551555
parsing/docstrings.cmx \
552556
utils/clflags.cmx \
@@ -2030,6 +2034,7 @@ typing/typetexp.cmo : \
20302034
parsing/location.cmi \
20312035
typing/layouts.cmi \
20322036
utils/language_extension.cmi \
2037+
parsing/jane_syntax.cmi \
20332038
typing/errortrace.cmi \
20342039
typing/env.cmi \
20352040
typing/ctype.cmi \
@@ -2053,6 +2058,7 @@ typing/typetexp.cmx : \
20532058
parsing/location.cmx \
20542059
typing/layouts.cmx \
20552060
utils/language_extension.cmx \
2061+
parsing/jane_syntax.cmx \
20562062
typing/errortrace.cmx \
20572063
typing/env.cmx \
20582064
typing/ctype.cmx \
@@ -6803,6 +6809,7 @@ toplevel/topcommon.cmi : \
68036809
typing/outcometree.cmi \
68046810
parsing/longident.cmi \
68056811
parsing/location.cmi \
6812+
typing/layouts.cmi \
68066813
typing/ident.cmi \
68076814
toplevel/genprintval.cmi \
68086815
typing/env.cmi \
@@ -7078,7 +7085,6 @@ toplevel/native/topeval.cmo : \
70787085
parsing/location.cmi \
70797086
utils/load_path.cmi \
70807087
utils/linkage_name.cmi \
7081-
typing/layouts.cmi \
70827088
lambda/lambda.cmi \
70837089
typing/includemod.cmi \
70847090
typing/ident.cmi \
@@ -7112,7 +7118,6 @@ toplevel/native/topeval.cmx : \
71127118
parsing/location.cmx \
71137119
utils/load_path.cmx \
71147120
utils/linkage_name.cmx \
7115-
typing/layouts.cmx \
71167121
lambda/lambda.cmx \
71177122
typing/includemod.cmx \
71187123
typing/ident.cmx \

boot/menhir/parser.ml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -995,7 +995,13 @@ let check_layout loc id =
995995

996996
(* Unboxed literals *)
997997

998-
let unboxed_literals_extension : Language_extension.t = Layouts Alpha
998+
(* CR layouts v2: The [unboxed_*] functions will both be improved and lose
999+
their explicit assert once we have real unboxed literals in Jane syntax; they
1000+
may also get re-inlined at that point *)
1001+
let unboxed_literals_extension = Language_extension.Layouts
1002+
let assert_unboxed_literals ~loc =
1003+
Language_extension.(
1004+
Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Alpha)
9991005

10001006
type sign = Positive | Negative
10011007

@@ -1004,15 +1010,10 @@ let with_sign sign num =
10041010
| Positive -> num
10051011
| Negative -> "-" ^ num
10061012

1007-
(* CR layouts ASZ: The [unboxed_*] functions will both be improved and lose
1008-
their explicit assert once we have real unboxed literals in Jane syntax; they
1009-
may also get re-inlined at that point *)
1010-
10111013
let unboxed_int sloc int_loc sign (n, m) =
10121014
match m with
10131015
| Some _ ->
1014-
Jane_syntax_parsing.assert_extension_enabled
1015-
~loc:(make_loc sloc) unboxed_literals_extension;
1016+
assert_unboxed_literals ~loc:(make_loc sloc);
10161017
Pconst_integer (with_sign sign n, m)
10171018
| None ->
10181019
if Language_extension.is_enabled unboxed_literals_extension then
@@ -1021,8 +1022,7 @@ let unboxed_int sloc int_loc sign (n, m) =
10211022
not_expecting sloc "line number directive"
10221023

10231024
let unboxed_float sloc sign (f, m) =
1024-
Jane_syntax_parsing.assert_extension_enabled
1025-
~loc:(make_loc sloc) unboxed_literals_extension;
1025+
assert_unboxed_literals ~loc:(make_loc sloc);
10261026
Pconst_float (with_sign sign f, m)
10271027

10281028
(* Jane syntax *)

driver/compenv.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -490,7 +490,7 @@ let read_one_param ppf position name v =
490490
| "dump-into-file" -> Clflags.dump_into_file := true
491491
| "dump-dir" -> Clflags.dump_dir := Some v
492492

493-
| "extension" -> Language_extension.(enable (of_string_exn v))
493+
| "extension" -> Language_extension.enable_of_string_exn v
494494
| "disable-all-extensions" ->
495495
if check_bool ppf name v then Language_extension.disallow_extensions ()
496496

driver/main_args.ml

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -732,15 +732,15 @@ let mk_dump_into_file f =
732732

733733
let mk_extension f =
734734
let available_extensions =
735-
Language_extension.(List.map to_string all)
735+
Language_extension.Exist.(List.concat_map to_command_line_strings all)
736736
in
737737
"-extension", Arg.Symbol (available_extensions, f),
738738
" Enable the specified extension (may be specified more than once)"
739739
;;
740740

741741
let mk_no_extension f =
742742
let available_extensions =
743-
Language_extension.(List.map to_string all)
743+
Language_extension.Exist.(List.concat_map to_command_line_strings all)
744744
in
745745
"-no-extension", Arg.Symbol (available_extensions, f),
746746
" Disable the specified extension (may be specified more than once)"
@@ -756,8 +756,11 @@ let mk_disable_all_extensions f =
756756

757757
let mk_only_erasable_extensions f =
758758
let erasable_extensions =
759-
let open Language_extension in
760-
all |> List.filter is_erasable |> List.map to_string |> String.concat ", "
759+
let open Language_extension.Exist in
760+
all |>
761+
List.filter is_erasable |>
762+
List.concat_map to_command_line_strings |>
763+
String.concat ", "
761764
in
762765
"-only-erasable-extensions", Arg.Unit f,
763766
" Disable all extensions that cannot be \"erased\" to attributes,\n\
@@ -1818,8 +1821,8 @@ module Default = struct
18181821
let _disable_all_extensions = Language_extension.disallow_extensions
18191822
let _only_erasable_extensions =
18201823
Language_extension.restrict_to_erasable_extensions
1821-
let _extension s = Language_extension.(enable (of_string_exn s))
1822-
let _no_extension s = Language_extension.(disable (of_string_exn s))
1824+
let _extension s = Language_extension.(enable_of_string_exn s)
1825+
let _no_extension s = Language_extension.(disable_of_string_exn s)
18231826
let _noassert = set noassert
18241827
let _nolabels = set classic
18251828
let _nostdlib = set no_std_include

driver/makedepend.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ let run_main argv =
662662
let program = Filename.basename Sys.argv.(0) in
663663
Compenv.parse_arguments (ref argv)
664664
(add_dep_arg (fun f -> Src (f, None))) program;
665-
List.iter Language_extension.enable Language_extension.max_compatible;
665+
Language_extension.enable_maximal ();
666666
process_dep_args (List.rev !dep_args_rev);
667667
Compenv.readenv ppf Before_link;
668668
if !sort_files then sort_files_by_dependencies !files

parsing/builtin_attributes.ml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -478,10 +478,9 @@ let layout ~legacy_immediate attrs =
478478
| Value -> check true
479479
| Immediate | Immediate64 ->
480480
check (legacy_immediate
481-
|| Language_extension.( is_enabled (Layouts Beta)
482-
|| is_enabled (Layouts Alpha)))
481+
|| Language_extension.(is_at_least Layouts Beta))
483482
| Any | Void ->
484-
check (Language_extension.is_enabled (Layouts Alpha))
483+
check Language_extension.(is_at_least Layouts Alpha)
485484

486485
(* The "ocaml.boxed (default)" and "ocaml.unboxed (default)"
487486
attributes cannot be input by the user, they are added by the

parsing/jane_syntax.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ module Comprehensions = struct
268268
| ["array"; "immutable"], Pexp_lazy comp ->
269269
(* assert_extension_enabled:
270270
See Note [Check for immutable extension in comprehensions code] *)
271-
assert_extension_enabled ~loc:expr.pexp_loc Immutable_arrays;
271+
assert_extension_enabled ~loc:expr.pexp_loc Immutable_arrays ();
272272
Cexp_array_comprehension (Immutable, comprehension_of_expr comp)
273273
| bad, _ ->
274274
Desugaring_error.raise expr (Bad_comprehension_embedding bad)

parsing/jane_syntax_parsing.ml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -83,11 +83,11 @@ open Parsetree
8383

8484
module Feature : sig
8585
type t =
86-
| Language_extension of Language_extension.t
86+
| Language_extension : _ Language_extension.t -> t
8787
| Builtin
8888

8989
type error =
90-
| Disabled_extension of Language_extension.t
90+
| Disabled_extension : _ Language_extension.t -> error
9191
| Unknown_extension of string
9292

9393
val describe_uppercase : t -> string
@@ -98,11 +98,11 @@ module Feature : sig
9898

9999
val is_erasable : t -> bool
100100
end = struct
101-
type t = Language_extension of Language_extension.t
101+
type t = Language_extension : _ Language_extension.t -> t
102102
| Builtin
103103

104104
type error =
105-
| Disabled_extension of Language_extension.t
105+
| Disabled_extension : _ Language_extension.t -> error
106106
| Unknown_extension of string
107107

108108
let builtin_component = "_builtin"
@@ -122,10 +122,10 @@ end = struct
122122
Ok Builtin
123123
else
124124
match Language_extension.of_string str with
125-
| Some ext when Language_extension.is_enabled ext ->
126-
Ok (Language_extension ext)
127-
| Some ext ->
128-
Error (Disabled_extension ext)
125+
| Some (Pack ext) ->
126+
if Language_extension.is_enabled ext
127+
then Ok (Language_extension ext)
128+
else Error (Disabled_extension ext)
129129
| None ->
130130
Error (Unknown_extension str)
131131

@@ -334,7 +334,7 @@ module Error = struct
334334
| Malformed_embedding of
335335
Embedding_syntax.t * Embedded_name.t * malformed_embedding
336336
| Unknown_extension of Embedding_syntax.t * Erasability.t * string
337-
| Disabled_extension of Language_extension.t
337+
| Disabled_extension : _ Language_extension.t -> error
338338
| Wrong_syntactic_category of Feature.t * string
339339
| Misnamed_embedding of
340340
Misnamed_embedding_error.t * string * Embedding_syntax.t
@@ -347,8 +347,8 @@ end
347347

348348
open Error
349349

350-
let assert_extension_enabled ~loc ext =
351-
if not (Language_extension.is_enabled ext) then
350+
let assert_extension_enabled ~loc ext setting =
351+
if not (Language_extension.is_at_least ext setting) then
352352
raise (Error(loc, Disabled_extension ext))
353353
;;
354354

parsing/jane_syntax_parsing.mli

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@
9494
built-in features. *)
9595
module Feature : sig
9696
type t =
97-
| Language_extension of Language_extension.t
97+
| Language_extension : _ Language_extension.t -> t
9898
| Builtin
9999

100100
(** The component of an attribute or extension name that identifies the
@@ -238,13 +238,14 @@ module AST : sig
238238
-> ('ast -> 'a option)
239239
end
240240

241-
(** Require that an extension is enabled, or else throw an exception (of an
242-
abstract type) at the provided location saying otherwise. This is intended
243-
to be used in [jane_syntax.ml] when a certain piece of syntax requires two
244-
extensions to be enabled at once (e.g., immutable array comprehensions such
245-
as [[:x for x = 1 to 10:]], which require both [Comprehensions] and
246-
[Immutable_arrays]). *)
247-
val assert_extension_enabled : loc:Location.t -> Language_extension.t -> unit
241+
(** Require that an extension is enabled for at least the provided level, or
242+
else throw an exception (of an abstract type) at the provided location
243+
saying otherwise. This is intended to be used in [jane_syntax.ml] when a
244+
certain piece of syntax requires two extensions to be enabled at once (e.g.,
245+
immutable array comprehensions such as [[:x for x = 1 to 10:]], which
246+
require both [Comprehensions] and [Immutable_arrays]). *)
247+
val assert_extension_enabled :
248+
loc:Location.t -> 'a Language_extension.t -> 'a -> unit
248249

249250
(* CR-someday nroberts: An earlier version of this revealed less of its
250251
implementation in its name: it was called [match_jane_syntax], and

parsing/parser.mly

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -782,7 +782,13 @@ let check_layout loc id =
782782

783783
(* Unboxed literals *)
784784

785-
let unboxed_literals_extension : Language_extension.t = Layouts Alpha
785+
(* CR layouts v2: The [unboxed_*] functions will both be improved and lose
786+
their explicit assert once we have real unboxed literals in Jane syntax; they
787+
may also get re-inlined at that point *)
788+
let unboxed_literals_extension = Language_extension.Layouts
789+
let assert_unboxed_literals ~loc =
790+
Language_extension.(
791+
Jane_syntax_parsing.assert_extension_enabled ~loc Layouts Alpha)
786792

787793
type sign = Positive | Negative
788794

@@ -791,15 +797,10 @@ let with_sign sign num =
791797
| Positive -> num
792798
| Negative -> "-" ^ num
793799

794-
(* CR layouts ASZ: The [unboxed_*] functions will both be improved and lose
795-
their explicit assert once we have real unboxed literals in Jane syntax; they
796-
may also get re-inlined at that point *)
797-
798800
let unboxed_int sloc int_loc sign (n, m) =
799801
match m with
800802
| Some _ ->
801-
Jane_syntax_parsing.assert_extension_enabled
802-
~loc:(make_loc sloc) unboxed_literals_extension;
803+
assert_unboxed_literals ~loc:(make_loc sloc);
803804
Pconst_integer (with_sign sign n, m)
804805
| None ->
805806
if Language_extension.is_enabled unboxed_literals_extension then
@@ -808,8 +809,7 @@ let unboxed_int sloc int_loc sign (n, m) =
808809
not_expecting sloc "line number directive"
809810

810811
let unboxed_float sloc sign (f, m) =
811-
Jane_syntax_parsing.assert_extension_enabled
812-
~loc:(make_loc sloc) unboxed_literals_extension;
812+
assert_unboxed_literals ~loc:(make_loc sloc);
813813
Pconst_float (with_sign sign f, m)
814814

815815
(* Jane syntax *)

testsuite/tests/ast-invariants/test.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,5 +85,5 @@ let rec walk dir =
8585
(Sys.readdir dir)
8686

8787
let () =
88-
List.iter Language_extension.enable Language_extension.max_compatible;
88+
Language_extension.enable_maximal ();
8989
walk root

testsuite/tests/comprehensions/syntax.ml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
(* TEST
22
include ocamlcommon *)
33

4-
let () = Language_extension.enable Comprehensions;;
4+
let () = Language_extension.enable Comprehensions ();;
55

66
let printf = Printf.printf;;
77

0 commit comments

Comments
 (0)