@@ -29,6 +29,7 @@ let cmd = "cmd"
29
29
let ninja = " ninja"
30
30
let package_specs = " package-specs"
31
31
32
+ let generate_merlin = " generate-merlin"
32
33
33
34
end
34
35
module Ext_pervasives : sig
@@ -6137,6 +6138,9 @@ type package_specs = String_set.t
6137
6138
val get_package_specs : unit -> package_specs
6138
6139
val set_package_specs_from_array : Bsb_json .t array -> unit
6139
6140
6141
+ val get_generate_merlin : unit -> bool
6142
+ val set_generate_merlin : bool -> unit
6143
+
6140
6144
end = struct
6141
6145
#1 " bsb_default.ml"
6142
6146
(* Copyright (C) 2015-2016 Bloomberg Finance L.P.
@@ -6275,7 +6279,12 @@ let set_package_specs_from_array arr =
6275
6279
) String_set. empty in
6276
6280
package_specs := new_package_specs
6277
6281
6282
+ let generate_merlin = ref false
6283
+
6284
+ let get_generate_merlin () = ! generate_merlin
6278
6285
6286
+ let set_generate_merlin b =
6287
+ generate_merlin := b
6279
6288
6280
6289
end
6281
6290
module Bsb_dep_infos : sig
@@ -7242,20 +7251,92 @@ let (//) = Ext_filename.combine
7242
7251
7243
7252
let bs_file_groups = ref []
7244
7253
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*)
7245
7291
(* * *)
7246
7292
let write_ninja_file cwd =
7247
7293
let builddir = Bsb_config. lib_bs in
7248
7294
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
7250
7300
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
7253
7301
let update_queue = ref [] in
7254
7302
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 " \n S " ;
7318
+ Buffer. add_string buffer x.dir ;
7319
+ Buffer. add_string buffer " \n B " ;
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
+
7255
7333
let () =
7256
7334
match global_data with
7257
7335
| `Obj map ->
7258
7336
map
7337
+ |? (Bsb_build_schemas. generate_merlin, `Bool (fun b ->
7338
+ Bsb_default. set_generate_merlin b
7339
+ ))
7259
7340
|? (Bsb_build_schemas. name, `Str Bsb_default. set_package_name)
7260
7341
|? (Bsb_build_schemas. package_specs, `Arr Bsb_default. set_package_specs_from_array )
7261
7342
|? (Bsb_build_schemas. js_post_build, `Obj begin fun m ->
@@ -7271,31 +7352,20 @@ let write_ninja_file cwd =
7271
7352
|? (Bsb_build_schemas. bsc_flags, `Arr Bsb_default. set_bsc_flags)
7272
7353
|? (Bsb_build_schemas. ppx_flags, `Arr (Bsb_default. set_ppx_flags ~cwd ))
7273
7354
|? (Bsb_build_schemas. refmt, `Str (Bsb_default. set_refmt ~cwd ))
7355
+
7274
7356
|? (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
7284
7360
))
7285
7361
|? (Bsb_build_schemas. sources, `Arr (fun xs ->
7286
7362
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
7296
7367
))
7297
7368
7298
-
7299
7369
|> ignore
7300
7370
| _ -> ()
7301
7371
in
@@ -7346,8 +7416,16 @@ let cwd = Sys.getcwd ()
7346
7416
let create_bs_config () =
7347
7417
()
7348
7418
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
7349
7425
Unix. execvp " node"
7350
- [| " node" ; Filename. quote (Bsb_build_util. get_bsc_dir cwd // " bsb_watcher.js" )|]
7426
+ [| " node" ;
7427
+ bsb_watcher
7428
+ |]
7351
7429
7352
7430
7353
7431
let annoymous filename =
0 commit comments