@@ -33,6 +33,7 @@ pub(crate) struct FunctionBindgen<'a, 'b> {
3333 fixed_statments : Vec < Fixed > ,
3434 parameter_type : ParameterType ,
3535 result_type : Option < Type > ,
36+ pub ( crate ) resource_type_name : Option < String > ,
3637}
3738
3839impl < ' a , ' b > FunctionBindgen < ' a , ' b > {
@@ -70,6 +71,7 @@ impl<'a, 'b> FunctionBindgen<'a, 'b> {
7071 fixed_statments : Vec :: new ( ) ,
7172 parameter_type : parameter_type,
7273 result_type : result_type,
74+ resource_type_name : None ,
7375 }
7476 }
7577
@@ -1062,9 +1064,32 @@ impl Bindgen for FunctionBindgen<'_, '_> {
10621064 None => operands. join ( ", " ) ,
10631065 } ;
10641066
1067+ let ( _namespace, interface_name) =
1068+ & CSharp :: get_class_name_from_qualified_name ( self . interface_gen . name ) ;
1069+ let mut interop_name = format ! ( "{}ImportsInterop" , interface_name. strip_prefix( "I" ) . unwrap( )
1070+ . strip_suffix( if self . interface_gen. direction == Direction :: Import { "Imports" } else { "Exports" } ) . unwrap( ) . to_upper_camel_case( ) ) ;
1071+
1072+ if self . interface_gen . is_world && self . interface_gen . direction == Direction :: Import {
1073+ interop_name = format ! ( "Imports.{interop_name}" ) ;
1074+ }
1075+
1076+ let resource_type_name = match self . kind {
1077+ FunctionKind :: Method ( resource_type_id) |
1078+ FunctionKind :: Static ( resource_type_id) |
1079+ FunctionKind :: Constructor ( resource_type_id) => {
1080+ format ! (
1081+ ".{}" ,
1082+ self . interface_gen. csharp_gen. all_resources[ resource_type_id]
1083+ . name
1084+ . to_upper_camel_case( )
1085+ )
1086+ }
1087+ _ => String :: new ( ) ,
1088+ } ;
1089+
10651090 uwriteln ! (
10661091 self . src,
1067- "{assignment} {func_name}WasmInterop.wasmImport{func_name}({operands});"
1092+ "{assignment} {interop_name}{resource_type_name}.{ func_name}WasmInterop.wasmImport{func_name}({operands});"
10681093 ) ;
10691094
10701095 if let Some ( buffer) = async_return_buffer {
@@ -1364,6 +1389,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
13641389 } else {
13651390 uwriteln ! ( self . src, "var {resource} = ({export_name}) {export_name}.repTable.Get({op});" ) ;
13661391 }
1392+ self . resource_type_name = Some ( export_name) ;
13671393 }
13681394 }
13691395 results. push ( resource) ;
@@ -1375,15 +1401,27 @@ impl Bindgen for FunctionBindgen<'_, '_> {
13751401
13761402 Instruction :: FutureLower { .. } => {
13771403 let op = & operands[ 0 ] ;
1404+ self . interface_gen . add_future ( self . func_name ) ;
1405+
13781406 results. push ( format ! ( "{op}.Handle" ) ) ;
13791407 }
13801408
13811409 Instruction :: AsyncTaskReturn { name : _, params : _ } => {
13821410 uwriteln ! ( self . src, "// TODO_task_cancel.forget();" ) ;
13831411 }
13841412
1385- Instruction :: FutureLift { .. }
1386- | Instruction :: StreamLower { .. }
1413+ Instruction :: FutureLift { payload : _, ty : _ } => {
1414+ // TODO get the prefix for the type
1415+ let sig_type_name = "Void" ;
1416+ uwriteln ! ( self . src, "var reader = new {}.FutureReader{}({});" , self . interface_gen. name, sig_type_name, operands[ 0 ] ) ;
1417+ self . interface_gen . csharp_gen . needs_future_reader_support = true ;
1418+ results. push ( "reader" . to_string ( ) ) ;
1419+
1420+ self . interface_gen . add_future ( self . func_name ) ;
1421+ self . interface_gen . csharp_gen . needs_future_reader_support = true ;
1422+ }
1423+
1424+ Instruction :: StreamLower { .. }
13871425 | Instruction :: StreamLift { .. }
13881426 | Instruction :: ErrorContextLower { .. }
13891427 | Instruction :: ErrorContextLift { .. }
@@ -1418,7 +1456,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
14181456 uwrite ! (
14191457 self . src,
14201458 "
1421- var {ret_area} = stackalloc {element_type}[{array_size}+ 1];
1459+ var {ret_area} = stackalloc {element_type}[{array_size} + 1];
14221460 var {ptr} = ((int){ret_area}) + ({align} - 1) & -{align};
14231461 " ,
14241462 align = align. align_wasm32( )
@@ -1487,7 +1525,7 @@ impl Bindgen for FunctionBindgen<'_, '_> {
14871525}
14881526
14891527/// Dereference any number `TypeDefKind::Type` aliases to retrieve the target type.
1490- fn dealias ( resolve : & Resolve , mut id : TypeId ) -> TypeId {
1528+ pub fn dealias ( resolve : & Resolve , mut id : TypeId ) -> TypeId {
14911529 loop {
14921530 match & resolve. types [ id] . kind {
14931531 TypeDefKind :: Type ( Type :: Id ( that_id) ) => id = * that_id,
0 commit comments