From 7926202243bfafa551c190ce44161562632d3148 Mon Sep 17 00:00:00 2001 From: James Sturtevant Date: Fri, 1 Dec 2023 16:09:44 -0800 Subject: [PATCH 1/3] c#: Encode version in ns to support wit versions Signed-off-by: James Sturtevant --- crates/csharp/src/lib.rs | 42 ++++++++++++++++++++++------------ crates/csharp/tests/codegen.rs | 1 - 2 files changed, 28 insertions(+), 15 deletions(-) diff --git a/crates/csharp/src/lib.rs b/crates/csharp/src/lib.rs index e5df96de7..31dcc73ce 100644 --- a/crates/csharp/src/lib.rs +++ b/crates/csharp/src/lib.rs @@ -567,13 +567,13 @@ impl InterfaceGenerator<'_> { if let TypeOwner::Interface(id) = &ty.owner { if let Some(name) = self.gen.interface_names.get(id) { if name != self.name { - return format!("{}.", name.to_upper_camel_case()); + return format!("{}.", name); } } } if when { - let name = self.name.to_upper_camel_case(); + let name = self.name; format!("{name}.") } else { String::new() @@ -583,7 +583,7 @@ impl InterfaceGenerator<'_> { fn add_interface_fragment(self, is_export: bool) { self.gen .interface_fragments - .entry(self.name.to_upper_camel_case()) + .entry(self.name.to_string()) .or_insert_with(|| InterfaceTypeAndFragments::new(is_export)) .interface_fragments .push(InterfaceFragment { @@ -1585,9 +1585,10 @@ impl Bindgen for FunctionBindgen<'_, '_> { } Instruction::CallInterface { func } => { - let module = self.gen.name.to_upper_camel_case(); + let module = self.gen.name.to_string(); let func_name = self.func_name.to_upper_camel_case(); - let class_name = CSharp::get_class_name_from_qualified_name(module); + let class_name = + CSharp::get_class_name_from_qualified_name(module).to_upper_camel_case(); let mut oper = String::new(); for (i, param) in operands.iter().enumerate() { @@ -1812,21 +1813,34 @@ fn interface_name(resolve: &Resolve, name: &WorldKey, direction: Direction) -> S } .to_upper_camel_case(); + let namespace = match &pkg { + Some(name) => { + let mut ns = format!( + "{}.{}.", + name.namespace.to_csharp_ident(), + name.name.to_csharp_ident() + ); + + if let Some(version) = &name.version { + let v = version + .to_string() + .replace('.', "_") + .replace('-', "_") + .replace('+', "_"); + ns = format!("{}v{}.", ns, &v); + } + ns + } + None => String::new(), + }; + format!( "wit.{}.{}{name}", match direction { Direction::Import => "imports", Direction::Export => "exports", }, - if let Some(name) = &pkg { - format!( - "{}.{}.", - name.namespace.to_csharp_ident(), - name.name.to_csharp_ident() - ) - } else { - String::new() - } + namespace ) } diff --git a/crates/csharp/tests/codegen.rs b/crates/csharp/tests/codegen.rs index 9c15d73b6..0820379b7 100644 --- a/crates/csharp/tests/codegen.rs +++ b/crates/csharp/tests/codegen.rs @@ -35,7 +35,6 @@ macro_rules! codegen_test { "lists", "many-arguments", "multi-return", - "multiversion", "option-result", "records", "rename-interface", From 9ac185a8cc86a260d2347cdcfbb33512a64c08b9 Mon Sep 17 00:00:00 2001 From: James Sturtevant Date: Fri, 1 Dec 2023 17:14:47 -0800 Subject: [PATCH 2/3] Fix tests Signed-off-by: James Sturtevant --- tests/runtime/numbers/wasm.cs | 4 ++-- tests/runtime/strings/wasm.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/runtime/numbers/wasm.cs b/tests/runtime/numbers/wasm.cs index e5bc9a6db..e0023267f 100644 --- a/tests/runtime/numbers/wasm.cs +++ b/tests/runtime/numbers/wasm.cs @@ -1,7 +1,7 @@ using System; using System.Runtime.InteropServices; using System.Diagnostics; -using wit_numbers.Wit.imports.test.numbers.Test; +using wit_numbers.wit.imports.test.numbers.Test; namespace wit_numbers; @@ -62,7 +62,7 @@ public static void TestImports() } } -public class TestImpl : wit_numbers.Wit.exports.test.numbers.Test.ITest +public class TestImpl : wit_numbers.wit.exports.test.numbers.Test.ITest { static uint SCALAR = 0; diff --git a/tests/runtime/strings/wasm.cs b/tests/runtime/strings/wasm.cs index e448f2db6..2b8606f3d 100644 --- a/tests/runtime/strings/wasm.cs +++ b/tests/runtime/strings/wasm.cs @@ -1,6 +1,6 @@ using System; using System.Diagnostics; -using wit_strings.Wit.imports.test.strings.Imports; +using wit_strings.wit.imports.test.strings.Imports; namespace wit_strings; From ab01fd1d93d44b6f1fd830f881eb4764217c3673 Mon Sep 17 00:00:00 2001 From: James Sturtevant Date: Mon, 4 Dec 2023 13:56:46 -0800 Subject: [PATCH 3/3] Make internal name different than outerclass Signed-off-by: James Sturtevant --- crates/csharp/src/lib.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/csharp/src/lib.rs b/crates/csharp/src/lib.rs index 31dcc73ce..184c4e8bf 100644 --- a/crates/csharp/src/lib.rs +++ b/crates/csharp/src/lib.rs @@ -764,7 +764,7 @@ impl InterfaceGenerator<'_> { uwrite!( self.csharp_interop_src, r#" - internal static class {camel_name}Interop + internal static class {camel_name}WasmInterop {{ [DllImport("*", EntryPoint = "{import_name}")] internal static extern {wasm_result_type} wasmImport{camel_name}({wasm_params}); @@ -1580,7 +1580,7 @@ impl Bindgen for FunctionBindgen<'_, '_> { uwriteln!( self.src, - "{assignment} {name}Interop.wasmImport{func_name}({operands});" + "{assignment} {name}WasmInterop.wasmImport{func_name}({operands});" ); }