Skip to content

Commit 5e7112b

Browse files
committed
Add tentative support for OCaml 5.3
The cmt format has changed, this tries to support value dependencies just based on the type of what's available in the new `Cmt_format.cmt_infos`. #202
1 parent 650bd42 commit 5e7112b

File tree

7 files changed

+68
-10
lines changed

7 files changed

+68
-10
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,10 @@ jobs:
6060
target: ocaml.5.2
6161
ocaml-compiler: 5.2.x
6262
build: opam exec -- dune build
63+
- os: ubuntu-latest
64+
target: ocaml.5.3
65+
ocaml-compiler: 5.3.x
66+
build: opam exec -- dune build
6367

6468
runs-on: ${{matrix.os}}
6569

src/Annotation.ml

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ let tagIsOneOfTheGenTypeAnnotations s =
2020
let rec getAttributePayload checkText (attributes : CL.Typedtree.attributes) =
2121
let rec fromExpr (expr : CL.Parsetree.expression) =
2222
match expr with
23-
| {pexp_desc = Pexp_constant (Pconst_string _ as cs)} ->
24-
Some (StringPayload (cs |> Compat.getStringValue))
25-
| {pexp_desc = Pexp_constant (Pconst_integer (n, _))} -> Some (IntPayload n)
26-
| {pexp_desc = Pexp_constant (Pconst_float (s, _))} -> Some (FloatPayload s)
23+
| { pexp_desc = Pexp_constant c} ->
24+
let desc = Compat.constant_desc c in
25+
(match desc with
26+
| Pconst_string _ -> Some (StringPayload (desc |> Compat.getStringValue))
27+
| Pconst_integer (n, _) -> Some (IntPayload n)
28+
| Pconst_float (s, _) -> Some (FloatPayload s)
29+
| _ -> None)
2730
| {
2831
pexp_desc = Pexp_construct ({txt = Lident (("true" | "false") as s)}, _);
2932
_;

src/Arnold.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -906,7 +906,8 @@ module Compile = struct
906906
| Texp_tuple expressions | Texp_array expressions ->
907907
expressions |> List.map (expression ~ctx) |> Command.unorderedSequence
908908
| Texp_assert _ -> Command.nothing
909-
| Texp_try (e, cases) ->
909+
| Texp_try _ ->
910+
let e, cases = expr.exp_desc |> Compat.getTexpTry in
910911
let cE = e |> expression ~ctx in
911912
let cCases = cases |> List.map (case ~ctx) |> Command.nondet in
912913
let open Command in

src/Compat.ml

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,10 @@ let getMtyFunctorModuleType (moduleType: Types.module_type) = match moduleType
174174
| _ -> None
175175

176176
let getTexpMatch desc = match desc with
177-
#if OCAML_VERSION >= (4, 08, 0)
177+
#if OCAML_VERSION >= (5, 3, 0)
178+
| Typedtree.Texp_match(e, cases, _values, partial) ->
179+
(e, cases, partial)
180+
#elif OCAML_VERSION >= (4, 08, 0)
178181
| Typedtree.Texp_match(e, cases, partial) ->
179182
(e, cases, partial)
180183
#else
@@ -183,8 +186,26 @@ let getTexpMatch desc = match desc with
183186
#endif
184187
| _ -> assert false
185188

189+
let getTexpTry desc = match desc with
190+
#if OCAML_VERSION >= (5, 3, 0)
191+
| Typedtree.Texp_try(e, cases, _values) ->
192+
(e, cases)
193+
#else
194+
| Typedtree.Texp_try(e, cases) ->
195+
(e, cases)
196+
#endif
197+
| _ -> assert false
198+
186199
let texpMatchGetExceptions desc = match desc with
187-
#if OCAML_VERSION >= (4, 08, 0)
200+
#if OCAML_VERSION >= (5, 3, 0)
201+
| Typedtree.Texp_match(_, cases, _, _) ->
202+
cases
203+
|> List.filter_map(fun ({Typedtree.c_lhs= pat}) ->
204+
match pat.pat_desc with
205+
| Tpat_exception({pat_desc}) -> Some(pat_desc)
206+
| _ -> None
207+
)
208+
#elif OCAML_VERSION >= (4, 08, 0)
188209
| Typedtree.Texp_match(_, cases, _) ->
189210
cases
190211
|> List.filter_map(fun ({Typedtree.c_lhs= pat}) ->
@@ -241,3 +262,29 @@ let get_desc = Types.get_desc
241262
#else
242263
let get_desc x = x.Types.desc
243264
#endif
265+
266+
let constant_desc d =
267+
#if OCAML_VERSION >= (5, 3, 0)
268+
d.Parsetree.pconst_desc
269+
#else
270+
d
271+
#endif
272+
273+
let extractValueDependencies (cmt_infos : CL.Cmt_format.cmt_infos) =
274+
#if OCAML_VERSION >= (5, 3, 0)
275+
let deps = ref [] in
276+
let process_dependency (_, uid1, uid2) =
277+
match
278+
( Types.Uid.Tbl.find_opt cmt_infos.cmt_uid_to_decl uid1,
279+
Types.Uid.Tbl.find_opt cmt_infos.cmt_uid_to_decl uid2 )
280+
with
281+
| Some (Value v1), Some (Value v2) ->
282+
deps := (v1.val_val, v2.val_val) :: !deps
283+
| _ -> ()
284+
in
285+
let items = cmt_infos.cmt_declaration_dependencies in
286+
List.iter process_dependency items;
287+
List.rev !deps
288+
#else
289+
cmt_infos.cmt_value_dependencies
290+
#endif

src/DeadCode.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,9 @@ let processCmt ~cmtFilePath (cmt_infos : CL.Cmt_format.cmt_infos) =
2525
Ideally, the handling should be less location-based, just like other language aspects. *)
2626
false
2727
in
28+
let cmt_value_dependencies = Compat.extractValueDependencies cmt_infos in
2829
DeadValue.processStructure ~doTypes:true ~doExternals
29-
~cmt_value_dependencies:cmt_infos.cmt_value_dependencies structure
30+
~cmt_value_dependencies structure
3031
| _ -> ());
3132
DeadType.TypeDependencies.forceDelayedItems ();
3233
DeadType.TypeDependencies.clear ()

src/Exception.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,8 @@ let traverseAst () =
351351
kind = Raises;
352352
}
353353
:: !currentEvents
354-
| Texp_try (e, cases) ->
354+
| Texp_try _ ->
355+
let e, cases = expr.exp_desc |> Compat.getTexpTry in
355356
let exceptions =
356357
cases
357358
|> List.map (fun case -> case.CL.Typedtree.c_lhs.pat_desc)

src/SideEffects.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ let rec exprNoSideEffects (expr : CL.Typedtree.expression) =
4646
&& cases |> List.for_all caseNoSideEffects
4747
| Texp_letmodule _ -> false
4848
| Texp_lazy e -> e |> exprNoSideEffects
49-
| Texp_try (e, cases) ->
49+
| Texp_try _ ->
50+
let e, cases = expr.exp_desc |> Compat.getTexpTry in
5051
e |> exprNoSideEffects && cases |> List.for_all caseNoSideEffects
5152
| Texp_tuple el -> el |> List.for_all exprNoSideEffects
5253
| Texp_variant (_lbl, eo) -> eo |> exprOptNoSideEffects

0 commit comments

Comments
 (0)