diff --git a/crates/component-macro/tests/codegen/rename.wit b/crates/component-macro/tests/codegen/rename.wit new file mode 100644 index 0000000000..d60d4f6f9f --- /dev/null +++ b/crates/component-macro/tests/codegen/rename.wit @@ -0,0 +1,14 @@ +interface red { + use self.green.{thing} + + foo: func() -> thing +} + +interface green { + type thing = s32 +} + +default world neptune { + import blue: self.red + import orange: self.green +} diff --git a/crates/wit-bindgen/src/lib.rs b/crates/wit-bindgen/src/lib.rs index 1fc04d68e9..a741e3e227 100644 --- a/crates/wit-bindgen/src/lib.rs +++ b/crates/wit-bindgen/src/lib.rs @@ -1,7 +1,7 @@ use crate::rust::{to_rust_ident, to_rust_upper_camel_case, RustGenerator, TypeMode}; use crate::types::{TypeInfo, Types}; use heck::*; -use std::collections::BTreeMap; +use std::collections::{BTreeMap, HashMap}; use std::fmt::Write as _; use std::io::{Read, Write}; use std::mem; @@ -33,6 +33,7 @@ struct Wasmtime { exports: Exports, types: Types, sizes: SizeAlign, + interface_names: HashMap, } enum Import { @@ -113,6 +114,7 @@ impl Wasmtime { Import::Function { sig, add_to_linker } } WorldItem::Interface(id) => { + gen.gen.interface_names.insert(*id, snake.clone()); gen.current_interface = Some(*id); gen.types(*id); gen.generate_trappable_error_types(TypeOwner::Interface(*id)); @@ -159,6 +161,7 @@ impl Wasmtime { } WorldItem::Type(_) => unreachable!(), WorldItem::Interface(id) => { + gen.gen.interface_names.insert(*id, snake.clone()); gen.current_interface = Some(*id); gen.types(*id); gen.generate_trappable_error_types(TypeOwner::Interface(*id)); @@ -1382,8 +1385,18 @@ impl<'a> RustGenerator<'a> for InterfaceGenerator<'a> { self.resolve } - fn current_interface(&self) -> Option { - self.current_interface + fn path_to_interface(&self, interface: InterfaceId) -> Option { + match self.current_interface { + Some(id) if id == interface => None, + _ => { + let name = &self.gen.interface_names[&interface]; + Some(if self.current_interface.is_some() { + format!("super::{name}") + } else { + name.clone() + }) + } + } } fn push_str(&mut self, s: &str) { diff --git a/crates/wit-bindgen/src/rust.rs b/crates/wit-bindgen/src/rust.rs index 6a8c4a9b1a..bba7df58b7 100644 --- a/crates/wit-bindgen/src/rust.rs +++ b/crates/wit-bindgen/src/rust.rs @@ -15,7 +15,7 @@ pub trait RustGenerator<'a> { fn push_str(&mut self, s: &str); fn info(&self, ty: TypeId) -> TypeInfo; - fn current_interface(&self) -> Option; + fn path_to_interface(&self, interface: InterfaceId) -> Option; fn print_ty(&mut self, ty: &Type, mode: TypeMode) { match ty { @@ -64,19 +64,9 @@ pub trait RustGenerator<'a> { self.result_name(id) }; if let TypeOwner::Interface(id) = ty.owner { - if let Some(name) = &self.resolve().interfaces[id].name { - match self.current_interface() { - Some(cur) if cur == id => {} - Some(_other) => { - self.push_str("super::"); - self.push_str(&name.to_snake_case()); - self.push_str("::"); - } - None => { - self.push_str(&name.to_snake_case()); - self.push_str("::"); - } - } + if let Some(path) = self.path_to_interface(id) { + self.push_str(&path); + self.push_str("::"); } } self.push_str(&name);