Skip to content

Commit 6938c7e

Browse files
authored
Merge pull request #12550 from Sudha247/merlin_params_fix
fix(oxcaml): generate merlin config for library parameters
2 parents 28e93c9 + 7254440 commit 6938c7e

File tree

7 files changed

+64
-7
lines changed

7 files changed

+64
-7
lines changed

src/dune_rules/exe_rules.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,7 @@ let executables_rules
309309
~dialects:(Dune_project.dialects (Scope.project scope))
310310
~ident:(Merlin_ident.for_exes ~names:(Nonempty_list.map ~f:snd exes.names))
311311
~modes:`Exe
312+
~parameters:(Resolve.return [])
312313
in
313314
cctx, merlin
314315
;;

src/dune_rules/lib_rules.ml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -622,7 +622,8 @@ let library_rules
622622
Sub_system.gen_rules
623623
{ super_context = sctx; dir; stanza = lib; scope; source_modules; compile_info }
624624
and+ merlin =
625-
let+ requires_hidden = Compilation_context.requires_hidden cctx in
625+
let+ requires_hidden = Compilation_context.requires_hidden cctx
626+
and+ parameters = Compilation_context.parameters cctx in
626627
let flags = Compilation_context.flags cctx in
627628
Merlin.make
628629
~requires_compile
@@ -636,6 +637,7 @@ let library_rules
636637
~dialects:(Dune_project.dialects (Scope.project scope))
637638
~ident:(Merlin_ident.for_lib (Library.best_name lib))
638639
~modes:(`Lib (Lib_info.modes lib_info))
640+
~parameters
639641
in
640642
merlin
641643
;;

src/dune_rules/melange/melange_rules.ml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,8 @@ let setup_emit_cmj_rules
482482
~obj_dir
483483
~ident:merlin_ident
484484
~dialects:(Dune_project.dialects (Scope.project scope))
485-
~modes:`Melange_emit )
485+
~modes:`Melange_emit
486+
~parameters:(Resolve.return []) )
486487
in
487488
let* () = Buildable_rules.gen_select_rules sctx compile_info ~dir in
488489
Buildable_rules.with_lib_deps ctx merlin_ident ~dir ~f

src/dune_rules/merlin/merlin.ml

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ module Processed = struct
6161
; flags : string list
6262
; extensions : string option Ml_kind.Dict.t list
6363
; indexes : Path.t list
64+
; parameters : Module_name.t list
6465
}
6566

6667
let dyn_of_config
@@ -73,6 +74,7 @@ module Processed = struct
7374
; flags
7475
; extensions
7576
; indexes
77+
; parameters
7678
}
7779
=
7880
let open Dyn in
@@ -86,6 +88,7 @@ module Processed = struct
8688
; "flags", list string flags
8789
; "extensions", list (Ml_kind.Dict.to_dyn (Dyn.option string)) extensions
8890
; "indexes", list Path.to_dyn indexes
91+
; "parameters", list Module_name.to_dyn parameters
8992
]
9093
;;
9194

@@ -124,7 +127,7 @@ module Processed = struct
124127
type nonrec t = t
125128

126129
let name = "merlin-conf"
127-
let version = 7
130+
let version = 8
128131
let to_dyn _ = Dyn.String "Use [dune ocaml dump-dot-merlin] instead"
129132

130133
let test_example () =
@@ -138,6 +141,7 @@ module Processed = struct
138141
; flags = [ "-x" ]
139142
; extensions = [ { Ml_kind.Dict.intf = None; impl = Some "ext" } ]
140143
; indexes = []
144+
; parameters = []
141145
}
142146
; per_file_config = Path.Build.Map.empty
143147
; pp_config =
@@ -191,6 +195,7 @@ module Processed = struct
191195
; flags
192196
; extensions
193197
; indexes
198+
; parameters
194199
}
195200
=
196201
let make_directive tag value = Sexp.List [ Atom tag; value ] in
@@ -240,7 +245,20 @@ module Processed = struct
240245
in
241246
Some (make_directive "FLG" (Sexp.List open_flags))
242247
in
243-
List.filter_opt [ base_flags; pp_flags; open_flags ]
248+
let parameter_flags =
249+
match parameters with
250+
| [] -> None
251+
| params ->
252+
Some
253+
(make_directive
254+
"FLG"
255+
(Sexp.List
256+
(List.concat_map
257+
~f:(fun m ->
258+
[ Sexp.Atom "-parameter"; Sexp.Atom (Module_name.to_string m) ])
259+
params)))
260+
in
261+
List.filter_opt [ base_flags; pp_flags; open_flags; parameter_flags ]
244262
in
245263
let unit_name = [ make_directive "UNIT_NAME" (Sexp.Atom unit_name) ] in
246264
let suffixes =
@@ -297,6 +315,7 @@ module Processed = struct
297315
hidden_src_dirs
298316
extensions
299317
indexes
318+
parameters
300319
=
301320
let b = Buffer.create 256 in
302321
let printf = Printf.bprintf b in
@@ -327,6 +346,14 @@ module Processed = struct
327346
print "# FLG";
328347
List.iter flags ~f:(fun f -> printf " %s" (quote_for_dot_merlin f));
329348
print "\n");
349+
let () =
350+
match parameters with
351+
| [] -> ()
352+
| params ->
353+
print "# FLG";
354+
List.iter params ~f:(fun f -> printf " -parameter %s" (Module_name.to_string f));
355+
print "\n"
356+
in
330357
Buffer.contents b
331358
;;
332359

