Skip to content

Commit 9d0748f

Browse files
authored
Merge pull request rescript-lang#981 from bloomberg/release
fix regression watch mode in MacOS, add experimental merlin support
2 parents d8be62b + 2d9f108 commit 9d0748f

12 files changed

+212
-51
lines changed

docs/docson/build-schema.json

+4
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,10 @@
218218
]
219219
}
220220
},
221+
"generate-merlin" : {
222+
"type" : "boolean",
223+
"description" : "default false"
224+
},
221225
"additionalProperties": false,
222226
"required": [
223227
"name",

jscomp/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,7 @@ install:
304304
cp ./runtime/*.cmt* ./runtime/*.cmj* ./stdlib/*.cm* ./others/*.ml ./others/*.mli ./others/*.cm* \
305305
./runtime/js.ml ./runtime/js.cmi ./runtime/js_unsafe.cmi ./runtime/js_null.ml ./runtime/js_null.cmi \
306306
./runtime/js_undefined.ml ./runtime/js_undefined.cmi $(DEST)
307+
cp ./stdlib/*.ml ./stdlib/*.mli $(DEST)
307308
# ./runtime/js_null_undefined.ml ./runtime/js_null_undefined.cmi
308309
include all.depend
309310
-include $(SNAPSHOT_DEPS)

jscomp/bin/bsb.ml

+101-23
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ let cmd = "cmd"
2929
let ninja = "ninja"
3030
let package_specs = "package-specs"
3131

32+
let generate_merlin = "generate-merlin"
3233

3334
end
3435
module Ext_pervasives : sig
@@ -6137,6 +6138,9 @@ type package_specs = String_set.t
61376138
val get_package_specs : unit -> package_specs
61386139
val set_package_specs_from_array : Bsb_json.t array -> unit
61396140

6141+
val get_generate_merlin : unit -> bool
6142+
val set_generate_merlin : bool -> unit
6143+
61406144
end = struct
61416145
#1 "bsb_default.ml"
61426146
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -6275,7 +6279,12 @@ let set_package_specs_from_array arr =
62756279
) String_set.empty in
62766280
package_specs := new_package_specs
62776281

6282+
let generate_merlin = ref false
6283+
6284+
let get_generate_merlin () = !generate_merlin
62786285

6286+
let set_generate_merlin b =
6287+
generate_merlin := b
62796288

62806289
end
62816290
module Bsb_dep_infos : sig
@@ -7242,20 +7251,92 @@ let (//) = Ext_filename.combine
72427251

72437252
let bs_file_groups = ref []
72447253

7254+
let sourcedirs_meta = ".sourcedirs"
7255+
let merlin = ".merlin"
7256+
let merlin_header = "\n####{BSB GENERATED: NO EDIT\n"
7257+
let merlin_trailer = "\n####BSB GENERATED: NO EDIT}\n"
7258+
let merlin_trailer_length = String.length merlin_trailer
7259+
let revise_merlin new_content =
7260+
if Sys.file_exists merlin then
7261+
let merlin_chan = open_in_bin merlin in
7262+
let size = in_channel_length merlin_chan in
7263+
let s = really_input_string merlin_chan size in
7264+
let () = close_in merlin_chan in
7265+
7266+
let header = Ext_string.find s ~sub:merlin_header in
7267+
let tail = Ext_string.find s ~sub:merlin_trailer in
7268+
if header < 0 && tail < 0 then
7269+
let ochan = open_out_bin merlin in
7270+
output_string ochan s ;
7271+
output_string ochan merlin_header;
7272+
Buffer.output_buffer ochan new_content;
7273+
output_string ochan merlin_trailer ;
7274+
close_out ochan
7275+
else if header >=0 && tail >= 0 then
7276+
let ochan = open_out_bin merlin in
7277+
output_string ochan (String.sub s 0 header) ;
7278+
output_string ochan merlin_header;
7279+
Buffer.output_buffer ochan new_content;
7280+
output_string ochan merlin_trailer ;
7281+
output_string ochan (Ext_string.tail_from s (tail + merlin_trailer_length));
7282+
close_out ochan
7283+
else assert false
7284+
else
7285+
let ochan = open_out_bin merlin in
7286+
output_string ochan merlin_header ;
7287+
Buffer.output_buffer ochan new_content;
7288+
output_string ochan merlin_trailer ;
7289+
close_out ochan
7290+
(*TODO: it is a little mess that [cwd] and [project dir] are shared*)
72457291
(** *)
72467292
let write_ninja_file cwd =
72477293
let builddir = Bsb_config.lib_bs in
72487294
let () = Bsb_build_util.mkp builddir in
7249-
let bsc, bsdep = Bsb_build_util.get_bsc_bsdep cwd in
7295+
let bsc_dir = Bsb_build_util.get_bsc_dir cwd in
7296+
let bsc, bsdep, bsppx =
7297+
bsc_dir // "bsc.exe",
7298+
bsc_dir // "bsb_helper.exe",
7299+
bsc_dir // "bsppx.exe" in
72507300

7251-
let config_json_chan = open_in_bin Literals.bsconfig_json in
7252-
let global_data = Bsb_json.parse_json_from_chan config_json_chan in
72537301
let update_queue = ref [] in
72547302
let globbed_dirs = ref [] in
7303+
let handle_bsb_build_ui (res : Bsb_build_ui.t) =
7304+
let ochan = open_out_bin (builddir // sourcedirs_meta) in
7305+
let lib_ocaml_dir = (bsc_dir // ".."//"lib"//"ocaml") in
7306+
let buffer = Buffer.create 100 in
7307+
let () = Buffer.add_string buffer
7308+
(Printf.sprintf "S %s\n\
7309+
B %s\n\
7310+
PPX %s\n
7311+
" lib_ocaml_dir lib_ocaml_dir bsppx
7312+
) in
7313+
res.files |> List.iter
7314+
(fun (x : Bsb_build_ui.file_group) ->
7315+
output_string ochan x.dir;
7316+
output_string ochan "\n" ;
7317+
Buffer.add_string buffer "\nS ";
7318+
Buffer.add_string buffer x.dir ;
7319+
Buffer.add_string buffer "\nB ";
7320+
Buffer.add_string buffer ("lib"//"bs"//x.dir) ;
7321+
Buffer.add_string buffer "\n"
7322+
) ;
7323+
close_out ochan;
7324+
bs_file_groups := res.files ;
7325+
update_queue := res.intervals;
7326+
globbed_dirs := res.globbed_dirs;
7327+
if Bsb_default.get_generate_merlin () then
7328+
revise_merlin buffer ;
7329+
in
7330+
let config_json_chan = open_in_bin Literals.bsconfig_json in
7331+
let global_data = Bsb_json.parse_json_from_chan config_json_chan in
7332+
72557333
let () =
72567334
match global_data with
72577335
| `Obj map ->
72587336
map
7337+
|? (Bsb_build_schemas.generate_merlin, `Bool (fun b ->
7338+
Bsb_default.set_generate_merlin b
7339+
))
72597340
|? (Bsb_build_schemas.name, `Str Bsb_default.set_package_name)
72607341
|? (Bsb_build_schemas.package_specs, `Arr Bsb_default.set_package_specs_from_array )
72617342
|? (Bsb_build_schemas.js_post_build, `Obj begin fun m ->
@@ -7271,31 +7352,20 @@ let write_ninja_file cwd =
72717352
|? (Bsb_build_schemas.bsc_flags, `Arr Bsb_default.set_bsc_flags)
72727353
|? (Bsb_build_schemas.ppx_flags, `Arr (Bsb_default.set_ppx_flags ~cwd))
72737354
|? (Bsb_build_schemas.refmt, `Str (Bsb_default.set_refmt ~cwd))
7355+
72747356
|? (Bsb_build_schemas.sources, `Obj (fun x ->
7275-
let res = Bsb_build_ui.parsing_source Filename.current_dir_name x in
7276-
let ochan = open_out_bin (builddir // ".sourcedirs") in
7277-
res.files |> List.iter
7278-
(fun (x : Bsb_build_ui.file_group) ->
7279-
output_string ochan x.dir; output_string ochan "\n" ) ;
7280-
close_out ochan;
7281-
bs_file_groups := res.files ;
7282-
update_queue := res.intervals;
7283-
globbed_dirs := res.globbed_dirs
7357+
let res : Bsb_build_ui.t = Bsb_build_ui.parsing_source
7358+
Filename.current_dir_name x in
7359+
handle_bsb_build_ui res
72847360
))
72857361
|? (Bsb_build_schemas.sources, `Arr (fun xs ->
72867362

7287-
let res = Bsb_build_ui.parsing_sources Filename.current_dir_name xs in
7288-
let ochan = open_out_bin (builddir // ".sourcedirs") in
7289-
res.files |> List.iter
7290-
(fun (x : Bsb_build_ui.file_group) ->
7291-
output_string ochan x.dir; output_string ochan "\n" ) ;
7292-
close_out ochan;
7293-
bs_file_groups := res.files ;
7294-
update_queue := res.intervals;
7295-
globbed_dirs := res.globbed_dirs
7363+
let res : Bsb_build_ui.t =
7364+
Bsb_build_ui.parsing_sources Filename.current_dir_name xs
7365+
in
7366+
handle_bsb_build_ui res
72967367
))
72977368

7298-
72997369
|> ignore
73007370
| _ -> ()
73017371
in
@@ -7346,8 +7416,16 @@ let cwd = Sys.getcwd ()
73467416
let create_bs_config () =
73477417
()
73487418
let watch () =
7419+
let bsb_watcher =
7420+
Bsb_build_util.get_bsc_dir cwd // "bsb_watcher.js" in
7421+
let bsb_watcher =
7422+
(*FIXME *)
7423+
if Sys.win32 then Filename.quote bsb_watcher
7424+
else bsb_watcher in
73497425
Unix.execvp "node"
7350-
[| "node" ; Filename.quote (Bsb_build_util.get_bsc_dir cwd // "bsb_watcher.js" )|]
7426+
[| "node" ;
7427+
bsb_watcher
7428+
|]
73517429

73527430

73537431
let annoymous filename =

jscomp/bin/bsdep.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ val version : string
55

66
end = struct
77
#1 "bs_version.ml"
8-
let version = "1.3.2"
8+
let version = "1.3.3"
99

1010
end
1111
module Terminfo : sig

jscomp/bin/bsppx.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -7583,7 +7583,7 @@ val version : string
75837583

75847584
end = struct
75857585
#1 "bs_version.ml"
7586-
let version = "1.3.2"
7586+
let version = "1.3.3"
75877587

75887588
end
75897589
module Ext_pervasives : sig

jscomp/bin/whole_compiler.ml

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ val version : string
55

66
end = struct
77
#1 "bs_version.ml"
8-
let version = "1.3.2"
8+
let version = "1.3.3"
99

1010
end
1111
module Terminfo : sig

jscomp/bsb/bsb_build_schemas.ml

+1
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,4 @@ let cmd = "cmd"
2626
let ninja = "ninja"
2727
let package_specs = "package-specs"
2828

29+
let generate_merlin = "generate-merlin"

jscomp/bsb/bsb_default.ml

+5
Original file line numberDiff line numberDiff line change
@@ -134,4 +134,9 @@ let set_package_specs_from_array arr =
134134
) String_set.empty in
135135
package_specs := new_package_specs
136136

137+
let generate_merlin = ref false
137138

139+
let get_generate_merlin () = !generate_merlin
140+
141+
let set_generate_merlin b =
142+
generate_merlin := b

jscomp/bsb/bsb_default.mli

+3
Original file line numberDiff line numberDiff line change
@@ -60,3 +60,6 @@ val set_ninja : cwd:string -> string -> unit
6060
type package_specs = String_set.t
6161
val get_package_specs : unit -> package_specs
6262
val set_package_specs_from_array : Bsb_json.t array -> unit
63+
64+
val get_generate_merlin : unit -> bool
65+
val set_generate_merlin : bool -> unit

0 commit comments

Comments
 (0)