@@ -264,19 +264,34 @@ module Error = struct
264264 ]
265265 ;;
266266
267- let missing_parameter ~loc p =
267+ let missing_parameter_inline_tests ~loc p =
268268 let name = Lib_name. to_string (Lib_info. name p) in
269269 make_resolve
270270 ~loc
271- [ Pp. textf " Parameter %S is missing." name ]
271+ [ Pp. textf " To run the inline tests, please provide the missing parameter %S." name
272+ ]
272273 ~hints:
273274 [ Pp. textf
274- " Pass an argument implementing %s to the dependency, or add (parameters %s) "
275- name
275+ " Add (arguments ...) to the inline_tests to specify which implementation of \
276+ the parameter %S to use. "
276277 name
277278 ]
278279 ;;
279280
281+ let missing_parameter_depends ~loc p =
282+ let name = Lib_name. to_string (Lib_info. name p) in
283+ make_resolve
284+ ~loc
285+ [ Pp. textf " Missing argument for parameter %S." name ]
286+ ~hints: [ Pp. textf " Pass an argument implementing %S to the dependency." name ]
287+ ;;
288+
289+ let missing_parameter ~from ~loc ~loc_param p =
290+ match from with
291+ | `depends -> missing_parameter_depends ~loc p
292+ | `inline_tests -> missing_parameter_inline_tests ~loc: loc_param p
293+ ;;
294+
280295 let missing_implements ~loc p =
281296 let name = Lib_name. to_string (Lib_info. name p) in
282297 make_resolve
@@ -375,7 +390,7 @@ module T = struct
375390 ; pps : t list Resolve .t
376391 ; resolved_selects : Resolved_select .t list Resolve .t
377392 ; allow_unused_libraries : t list Resolve .t
378- ; parameters : t list Resolve .t
393+ ; parameters : ( Loc .t * t ) list Resolve .t
379394 ; arguments : t option list
380395 ; implements : t Resolve .t option
381396 ; project : Dune_project .t option
@@ -477,7 +492,7 @@ let name t = t.name
477492let info t = t.info
478493let project t = t.project
479494let implements t = Option. map ~f: Memo. return t.implements
480- let parameters t = Resolve.Memo. lift t.parameters
495+ let parameters t = Resolve.Memo. lift ( Resolve. map ~f: ( List. map ~f: snd) t.parameters)
481496let requires t = Memo. return t.requires
482497let re_exports t = Memo. return t.re_exports
483498let ppx_runtime_deps t = Memo. return t.ppx_runtime_deps
@@ -558,7 +573,7 @@ module Parameterised = struct
558573 let parameterised_arguments t =
559574 let open Resolve.O in
560575 let + parameters = t.parameters in
561- List. combine parameters t.arguments
576+ List. map2 ~f: ( fun ( loc , param ) arg -> loc, param, arg) parameters t.arguments
562577 ;;
563578
564579 let apply_arguments t new_arguments =
@@ -574,27 +589,26 @@ module Parameterised = struct
574589 | [] , _ ->
575590 (* Ignore remaining arguments *)
576591 Resolve. return (List. rev acc)
577- | keep , [] ->
578- (* Keep the remaining existing parameters *)
579- Resolve. return ( List. rev_append acc keep)
580- | (param_intf , Some arg ) :: existing , _ ->
592+ | ( _ , _ , None) :: existing , [] ->
593+ (* Keep required parameter which are still unspecifed *)
594+ go ( None :: acc) existing []
595+ | (_ , _ , Some arg ) :: existing , _ ->
581596 (* Keep already applied parameter *)
582- go ((param_intf, Some arg) :: acc) existing given'
583- | (( param_intf , None) as keep ) :: existing , (param_intf' , arg ) :: given ->
597+ go (Some arg :: acc) existing given'
598+ | (_ , param_intf , None) :: existing , (param_intf' , arg ) :: given ->
584599 (match compare param_intf param_intf' with
585600 | Eq ->
586601 (* Apply the argument to the unset parameter *)
587- go ((param_intf, Some arg) :: acc) existing given
602+ go (Some arg :: acc) existing given
588603 | Lt ->
589604 (* Keep the existing parameter as being unknown *)
590- go (keep :: acc) existing given'
605+ go (None :: acc) existing given'
591606 | Gt ->
592607 (* Skip unwanted argument *)
593608 go acc existing' given)
594609 in
595610 let * t_arguments = parameterised_arguments t in
596611 let + arguments = go [] t_arguments new_arguments in
597- let arguments = List. map ~f: snd arguments in
598612 { t with arguments }
599613 ;;
600614
@@ -615,15 +629,19 @@ module Parameterised = struct
615629 List. sort arguments ~compare: (fun (param , _ ) (param' , _ ) -> compare param param')
616630 ;;
617631
618- let instantiate ~loc lib args ~parent_parameters =
632+ let instantiate ~loc ~ from lib args ~parent_parameters =
619633 let open Resolve.O in
620634 let * args = make_arguments args in
621635 let * lib = apply_arguments lib args in
622636 let + () =
623637 let * all_args = parameterised_arguments lib in
638+ let is_inherited param =
639+ List. exists parent_parameters ~f: (fun (_ , parent_param ) ->
640+ equal param parent_param)
641+ in
624642 Resolve.List. iter all_args ~f: (function
625- | param , None when not (List. exists parent_parameters ~f: (equal param) ) ->
626- Error. missing_parameter ~loc param.info
643+ | loc_param , param , None when not (is_inherited param) ->
644+ Error. missing_parameter ~from ~ loc ~loc_param param.info
627645 | _ -> Resolve. return () )
628646 in
629647 lib
@@ -636,7 +654,7 @@ module Parameterised = struct
636654 let open Resolve.O in
637655 let * parent_arguments = parameterised_arguments parent in
638656 let parent_arguments =
639- List. filter_map parent_arguments ~f: (fun (param , opt_arg ) ->
657+ List. filter_map parent_arguments ~f: (fun (_loc , param , opt_arg ) ->
640658 Option. map opt_arg ~f: (fun arg -> param, arg))
641659 in
642660 let * arguments =
@@ -1142,14 +1160,14 @@ module rec Resolve_names : sig
11421160 : db
11431161 -> Lib_dep. t list
11441162 -> private_deps:private_deps
1145- -> parameters:lib list
1163+ -> parameters:( Loc. t * lib) list
11461164 -> Resolved. deps Memo. t
11471165
11481166 val resolve_deps_and_add_runtime_deps
11491167 : db
11501168 -> Lib_dep. t list
11511169 -> private_deps:private_deps
1152- -> parameters:t list
1170+ -> parameters:( Loc. t * t) list
11531171 -> pps:(Loc. t * Lib_name. t) list
11541172 -> dune_version:Dune_lang.Syntax.Version. t option
11551173 -> Resolved. t Memo. t
@@ -1210,7 +1228,7 @@ end = struct
12101228 | _ :: ps -> check_duplicates ps
12111229 in
12121230 let + () = check_duplicates parameters in
1213- List. map parameters ~f: (fun (_ , _ , param ) -> param)
1231+ List. map parameters ~f: (fun (loc , _ , param ) -> loc, param)
12141232 ;;
12151233
12161234 let instantiate_impl db (name , info , hidden ) =
@@ -1298,6 +1316,7 @@ end = struct
12981316 " expected Virtual or Parameter"
12991317 [ " implements" , to_dyn impl ])
13001318 in
1319+ let requires_params = List. map ~f: snd requires_params in
13011320 let requires = List. concat [ requires_implements; requires_params; requires ] in
13021321 let (_ : Set.t ), requires =
13031322 List. fold_left requires ~init: (Set. empty, [] ) ~f: (fun (seen , lst ) lib ->
@@ -1747,7 +1766,12 @@ end = struct
17471766 >> | Option. map ~f: (fun dep ->
17481767 let open Resolve.O in
17491768 let * dep = dep in
1750- Parameterised. instantiate ~loc dep arguments ~parent_parameters: parameters)
1769+ Parameterised. instantiate
1770+ ~loc
1771+ ~from: `depends
1772+ dep
1773+ arguments
1774+ ~parent_parameters: parameters)
17511775 in
17521776 Memo.List. fold_left ~init: Resolved.Builder. empty deps ~f: (fun acc (dep : Lib_dep.t ) ->
17531777 match dep with
@@ -1853,6 +1877,7 @@ end = struct
18531877 let open Resolve.Memo.O in
18541878 let * resolved = Memo. return resolved in
18551879 let * runtime_deps = runtime_deps in
1880+ let parameters = List. map ~f: snd parameters in
18561881 re_exports_closure (List. concat [ resolved; runtime_deps; parameters ])
18571882 and + pps = pps in
18581883 { Resolved. requires; pps; selects; re_exports }
@@ -2594,9 +2619,7 @@ let to_dune_lib
25942619 ~lib_field: (Option. map ~f: Memo. return lib.implements)
25952620 and + parameters =
25962621 let + lib_parameters = Resolve.Memo. lift lib.parameters in
2597- List. map
2598- (List. combine (Lib_info. parameters info) lib_parameters)
2599- ~f: (fun ((loc , _ ), param ) -> loc, mangled_name param)
2622+ List. map lib_parameters ~f: (fun (loc , param ) -> loc, mangled_name param)
26002623 and + default_implementation =
26012624 use_public_name
26022625 ~info_field: (Lib_info. default_implementation info)
0 commit comments