Skip to content

Commit 1de735d

Browse files
fix(moonbit): keep async import codegen working
1 parent 7a53835 commit 1de735d

1 file changed

Lines changed: 62 additions & 64 deletions

File tree

crates/moonbit/src/lib.rs

Lines changed: 62 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -600,18 +600,55 @@ impl InterfaceGenerator<'_> {
600600
}
601601

602602
let ffi_import_name = format!("wasmImport{}", func.name.to_upper_camel_case());
603+
let mut bindgen = FunctionBindgen::new(
604+
self,
605+
func.params
606+
.iter()
607+
.map(|Param { name, .. }| name.to_moonbit_ident())
608+
.collect(),
609+
);
610+
611+
abi::call(
612+
bindgen.interface_gen.resolve,
613+
AbiVariant::GuestImport,
614+
LiftLower::LowerArgsLiftResults,
615+
func,
616+
&mut bindgen,
617+
false,
618+
);
619+
620+
let mut src = bindgen.src.clone();
621+
622+
let cleanup_list = if bindgen.needs_cleanup_list {
623+
"let cleanup_list : Array[Int] = []"
624+
} else {
625+
""
626+
};
627+
628+
let mbt_sig = self.world_gen.pkg_resolver.mbt_sig(self.name, func, false);
629+
let sig = self.sig_string(&mbt_sig, async_);
603630

604631
// Generate the core wasm abi
605-
{
606-
let wasm_sig = self.resolve.wasm_signature(
607-
if async_ {
608-
AbiVariant::GuestImportAsync
609-
} else {
610-
AbiVariant::GuestImport
611-
},
632+
let wasm_sig = self.resolve.wasm_signature(
633+
if async_ {
634+
AbiVariant::GuestImportAsync
635+
} else {
636+
AbiVariant::GuestImport
637+
},
638+
func,
639+
);
640+
let (import_module, import_name) = self.resolve.wasm_import_name(
641+
ManglingAndAbi::Legacy(if async_ {
642+
LiftLowerAbi::AsyncCallback
643+
} else {
644+
LiftLowerAbi::Sync
645+
}),
646+
WasmImport::Func {
647+
interface: self.interface,
612648
func,
613-
);
614-
649+
},
650+
);
651+
{
615652
let result_type = match &wasm_sig.results[..] {
616653
[] => "".into(),
617654
[result] => format!("-> {}", wasm_type(*result)),
@@ -626,18 +663,6 @@ impl InterfaceGenerator<'_> {
626663
.collect::<Vec<_>>()
627664
.join(", ");
628665

629-
let (import_module, import_name) = self.resolve.wasm_import_name(
630-
ManglingAndAbi::Legacy(if async_ {
631-
LiftLowerAbi::AsyncCallback
632-
} else {
633-
LiftLowerAbi::Sync
634-
}),
635-
WasmImport::Func {
636-
interface: self.interface,
637-
func,
638-
},
639-
);
640-
641666
uwriteln!(
642667
self.ffi,
643668
r#"
@@ -648,52 +673,25 @@ impl InterfaceGenerator<'_> {
648673

649674
// Generate the MoonBit wrapper
650675
if async_ {
651-
// self.r#generation_futures_and_streams_import("", func, &import_module);
652-
// if async_ {
653-
// src = self.r#generate_async_import_function(func, mbt_sig, &wasm_sig);
654-
// }
655-
todo!("async import not supported yet");
656-
} else {
657-
let mut bindgen = FunctionBindgen::new(
658-
self,
659-
func.params
660-
.iter()
661-
.map(|Param { name, .. }| name.to_moonbit_ident())
662-
.collect(),
663-
);
664-
665-
abi::call(
666-
bindgen.interface_gen.resolve,
667-
AbiVariant::GuestImport,
668-
LiftLower::LowerArgsLiftResults,
669-
func,
670-
&mut bindgen,
671-
false,
672-
);
673-
674-
let src = bindgen.src.clone();
675-
676-
let cleanup_list = if bindgen.needs_cleanup_list {
677-
"let cleanup_list : Array[Int] = []"
678-
} else {
679-
""
676+
let interface_name = match self.interface {
677+
Some(key) => self.resolve.name_world_key(key),
678+
None => "$root".into(),
680679
};
680+
self.generation_futures_and_streams_import("", func, &interface_name);
681+
src = self.generate_async_import_function(func, mbt_sig, &wasm_sig);
682+
}
681683

682-
let mbt_sig = self.world_gen.pkg_resolver.mbt_sig(self.name, func, false);
683-
let sig = self.sig_string(&mbt_sig, async_);
684-
685-
print_docs(&mut self.src, &func.docs);
684+
print_docs(&mut self.src, &func.docs);
686685

687-
uwrite!(
688-
self.src,
689-
r#"
690-
{sig} {{
691-
{cleanup_list}
692-
{src}
693-
}}
694-
"#
695-
);
696-
}
686+
uwrite!(
687+
self.src,
688+
r#"
689+
{sig} {{
690+
{cleanup_list}
691+
{src}
692+
}}
693+
"#
694+
);
697695
}
698696

699697
fn export(&mut self, func: &Function) {

0 commit comments

Comments
 (0)