Skip to content

Commit

Permalink
[enhance] plugins: Use JsPackage to generate plugins (+ auto_dependen…
Browse files Browse the repository at this point in the history
…cies)
  • Loading branch information
BourgerieQuentin committed Oct 17, 2012
1 parent 36d8083 commit 043c536
Show file tree
Hide file tree
Showing 10 changed files with 171 additions and 210 deletions.
3 changes: 2 additions & 1 deletion compiler/libbsl/_tags
Expand Up @@ -14,7 +14,7 @@
<bslRegisterLib.ml>: use_pplib
<bslInitChecker.ml>:use_opalang
<bslTypesGeneration.ml>: use_ocamllang
<bslPluginInterface.ml>: use_ocamllang
<bslPluginInterface.ml>: use_ocamllang, use_jslang
<bslInterface.ml>: use_jslang
<bslOcaml.ml>: use_ocamllang
<bslRegisterParser.{ml,mli,byte,native}>: use_libtrx
Expand All @@ -23,6 +23,7 @@
<bslregister.{byte,native}>: use_ulex, use_libbsl, use_dynlink, use_zip, use_nums
<portingBsl.{ml,byte,native}>: use_ulex, use_libbsl, use_dynlink, use_zip, use_nums
<bslGeneration.{ml,mli}>: use_ulex, use_dynlink, use_zip, use_nums, use_jslang
<bslMarshalPlugin.*>: use_jslang

# subdirs
<validator>: traverse
Expand Down
18 changes: 1 addition & 17 deletions compiler/libbsl/bslGeneration.ml
Expand Up @@ -487,32 +487,16 @@ let make_iterator rename =
in
{ BR.output = output }

let output_package_json opt fs =
let main = Filename.basename fs.nodejspackage in
let package_desc = JsUtils.basic_package_json
~version:opt.package_version fs.opp_dir main in
match
File.pp_output fs.package_json
Format.pp_print_string package_desc
with
| None -> ()
| Some error ->
OManager.error "Couldn't write package.json: %s\n" error

(* after finalization of register session, actually produce files *)
let files_generation (opt : options) (fs : files) (fin : BR.finalized_t) =
let iterator_js_code = make_iterator (js_code opt) in
let iterator_opa_code = make_iterator (opa_code opt) in
let iterator_opa_interface = make_iterator (opa_interface opt) in

BR.out_js_code iterator_js_code fin;
BR.out_nodejs_code iterator_js_code fin;
BR.out_opa_code iterator_opa_code fin;
BR.out_opa_interface iterator_opa_interface fin;

if not (List.is_empty fs.nodejs_files) then (
output fs.nodejspackage BR.out_nodejs_package fin;
output_package_json opt fs;
BR.write_nodejs_pack fs.nodejspackage fin;
);

output fs.jskeys BR.out_js_keys fin;
Expand Down
100 changes: 51 additions & 49 deletions compiler/libbsl/bslJs.ml
Expand Up @@ -33,6 +33,7 @@ module String = BaseString
let (|>) = InfixOperator.(|>)

module BPI = BslPluginInterface
module BI = BslInterface
module D = BslDirectives
module DJ = D.Js
module J = JsAst
Expand Down Expand Up @@ -70,7 +71,7 @@ type env = {
last_endmodule : FilePos.pos ;

(* accumulating files in a fold *)
rev_files_js_code : (filename * contents) list ;
package : JsPackage.t;

rev_path : (skey * module_name * pos) list ;

Expand Down Expand Up @@ -181,12 +182,12 @@ end

let nopos = FilePos.nopos "BslJs"

let empty =
let empty ~name =
let empty = {
last_module = nopos ;
last_endmodule = nopos ;

rev_files_js_code = [] ;
package = JsPackage.default ~name ;

rev_path = [] ;
ty_spec_map = BslKeyMap.empty ;
Expand Down Expand Up @@ -347,7 +348,7 @@ let split_regexp = Str.regexp "%%[ ]*[a-zA-Z\\._]+[ ]*%%";;


let fold_source_elt_classic ~dynloader_interface ~filename ~lang
(env, js_file) source_elt =
(env, package) source_elt =

let env, js_file =
match source_elt with
Expand Down Expand Up @@ -375,8 +376,8 @@ let fold_source_elt_classic ~dynloader_interface ~filename ~lang
OManager.error "cannot replace @{<bright>%s@} by the javascript implementation@\nKey not found, position : %a@\n@." d FilePos.pp_citation pos
)
splitted) in
let js_file = FBuffer.addln js_file source in
env, js_file
let package = JsPackage.add_verbatim package source in
env, package

