From 9e121a96a75d808dc21c8a15af1b70e9fcd85beb Mon Sep 17 00:00:00 2001 From: Rok Cesnovar Date: Wed, 9 Dec 2020 20:42:57 +0100 Subject: [PATCH 1/2] store stdout and stderr internally --- src/stancjs/stancjs.ml | 26 ++++++++++++++++---------- test/stancjs/pedantic.js | 13 ++++++++++++- test/stancjs/stancjs.expected | 9 +++++++++ test/stancjs/warnings.js | 14 ++++++++++++++ 4 files changed, 51 insertions(+), 11 deletions(-) create mode 100644 test/stancjs/warnings.js diff --git a/src/stancjs/stancjs.ml b/src/stancjs/stancjs.ml index 9a48ac84e1..51f02d16ea 100644 --- a/src/stancjs/stancjs.ml +++ b/src/stancjs/stancjs.ml @@ -45,7 +45,7 @@ let stan2cpp model_name model_string flags = "Semantic check failed but reported no errors. This should never \ happen." in - if is_flag_set "version" then Result.Ok (Fmt.strf "%s" version, []) + if is_flag_set "version" then Result.Ok (Fmt.strf "%s" version) else Result.bind ast ~f: @@ -53,13 +53,12 @@ let stan2cpp model_name model_string flags = Semantic_check.semantic_check_program) |> Result.map ~f:(fun typed_ast -> if is_flag_set "print-canonical" then - ( Pretty_printing.pretty_print_typed_program + Pretty_printing.pretty_print_typed_program (Canonicalize.canonicalize_program typed_ast) - , [] ) else if is_flag_set "auto-format" then match ast with - | Result.Ok f -> (Pretty_printing.pretty_print_program f, []) - | _ -> ("Error: This should not happend!", []) + | Result.Ok f -> Pretty_printing.pretty_print_program f + | _ -> "Error: This should not happend!" else let mir = Ast_to_Mir.trans_prog model_name typed_ast in let tx_mir = Transform_Mir.trans_prog mir in @@ -72,21 +71,28 @@ let stan2cpp model_name model_string flags = Pedantic_analysis.print_warn_uninitialized mir ; if is_flag_set "warn-pedantic" then Pedantic_analysis.print_warn_pedantic mir ; - (cpp, []) ) + cpp) + +let stanc_stdout = ref "" +let stanc_stderr = ref "" let wrap_result = function - | Result.Ok (s, k) -> + | Result.Ok s -> Js.Unsafe.obj [| ("result", Js.Unsafe.inject (Js.string s)) ; ( "warnings" - , Js.Unsafe.inject - (Js.array (List.to_array (List.map ~f:Js.string k))) ) |] + , Js.Unsafe.inject (Js.string !stanc_stderr) + ) |] | Error e -> Js.Unsafe.obj [| ("errors", Js.Unsafe.inject (Array.map ~f:Js.string [|e|])) - ; ("warnings", Js.Unsafe.inject Js.array_empty) |] + ; ("warnings", Js.Unsafe.inject (Js.string !stanc_stderr)) |] let stan2cpp_wrapped name code (flags : Js.string_array Js.t Js.opt) = + stanc_stdout := ""; + stanc_stderr := ""; + Sys_js.set_channel_flusher stdout (fun s -> (stanc_stdout := !stanc_stdout ^ s)); + Sys_js.set_channel_flusher stderr (fun s -> (stanc_stderr := !stanc_stderr ^ s)); stan2cpp (Js.to_string name) (Js.to_string code) Js.( Opt.map flags (fun a -> diff --git a/test/stancjs/pedantic.js b/test/stancjs/pedantic.js index 35bcdcdaad..aa9635b0d1 100644 --- a/test/stancjs/pedantic.js +++ b/test/stancjs/pedantic.js @@ -11,9 +11,14 @@ model { } ` var pedantic_test = stanc.stanc("pedantic", pedantic_model, ["warn-pedantic"]); +if (pedantic_test.warnings) { + console.log(pedantic_test.warnings) +} var pedantic_test = stanc.stanc("pedantic", pedantic_model); - +if (pedantic_test.warnings) { + console.log(pedantic_test.warnings) +} var warn_uninit_model = ` transformed data { real tt; @@ -21,5 +26,11 @@ transformed data { } ` var warn_uninit_test = stanc.stanc("uninit", warn_uninit_model, ["warn-uninitialized"]); +if (warn_uninit_test.warnings) { + console.log(warn_uninit_test.warnings) +} var warn_uninit_test = stanc.stanc("uninit", warn_uninit_model); +if (warn_uninit_test.warnings) { + console.log(warn_uninit_test.warnings) +} \ No newline at end of file diff --git a/test/stancjs/stancjs.expected b/test/stancjs/stancjs.expected index 42ef8dbb72..8366daa510 100644 --- a/test/stancjs/stancjs.expected +++ b/test/stancjs/stancjs.expected @@ -44,11 +44,20 @@ Warning: Warning at 'string', line 7, column 17 to column 22: Argument 10000 suggests there may be parameters that are not unit scale; consider rescaling with a multiplier (see manual section 22.12). + Warning at 'string', line 4, column 9 to column 11: The variable tt may not have been assigned a value before its use. + $ node standalone-functions.js $ node version.js %%NAME%% %%VERSION%% %%NAME%% %%VERSION%% %%NAME%% %%VERSION%% +$ node warnings.js + +Warning: deprecated language construct used in 'string', line 4, column 4: + +Comments beginning with # are deprecated. Please use // in place of # for line comments. + + diff --git a/test/stancjs/warnings.js b/test/stancjs/warnings.js new file mode 100644 index 0000000000..014bf42cb9 --- /dev/null +++ b/test/stancjs/warnings.js @@ -0,0 +1,14 @@ +var stanc = require('../../src/stancjs/stancjs.bc.js'); +var utils = require("./utils/utils.js"); + +var deprecated_model = ` +parameters { + real y; + # hash comment is deprecated +} +model { + y ~ normal(0,1); +} +` +var deprecated_test = stanc.stanc("deprecated", deprecated_model); +console.log(deprecated_test.warnings) \ No newline at end of file From 381e796137b0b1c31aa8314a1533888f76536623 Mon Sep 17 00:00:00 2001 From: Rok Cesnovar Date: Wed, 9 Dec 2020 20:49:23 +0100 Subject: [PATCH 2/2] format --- src/stancjs/stancjs.ml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/stancjs/stancjs.ml b/src/stancjs/stancjs.ml index 51f02d16ea..498898f6fd 100644 --- a/src/stancjs/stancjs.ml +++ b/src/stancjs/stancjs.ml @@ -54,7 +54,7 @@ let stan2cpp model_name model_string flags = |> Result.map ~f:(fun typed_ast -> if is_flag_set "print-canonical" then Pretty_printing.pretty_print_typed_program - (Canonicalize.canonicalize_program typed_ast) + (Canonicalize.canonicalize_program typed_ast) else if is_flag_set "auto-format" then match ast with | Result.Ok f -> Pretty_printing.pretty_print_program f @@ -71,7 +71,7 @@ let stan2cpp model_name model_string flags = Pedantic_analysis.print_warn_uninitialized mir ; if is_flag_set "warn-pedantic" then Pedantic_analysis.print_warn_pedantic mir ; - cpp) + cpp ) let stanc_stdout = ref "" let stanc_stderr = ref "" @@ -80,19 +80,17 @@ let wrap_result = function | Result.Ok s -> Js.Unsafe.obj [| ("result", Js.Unsafe.inject (Js.string s)) - ; ( "warnings" - , Js.Unsafe.inject (Js.string !stanc_stderr) - ) |] + ; ("warnings", Js.Unsafe.inject (Js.string !stanc_stderr)) |] | Error e -> Js.Unsafe.obj [| ("errors", Js.Unsafe.inject (Array.map ~f:Js.string [|e|])) ; ("warnings", Js.Unsafe.inject (Js.string !stanc_stderr)) |] let stan2cpp_wrapped name code (flags : Js.string_array Js.t Js.opt) = - stanc_stdout := ""; - stanc_stderr := ""; - Sys_js.set_channel_flusher stdout (fun s -> (stanc_stdout := !stanc_stdout ^ s)); - Sys_js.set_channel_flusher stderr (fun s -> (stanc_stderr := !stanc_stderr ^ s)); + stanc_stdout := "" ; + stanc_stderr := "" ; + Sys_js.set_channel_flusher stdout (fun s -> stanc_stdout := !stanc_stdout ^ s) ; + Sys_js.set_channel_flusher stderr (fun s -> stanc_stderr := !stanc_stderr ^ s) ; stan2cpp (Js.to_string name) (Js.to_string code) Js.( Opt.map flags (fun a ->