From 734b6e98f81048b0787596e2c15eacfb9f3124e6 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:12:32 +0000 Subject: [PATCH 1/2] Initial plan From 9ca2e210604869e98f14e801d970d319f237a000 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 24 Dec 2025 19:18:36 +0000 Subject: [PATCH 2/2] Replace emit_globals with static global.mbt template file - Create global.mbt in base.mbt folder with static global bindings - Remove emit_globals.mbt from emit folder - Remove emit_globals call from main.mbt - Update pkg.generated.mbti to reflect the removal Co-authored-by: bikallem <315907+bikallem@users.noreply.github.com> --- webapi_gen/base.mbt/global.mbt | 19 ++++ webapi_gen/emit/emit_globals.mbt | 142 ----------------------------- webapi_gen/emit/pkg.generated.mbti | 2 - webapi_gen/main.mbt | 9 -- 4 files changed, 19 insertions(+), 153 deletions(-) create mode 100644 webapi_gen/base.mbt/global.mbt delete mode 100644 webapi_gen/emit/emit_globals.mbt diff --git a/webapi_gen/base.mbt/global.mbt b/webapi_gen/base.mbt/global.mbt new file mode 100644 index 0000000..af56132 --- /dev/null +++ b/webapi_gen/base.mbt/global.mbt @@ -0,0 +1,19 @@ +// MoonBit bindings for global objects + +///| +extern "js" fn global_document_ffi() -> Document = "() => document" + +///| +pub let document : Document = global_document_ffi() + +///| +extern "js" fn global_window_ffi() -> Window = "() => window" + +///| +pub let window : Window = global_window_ffi() + +///| +extern "js" fn global_navigator_ffi() -> Navigator = "() => navigator" + +///| +pub let navigator : Navigator = global_navigator_ffi() diff --git a/webapi_gen/emit/emit_globals.mbt b/webapi_gen/emit/emit_globals.mbt deleted file mode 100644 index 9d7664b..0000000 --- a/webapi_gen/emit/emit_globals.mbt +++ /dev/null @@ -1,142 +0,0 @@ -// Globals emitter - generates globals.mbt with global singleton objects - -///| -/// Configuration for global singletons to emit -/// Each entry is (global_name, interface_name, js_property_name) -let global_singletons : Array[(String, String, String)] = [ - ("document", "Document", "document"), - ("window", "Window", "window"), - ("navigator", "Navigator", "navigator"), -] - -///| -/// Emit a single global FFI declaration and binding -fn emit_global_binding( - global_name : String, - interface_name : String, - js_property : String, -) -> String { - let ffi_name = "global_\{global_name}_ffi" - let buf = StringBuilder::new() - buf.write_string("///|\n") - buf.write_string( - "extern \"js\" fn \{ffi_name}() -> \{interface_name} = \"() => \{js_property}\"\n", - ) - buf.write_string("\n") - buf.write_string("///|\n") - buf.write_string("pub let \{global_name} : \{interface_name} = \{ffi_name}()") - buf.to_string() -} - -///| -/// Emit globals.mbt file content -/// Only emits globals for interfaces that exist in the flattened IDL -pub fn emit_globals(flattened : @flattened_idl.FlattenedIdl) -> String { - let buf = StringBuilder::new() - - // Header - buf.write_string("// Auto-generated MoonBit bindings for global objects\n") - buf.write_string("// Do not edit manually\n") - let bindings : Array[String] = [] - for entry in global_singletons { - let (global_name, interface_name, js_property) = entry - // Only emit if the interface exists in the flattened IDL - if flattened.interfaces.contains(interface_name) { - bindings.push( - emit_global_binding(global_name, interface_name, js_property), - ) - } - } - if bindings.length() > 0 { - buf.write_string("\n") - buf.write_string(bindings.join("\n\n")) - buf.write_string("\n") - } - buf.to_string() -} - -///| -test "emit_global_binding" { - let result = emit_global_binding("document", "Document", "document") - inspect( - result, - content=( - #|///| - #|extern "js" fn global_document_ffi() -> Document = "() => document" - #| - #|///| - #|pub let document : Document = global_document_ffi() - ), - ) -} - -///| -test "emit_globals with Document interface" { - let idl = - #|interface Document {}; - let definitions = @parser.parse(idl) - let flattened = @partial_merged.merge_partials(definitions) - |> @flattened_idl.flatten(ignore) - let result = emit_globals(flattened) - inspect( - result, - content=( - #|// Auto-generated MoonBit bindings for global objects - #|// Do not edit manually - #| - #|///| - #|extern "js" fn global_document_ffi() -> Document = "() => document" - #| - #|///| - #|pub let document : Document = global_document_ffi() - #| - ), - ) -} - -///| -test "emit_globals with multiple interfaces" { - let idl = - #|interface Document {}; - #|interface Window {}; - let definitions = @parser.parse(idl) - let flattened = @partial_merged.merge_partials(definitions) - |> @flattened_idl.flatten(ignore) - let result = emit_globals(flattened) - inspect( - result, - content=( - #|// Auto-generated MoonBit bindings for global objects - #|// Do not edit manually - #| - #|///| - #|extern "js" fn global_document_ffi() -> Document = "() => document" - #| - #|///| - #|pub let document : Document = global_document_ffi() - #| - #|///| - #|extern "js" fn global_window_ffi() -> Window = "() => window" - #| - #|///| - #|pub let window : Window = global_window_ffi() - #| - ), - ) -} - -///| -test "emit_globals skips missing interfaces" { - // Parse an IDL that doesn't have Document, Window, or Navigator - let idl = - #|interface SomeOtherInterface {}; - let definitions = @parser.parse(idl) - let flattened = @partial_merged.merge_partials(definitions) - |> @flattened_idl.flatten(ignore) - let result = emit_globals(flattened) - // No bindings, just header - inspect( - result, - content="// Auto-generated MoonBit bindings for global objects\n// Do not edit manually\n", - ) -} diff --git a/webapi_gen/emit/pkg.generated.mbti b/webapi_gen/emit/pkg.generated.mbti index a0f31ec..bafb856 100644 --- a/webapi_gen/emit/pkg.generated.mbti +++ b/webapi_gen/emit/pkg.generated.mbti @@ -9,8 +9,6 @@ import( // Values pub fn[E : Emitter] emit_all(E, Iter[String]) -> Map[Filename, Code] -pub fn emit_globals(@flattened_idl.FlattenedIdl) -> String - pub fn emit_js_runtime(@flattened_idl.FlattenedIdl) -> String pub fn mbt_code_gen(Array[Emit]) -> String diff --git a/webapi_gen/main.mbt b/webapi_gen/main.mbt index 4f0d1f2..4b7febb 100644 --- a/webapi_gen/main.mbt +++ b/webapi_gen/main.mbt @@ -218,15 +218,6 @@ fn main { flattened.callbacks.keys(), ) - // Generate and write globals - println("=== Generating Globals ===") - let globals_code = @emit.emit_globals(flattened) - let globals_filepath = "\{output_dir}/globals.mbt" - println(" Writing \{globals_filepath}...") - @fs.write_string_to_file(globals_filepath, globals_code) catch { - e => fail("failed to write file: \{e}") - } - // XXX: Disabled for now since we only need JS bindings // Generate and write JS runtime // println("=== Generating JS Runtime ===")