| D.Directive (pos, tags, directive) -> (
match directive with
Expand Down Expand Up @@ -436,7 +437,7 @@ let fold_source_elt_classic ~dynloader_interface ~filename ~lang
env with
ty_spec_map ;
} in
env, js_file
env, package

| D.ExternalTypeDef (skey, params, implementation) ->
let () =
Expand Down Expand Up @@ -489,13 +490,13 @@ let fold_source_elt_classic ~dynloader_interface ~filename ~lang
env with
ty_spec_map = ty_spec_map ;
} in
env, js_file
env, package

| D.Module (skey, implementation) ->
env_add_module pos skey implementation env, js_file
env_add_module pos skey implementation env, package

| D.EndModule ->
env_add_endmodule pos env, js_file
env_add_endmodule pos env, package

| D.Register (skey, source_implementation, injected, bslty) ->
let rp_ks = env_rp_ks env skey in
Expand All @@ -522,51 +523,53 @@ let fold_source_elt_classic ~dynloader_interface ~filename ~lang
| None -> ""
| Some source -> " \\ "^source^" "
in
let js_file = FBuffer.printf js_file "/* %s%s : @[%a@] */\n" (String.concat "." rp_ks) source_option BslTypes.pp bslty in

let js_file = FBuffer.printf js_file "/* resolution: %%%%%s%%%% --> %s */\n" key implementation in
let package = JsPackage.add_verbatim package
(Format.sprintf "/* %s%s : @[%a@] */\n"
(String.concat "." rp_ks) source_option BslTypes.pp bslty)
in
let package = JsPackage.add_verbatim package
(Format.sprintf "/* resolution: %%%%%s%%%% --> %s */\n" key implementation)
in
let () = SeparatedEnv.SideEffect.add_renaming key implementation in
let env = {env with renaming = StringMap.add key implementation env.renaming } in
BslPluginInterface.apply_register_primitive dynloader_interface.BslPluginInterface.register_primitive rp ;
env, js_file
env, package

| D.Args (name, args, _bslty) ->
(* BslTypes.pp bslty *)
let print_args li = String.concat ", " li in
let argsname = List.map fst args in
let funname = env_rp_implementation env name in
let js_file = FBuffer.printf js_file "function %s (%s)\n" funname (print_args argsname) in
env, js_file
let package = JsPackage.add_verbatim package
(Format.sprintf "function %s (%s)\n" funname (print_args argsname))
in
env, package

| D.Property _ ->
(* keep coherence for line count in the js *)
let js_file = FBuffer.add js_file "\n" in
env, js_file
let package = JsPackage.add_verbatim package "\n" in
env, package
)
in
env, js_file

let add_file_line ~filename js_file =
FBuffer.printf js_file "// file %S, line 1@\n" filename
let file_line ~filename =
Format.sprintf "// file %S, line 1@\n" filename

let fold_decorated_file_classic ~dynloader_interface ~lang env decorated_file =
let filename = decorated_file.D.filename in
let source = decorated_file.D.decorated_source in
let implementation = js_module_of_filename filename in
(* we add a module for each file *)
let env = env_add_module nopos implementation None env in
(* For each file, we create a FBuffer, updated in a fold on decorated lines *)
let js_file = fbuffer () in
let js_file = add_file_line ~filename js_file in

