Skip to content

Commit d50209c

Browse files
authored
refactor: cleanups in the opam solver (ocaml#11439)
* Use |> to improve readability along with labels * Use `Package_version.dev` for the version Signed-off-by: Rudi Grinberg <[email protected]>
1 parent 26d680d commit d50209c

File tree

4 files changed

+72
-70
lines changed

4 files changed

+72
-70
lines changed

src/dune_pkg/opam_solver.ml

Lines changed: 46 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,9 @@ module Context = struct
148148
let available = OpamFile.OPAM.available opam in
149149
match
150150
OpamFilter.partial_eval
151-
(add_self_to_filter_env
152-
package
153-
(Solver_stats.Updater.wrap_env
154-
t.stats_updater
155-
(Solver_env.to_env t.solver_env)))
151+
(Solver_env.to_env t.solver_env
152+
|> Solver_stats.Updater.wrap_env t.stats_updater
153+
|> add_self_to_filter_env package)
156154
available
157155
|> eval_to_bool
158156
with
@@ -244,30 +242,34 @@ module Context = struct
244242
;;
245243

246244
let filter_deps t package filtered_formula =
247-
let name = OpamPackage.name package |> Package_name.of_opam_package_name in
248245
(* Add additional constraints to the formula. This works in two steps.
249246
First identify all the additional constraints applied to packages which
250247
appear in the current package's dependency formula. Then each additional
251248
constnraint is and-ed with the current package's dependency formula. *)
252249
let filtered_formula =
253250
OpamFormula.fold_left
254251
(fun additional_formulae (pkg, _) ->
255-
let name = Package_name.of_opam_package_name pkg in
256-
match Package_name.Map.find t.constraints name with
252+
match
253+
Package_name.of_opam_package_name pkg |> Package_name.Map.find t.constraints
254+
with
257255
| None -> additional_formulae
258256
| Some additional -> additional :: additional_formulae)
259257
[]
260258
filtered_formula
261259
|> List.fold_left ~init:filtered_formula ~f:(fun additional acc ->
262260
OpamFormula.And (acc, additional))
263261
in
264-
let package_is_local = Package_name.Map.mem t.local_packages name in
265-
Resolve_opam_formula.apply_filter
266-
(add_self_to_filter_env
267-
package
268-
(Solver_stats.Updater.wrap_env t.stats_updater (Solver_env.to_env t.solver_env)))
269-
~with_test:package_is_local
270-
filtered_formula
262+
let package_is_local =
263+
OpamPackage.name package
264+
|> Package_name.of_opam_package_name
265+
|> Package_name.Map.mem t.local_packages
266+
in
267+
Solver_env.to_env t.solver_env
268+
|> Solver_stats.Updater.wrap_env t.stats_updater
269+
|> add_self_to_filter_env package
270+
|> Resolve_opam_formula.apply_filter
271+
~with_test:package_is_local
272+
~formula:filtered_formula
271273
;;
272274

273275
let count_expanded_packages t = Table.fold t.expanded_packages ~init:0 ~f:( + )
@@ -701,13 +703,13 @@ module Solver = struct
701703
let+ () =
702704
let rec lookup_impl expand_deps role =
703705
let impls = ref [] in
704-
let* clause =
706+
let* candidates =
705707
Fiber_cache.find_or_add impl_cache role ~f:(fun () ->
706-
let+ clause, impls' =
708+
let+ candidates, impls' =
707709
Candidates.make_impl_clause sat context ~dummy_impl role
708710
in
709711
impls := impls';
710-
clause)
712+
candidates)
711713
in
712714
let+ () =
713715
Fiber.parallel_iter !impls ~f:(fun { var = impl_var; impl } ->
@@ -727,7 +729,7 @@ module Solver = struct
727729
deferred := (impl_var, dep) :: !deferred;
728730
Fiber.return ()))
729731
in
730-
clause
732+
candidates
731733
and process_dep expand_deps user_var (dep : Input.dependency) : unit Fiber.t =
732734
(* Process a dependency of [user_var]:
733735
- find the candidate implementations to satisfy it
@@ -807,8 +809,10 @@ module Solver = struct
807809
3) we follow every dependency of every selected implementation
808810
*)
809811
let sat = Sat.create () in
810-
let dummy_impl = if closest_match then Some Input.Dummy else None in
811-
let* impl_clauses = build_problem context root_req sat ~dummy_impl in
812+
let* impl_clauses =
813+
let dummy_impl = if closest_match then Some Input.Dummy else None in
814+
build_problem context root_req sat ~dummy_impl
815+
in
812816
let+ impl_clauses = Fiber_cache.to_table impl_clauses in
813817
(* Run the solve *)
814818
let decider () =
@@ -846,9 +850,7 @@ module Solver = struct
846850
Some
847851
(Table.to_list impl_clauses
848852
|> List.filter_map ~f:(fun (key, v) ->
849-
match Candidates.selected v with
850-
| None -> None
851-
| Some v -> Some (key, v))
853+
Candidates.selected v |> Option.map ~f:(fun v -> key, v))
852854
|> Input.Role.Map.of_list_exn)
853855
;;
854856
end
@@ -1634,8 +1636,8 @@ let opam_package_to_lock_file_pkg
16341636
let resolve what =
16351637
Resolve_opam_formula.filtered_formula_to_package_names
16361638
~with_test:false
1637-
(add_self_to_filter_env opam_package (Solver_env.to_env solver_env))
1638-
version_by_package_name
1639+
~packages:version_by_package_name
1640+
~env:(add_self_to_filter_env opam_package (Solver_env.to_env solver_env))
16391641
what
16401642
in
16411643
let depends =
@@ -1802,9 +1804,7 @@ let reject_unreachable_packages =
18021804
"package is both local and returned by solver"
18031805
[ "name", Package_name.to_dyn name ]
18041806
| Some (lock_dir_pkg : Lock_dir.Pkg.t), None -> Some lock_dir_pkg.info.version
1805-
| None, Some _pkg ->
1806-
let version = Package_version.of_string "dev" in
1807-
Some version)
1807+
| None, Some _pkg -> Some Package_version.dev)
18081808
in
18091809
let pkgs_by_name =
18101810
Package_name.Map.merge pkgs_by_name local_packages ~f:(fun name lhs rhs ->
@@ -1816,21 +1816,24 @@ let reject_unreachable_packages =
18161816
[ "name", Package_name.to_dyn name ]
18171817
| Some (pkg : Lock_dir.Pkg.t), None -> Some (List.map pkg.depends ~f:snd)
18181818
| None, Some (pkg : Local_package.For_solver.t) ->
1819-
let formula = Dependency_formula.to_filtered_formula pkg.dependencies in
1820-
(* Use `dev` because at this point we don't have any version *)
1821-
let opam_package =
1822-
OpamPackage.of_string (sprintf "%s.dev" (Package_name.to_string pkg.name))
1823-
in
1824-
let env = add_self_to_filter_env opam_package (Solver_env.to_env solver_env) in
1825-
let resolved =
1826-
Resolve_opam_formula.filtered_formula_to_package_names
1827-
env
1828-
~with_test:true
1829-
(Package_name.Map.set pkgs_by_version Dune_dep.name dune_version)
1830-
formula
1831-
in
18321819
let deps =
1833-
match resolved with
1820+
match
1821+
let env =
1822+
let opam_package =
1823+
OpamPackage.create
1824+
(Package_name.to_opam_package_name pkg.name)
1825+
(* Use [dev] because at this point we don't have any version *)
1826+
(Package_version.to_opam_package_version Package_version.dev)
1827+
in
1828+
Solver_env.to_env solver_env |> add_self_to_filter_env opam_package
1829+
in
1830+
Dependency_formula.to_filtered_formula pkg.dependencies
1831+
|> Resolve_opam_formula.filtered_formula_to_package_names
1832+
~env
1833+
~with_test:true
1834+
~packages:
1835+
(Package_name.Map.set pkgs_by_version Dune_dep.name dune_version)
1836+
with
18341837
| Ok { regular; post = _ (* discard post deps *) } ->
18351838
(* remove Dune from the formula as we remove it from solutions *)
18361839
List.filter regular ~f:(fun pkg ->

src/dune_pkg/package_universe.ml

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,12 @@ let version_by_package_name local_packages (lock_dir : Lock_dir.t) =
4848
let concrete_dependencies_of_local_package t local_package_name ~with_test =
4949
let local_package = Package_name.Map.find_exn t.local_packages local_package_name in
5050
match
51-
Local_package.(
52-
for_solver local_package
53-
|> (fun x -> x.dependencies)
54-
|> Dependency_formula.to_filtered_formula)
51+
(Local_package.for_solver local_package).dependencies
52+
|> Dependency_formula.to_filtered_formula
5553
|> Resolve_opam_formula.filtered_formula_to_package_names
5654
~with_test
57-
(Solver_env.to_env t.solver_env)
58-
t.version_by_package_name
55+
~env:(Solver_env.to_env t.solver_env)
56+
~packages:t.version_by_package_name
5957
with
6058
| Ok { regular; post = _ } -> regular
6159
| Error (`Formula_could_not_be_satisfied unsatisfied_formula_hints) ->

src/dune_pkg/resolve_opam_formula.ml

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
open! Import
22
module Relop = Dune_lang.Relop
33

4-
let apply_filter env ~with_test (opam_filtered_formula : OpamTypes.filtered_formula)
4+
let apply_filter env ~with_test ~(formula : OpamTypes.filtered_formula)
55
: OpamTypes.formula
66
=
77
OpamFilter.gen_filter_formula
8-
(OpamFormula.partial_eval (function
9-
| OpamTypes.Filter flt ->
10-
`Formula (Atom (OpamTypes.Filter (OpamFilter.partial_eval env flt)))
11-
| Constraint (relop, filter) ->
12-
let filter = OpamFilter.partial_eval env filter in
13-
`Formula (Atom (Constraint (relop, filter)))))
14-
opam_filtered_formula
8+
(OpamFormula.partial_eval (fun (form : _ OpamTypes.filter_or_constraint) ->
9+
match form with
10+
| Filter flt ->
11+
`Formula (Atom (OpamTypes.Filter (OpamFilter.partial_eval env flt)))
12+
| Constraint (relop, filter) ->
13+
let filter = OpamFilter.partial_eval env filter in
14+
`Formula (Atom (Constraint (relop, filter)))))
15+
formula
1516
|> OpamFilter.filter_deps
1617
~build:true
1718
~post:false
@@ -204,17 +205,17 @@ type deps =
204205
; regular : Package_name.t list
205206
}
206207

207-
let filtered_formula_to_package_names env ~with_test version_by_package_name formula =
208+
let filtered_formula_to_package_names ~env ~with_test ~packages formula =
208209
let open Result.O in
209-
let+ all =
210-
formula_to_package_names version_by_package_name (apply_filter ~with_test env formula)
211-
in
212-
let regular_set =
213-
formula_to_package_names_allow_missing
214-
version_by_package_name
215-
(apply_filter ~with_test (override_post (Some false) env) formula)
216-
|> Package_name.Set.of_list
210+
let+ all = apply_filter ~with_test env ~formula |> formula_to_package_names packages in
211+
let regular, post =
212+
let regular_set =
213+
override_post (Some false) env
214+
|> apply_filter ~with_test ~formula
215+
|> formula_to_package_names_allow_missing packages
216+
|> Package_name.Set.of_list
217+
in
218+
List.partition all ~f:(Package_name.Set.mem regular_set)
217219
in
218-
let regular, post = List.partition all ~f:(Package_name.Set.mem regular_set) in
219220
{ regular; post }
220221
;;

src/dune_pkg/resolve_opam_formula.mli

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ open! Import
44
val apply_filter
55
: OpamFilter.env
66
-> with_test:bool
7-
-> OpamTypes.filtered_formula
7+
-> formula:OpamTypes.filtered_formula
88
-> OpamTypes.formula
99

1010
module Version_constraint : sig
@@ -54,8 +54,8 @@ type deps =
5454
list of package names, split into post and regular (ie. non-post)
5555
dependencies. *)
5656
val filtered_formula_to_package_names
57-
: OpamFilter.env
57+
: env:OpamFilter.env
5858
-> with_test:bool
59-
-> Package_version.t Package_name.Map.t
59+
-> packages:Package_version.t Package_name.Map.t
6060
-> OpamTypes.filtered_formula
6161
-> (deps, unsatisfied_formula) result

0 commit comments

Comments
 (0)