@@ -428,6 +455,7 @@ module Processed = struct
428455
; flags
429456
; extensions
430457
; indexes
458+
; parameters = _
431459
}
432460
}
433461
->
@@ -452,7 +480,8 @@ module Processed = struct
452480
hidden_obj_dirs
453481
hidden_src_dirs
454482
extensions
455-
indexes)
483+
indexes
484+
init.config.parameters)
456485
;;
457486
end
458487

@@ -482,6 +511,7 @@ module Unprocessed = struct
482511
; extensions : string option Ml_kind.Dict.t list
483512
; readers : string list String.Map.t
484513
; mode : Lib_mode.t
514+
; parameters : Module_name.t list Resolve.t
485515
}
486516

487517
type t =
@@ -502,6 +532,7 @@ module Unprocessed = struct
502532
~dialects
503533
~ident
504534
~modes
535+
~parameters
505536
=
506537
(* Merlin shouldn't cause the build to fail, so we just ignore errors *)
507538
let mode =
@@ -526,6 +557,7 @@ module Unprocessed = struct
526557
; objs_dirs
527558
; extensions
528559
; readers
560+
; parameters
529561
}
530562
in
531563
{ ident; config; modules }
@@ -654,6 +686,7 @@ module Unprocessed = struct
654686
; preprocess = _
655687
; libname = _
656688
; mode
689+
; parameters
657690
}
658691
} as t)
659692
sctx
@@ -713,6 +746,7 @@ module Unprocessed = struct
713746
let requires_hidden = Resolve.peek requires_hidden |> Result.value ~default:[] in
714747
add_lib_dirs sctx mode requires_hidden
715748
in
749+
let parameters = Resolve.peek parameters |> Result.value ~default:[] in
716750
let src_dirs =
717751
Path.Set.of_list_map ~f:Path.source more_src_dirs |> Path.Set.union deps_src_dirs
718752
in
@@ -727,6 +761,7 @@ module Unprocessed = struct
727761
; flags
728762
; extensions
729763
; indexes
764+
; parameters
730765
}
731766
and+ pp_config = pp_config t (Super_context.context sctx) ~expander in
732767
let per_file_config =

src/dune_rules/merlin/merlin.mli

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ val make
5252
-> dialects:Dialect.DB.t
5353
-> ident:Merlin_ident.t
5454
-> modes:[ `Lib of Lib_mode.Map.Set.t | `Exe | `Melange_emit ]
55+
-> parameters:Module_name.t list Resolve.t
56+
(** The `parameters` argument takes the list of parameters from the
57+
compilation context and stores it in the form of `["-parameter"; "P1";
58+
"-parameter"; "P2"]` where P1 and P2 are the parameters. *)
5559
-> t
5660

5761
val more_src_dirs : Dir_contents.t -> source_dirs:Path.Source.t list -> Path.Source.t list

test/blackbox-tests/test-cases/oxcaml/library-field-parameters.t

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
Set up path masking
2+
3+
$ export BUILD_PATH_PREFIX_MAP="/OCAMLC_WHERE=$(ocamlc -where)":$BUILD_PATH_PREFIX_MAP
4+
15
Testing the `parameters` field in library stanzas.
26

37
$ cat >> dune-project <<EOF
@@ -379,4 +383,14 @@ A library can have more parameters than its dependencies:
379383
> (library (name lib2) (parameters a b c) (libraries lib))
380384
> EOF
381385

386+
$ ocamlc_where="$(ocamlc -where)"
387+
$ export BUILD_PATH_PREFIX_MAP="/OCAMLC_WHERE=$ocamlc_where:$BUILD_PATH_PREFIX_MAP"
388+
$ melc_compiler="$(which melc)" &> /dev/null
389+
$ export BUILD_PATH_PREFIX_MAP="/MELC_COMPILER=$melc_compiler:$BUILD_PATH_PREFIX_MAP"
382390
$ dune build
391+
$ dune ocaml dump-dot-merlin lib2 | grep 'parameter'
392+
# FLG -parameter A -parameter B -parameter C
393+
394+
$ dune ocaml merlin dump-config lib2 | grep 'parameter'
395+
(FLG (-parameter A -parameter B -parameter C))
396+
(FLG (-parameter A -parameter B -parameter C))

test/expect-tests/persistent_tests.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,8 @@ let%expect_test "persistent digests" =
4747
65e543aaf5ccc8148d50a1305aa3622b
4848
---
4949

50-
merlin-conf version 7
51-
a14a4700929a15bb2030e36f71e66d20
50+
merlin-conf version 8
51+
699a5c5c686662da218d0be3cb2f161c
5252
---
5353

5454
INCREMENTAL-DB version 6

0 commit comments

Comments
 (0)