let env, js_file =
List.fold_left (fold_source_elt_classic ~dynloader_interface ~filename ~lang) (env, js_file) source
let package = env.package in
let package = JsPackage.add_verbatim package (file_line ~filename) in
let env, package =
List.fold_left
(fold_source_elt_classic ~dynloader_interface ~filename ~lang)
(env, package) source
in
let js_code = FBuffer.contents js_file in
let file_js_code = filename, js_code in
let rev_files_js_code = env.rev_files_js_code in
let rev_files_js_code = file_js_code :: rev_files_js_code in
let env = { env with rev_files_js_code = rev_files_js_code } in
let env = { env with package } in
let env = env_add_endmodule nopos env in
let _ =
match env.rev_path with
Expand Down Expand Up @@ -801,18 +804,13 @@ let process_directives_doc_like
(** Use the renaming map built in the previous stage to rename
bypasses in all files, and serialize the resulting ASTs, updating
the environment *)
let build_file_doc_like renaming env decorated_file =
let build_file_doc_like ~transform renaming env decorated_file =
(* For each file, we create a FBuffer, updated in a fold on decorated lines *)
let filename = decorated_file.filename in
let js_file = fbuffer () in
let js_file = add_file_line ~filename js_file in
let contents = rename renaming decorated_file.contents in
let js_file = FBuffer.printf js_file "%a"
JsPrint.pp_keep_comments#code contents in
let js_code = FBuffer.contents js_file in
let file_js_code = filename, js_code in
let rev_files_js_code = file_js_code :: env.rev_files_js_code in
let env = { env with rev_files_js_code } in
let package = JsPackage.add_verbatim env.package (file_line ~filename) in
let package = JsPackage.add_code package (transform filename contents) in
let env = { env with package } in
env

let process_file ~dynloader_interface ~lang (env, renaming) decorated_file =
Expand All @@ -824,16 +822,23 @@ let process_file ~dynloader_interface ~lang (env, renaming) decorated_file =
process_directives_doc_like ~dynloader_interface
~lang (env, renaming) decorated_file

let build_file renaming env file =
let build_file ~transform renaming env file =
match file with
| Classic _ ->
(* In classic syntax, renaming is already done *)
env
| DocLike decorated_file ->
build_file_doc_like renaming env decorated_file
build_file_doc_like ~transform renaming env decorated_file

let preprocess ~options ~plugins ~dynloader_interface ~depends ~lang decorated_files =
let env = empty in
let preprocess ~options ~plugins ~dynloader_interface ~depends ~lang ~js_confs decorated_files =
ignore depends; ignore js_confs;
let transform _filename code =
if BslLanguage.is_nodejs lang then JsUtils.export_to_global_namespace code
else code
in
let env = empty ~name:(Printf.sprintf "%s.%s"
(Option.get options.BI.basename)
BslConvention.Extension.plugin) in
let sep_env = SeparatedEnv.init ~ty_spec_map:env.ty_spec_map ~renaming:env.renaming in
let sep_env = List.fold_left SeparatedEnv.fold sep_env plugins in
let ty_spec_map = SeparatedEnv.ty_spec_map sep_env in
Expand All @@ -847,10 +852,7 @@ let preprocess ~options ~plugins ~dynloader_interface ~depends ~lang decorated_f
let env, renaming =
List.fold_left (process_file ~dynloader_interface ~lang)
(env, StringMap.empty) decorated_files in
let env = List.fold_left (build_file renaming) env decorated_files in
let files_js_code = List.rev env.rev_files_js_code in

check ~options ~depends files_js_code ;
let env = List.fold_left (build_file ~transform renaming) env decorated_files in

