From ade211ad0686a4950394955b1f4c4ab7fde5ac44 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Sat, 29 Nov 2025 19:16:12 +0000 Subject: [PATCH 1/2] dev Signed-off-by: Rudi Grinberg From 2d57273ed5f16d9e7d9e68bf0d777feacf892315 Mon Sep 17 00:00:00 2001 From: Rudi Grinberg Date: Sat, 6 Dec 2025 01:15:30 +0000 Subject: [PATCH 2/2] refactor: hoist up a bunch of [sum] definitions There's no need to create them more than once Signed-off-by: Rudi Grinberg --- src/dune_lang/ordered_set_lang.ml | 18 ++++++++-------- src/dune_lang/targets_spec.ml | 32 +++++++++++++++------------- src/predicate_lang/predicate_lang.ml | 6 +++--- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/dune_lang/ordered_set_lang.ml b/src/dune_lang/ordered_set_lang.ml index a0ae4a69eca..10f17801236 100644 --- a/src/dune_lang/ordered_set_lang.ml +++ b/src/dune_lang/ordered_set_lang.ml @@ -98,15 +98,15 @@ module Parse = struct many [] ;; - let with_include ~elt = - generic - ~elt - ~inc: - (sum - [ ( ":include" - , let+ s = String_with_vars.decode in - Include s ) - ]) + let with_include = + let inc = + sum + [ ( ":include" + , let+ s = String_with_vars.decode in + Include s ) + ] + in + fun ~elt -> generic ~elt ~inc ;; let without_include ~elt = diff --git a/src/dune_lang/targets_spec.ml b/src/dune_lang/targets_spec.ml index 0267f0e6805..8bfaf668b23 100644 --- a/src/dune_lang/targets_spec.ml +++ b/src/dune_lang/targets_spec.ml @@ -43,23 +43,25 @@ type 'a t = | Static of 'a Static.t | Infer -let decode_target ~allow_directory_targets = +let decode_target = let module K = Kind in let open Dune_sexp.Decoder in - let file = - let+ file = String_with_vars.decode in - file, K.File - in - let dir = - let+ dir = sum ~force_parens:true [ "dir", String_with_vars.decode ] in - if not allow_directory_targets - then - User_error.raise - ~loc:(String_with_vars.loc dir) - [ Pp.text "Directory targets require the 'directory-targets' extension" ]; - dir, K.Directory - in - file <|> dir + let dir = sum ~force_parens:true [ "dir", String_with_vars.decode ] in + fun ~allow_directory_targets -> + let file = + let+ file = String_with_vars.decode in + file, K.File + in + let dir = + let+ dir = dir in + if not allow_directory_targets + then + User_error.raise + ~loc:(String_with_vars.loc dir) + [ Pp.text "Directory targets require the 'directory-targets' extension" ]; + dir, K.Directory + in + file <|> dir ;; let decode_static ~allow_directory_targets = diff --git a/src/predicate_lang/predicate_lang.ml b/src/predicate_lang/predicate_lang.ml index 426878ab642..c1fea2d6918 100644 --- a/src/predicate_lang/predicate_lang.ml +++ b/src/predicate_lang/predicate_lang.ml @@ -53,8 +53,8 @@ let rec decode_one = let not_or a = not (Or a) in fun f -> let open Decoder in - let bool_ops () = - sum [ "or", many f or_ []; "and", many f and_ []; "not", many f not_or [] ] + let bool_ops = + lazy (sum [ "or", many f or_ []; "and", many f and_ []; "not", many f not_or [] ]) in let elt = let+ e = f in @@ -79,7 +79,7 @@ let rec decode_one = User_error.raise ~loc [ Pp.text ":include isn't supported in the predicate language" ] - | "or" | "and" | "not" -> bool_ops () + | "or" | "and" | "not" -> Lazy.force bool_ops | s when s <> "" && s.[0] <> '-' && s.[0] <> ':' -> User_error.raise ~loc