let javascript_env = SeparatedEnv.SideEffect.get_javascript_env () in
javascript_env, files_js_code
javascript_env, env.package
3 changes: 2 additions & 1 deletion compiler/libbsl/bslJs.mli
Expand Up @@ -79,5 +79,6 @@ val preprocess :
dynloader_interface:BslPluginInterface.dynloader_interface ->
depends:(filename * contents) list ->
lang:BslLanguage.t ->
js_confs:BslJsConf.t ->
decorated_file list ->
BslPluginInterface.javascript_env * (filename * contents) list
BslPluginInterface.javascript_env * JsPackage.t
25 changes: 13 additions & 12 deletions compiler/libbsl/bslMarshalPlugin.ml
Expand Up @@ -15,6 +15,7 @@
You should have received a copy of the GNU Affero General Public License
along with Opa. If not, see <http://www.gnu.org/licenses/>.
*)
module Format = BaseFormat
(* CF mli *)

module BPI = BslPluginInterface
Expand All @@ -41,8 +42,8 @@ type t = {
depends : BPI.plugin_basename list ;

opa_code : ( filename * contents ) list ;
js_code : ( filename * contents * BslJsConf.conf ) list ;
nodejs_code : ( filename * contents * BslJsConf.conf ) list ;
js_pack : JsPackage.t ;
nodejs_pack : JsPackage.t ;

has_server_code : bool ;

Expand All @@ -62,8 +63,8 @@ type session = {
mutable s_depends : BPI.plugin_basename list ;

mutable s_opa_code : ( filename * contents ) list ;
mutable s_js_code : ( filename * contents * BslJsConf.conf ) list ;
mutable s_nodejs_code : ( filename * contents * BslJsConf.conf ) list ;
mutable s_js_pack : JsPackage.t ;
mutable s_nodejs_pack : JsPackage.t ;

mutable s_has_server_code : bool ;

Expand All @@ -85,8 +86,8 @@ let create () = {
s_depends = [] ;

s_opa_code = [] ;
s_js_code = [] ;
s_nodejs_code = [] ;
s_js_pack = JsPackage.default ~name:"BMP" ;
s_nodejs_pack = JsPackage.default ~name:"BMP" ;

s_has_server_code = false ;

Expand All @@ -109,8 +110,8 @@ let finalize s = {
depends = s.s_depends ;

opa_code = s.s_opa_code ;
js_code = s.s_js_code ;
nodejs_code = s.s_nodejs_code ;
js_pack = s.s_js_pack ;
nodejs_pack = s.s_nodejs_pack ;

has_server_code = s.s_has_server_code ;

Expand Down Expand Up @@ -147,8 +148,8 @@ let register_ml_runtime s n = s.s_ml_runtime <- n
let register_depends s d = s.s_depends <- d

let register_opa_code s c = s.s_opa_code <- c
let register_js_code s c = s.s_js_code <- c
let register_nodejs_code s c = s.s_nodejs_code <- c
let register_js_pack s c = s.s_js_pack <- c
let register_nodejs_pack s c = s.s_nodejs_pack <- c

let register_has_server_code s c = s.s_has_server_code <- c

Expand Down Expand Up @@ -250,8 +251,8 @@ let plugin t path =
depends = t.depends ;

opa_code = t.opa_code ;
js_code = t.js_code ;
nodejs_code = t.nodejs_code ;
js_pack = t.js_pack ;
nodejs_pack = t.nodejs_pack ;

has_server_code = t.has_server_code ;

Expand Down
4 changes: 2 additions & 2 deletions compiler/libbsl/bslMarshalPlugin.mli
Expand Up @@ -146,8 +146,8 @@ val register_ml_runtime : session -> module_name -> unit
val register_depends : session -> module_name list -> unit

val register_opa_code : session -> (filename * contents) list -> unit
val register_js_code : session -> (filename * contents * BslJsConf.conf) list -> unit
val register_nodejs_code : session -> (filename * contents * BslJsConf.conf) list -> unit
val register_js_pack : session -> JsPackage.t -> unit
val register_nodejs_pack : session -> JsPackage.t -> unit

val register_has_server_code : session -> bool -> unit

Expand Down

0 comments on commit 043c536

Please sign in to comment.