diff --git a/Cargo.lock b/Cargo.lock index fe89d03..6f1413e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -471,7 +471,7 @@ dependencies = [ "async-trait", "futures", "wasm-encoder 0.244.0", - "wasm-metadata", + "wasm-metadata 0.244.0", "wasmparser 0.244.0", ] @@ -507,13 +507,14 @@ dependencies = [ "test-generator", "tokio", "toml 0.8.23", - "wasm-encoder 0.244.0", - "wasmparser 0.244.0", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", "wasmtime", "wasmtime-wasi", - "wit-component", + "wit-bindgen-core 0.53.1", + "wit-component 0.245.1", "wit-dylib", - "wit-parser 0.244.0", + "wit-parser 0.245.1", "zstd", ] @@ -945,6 +946,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" +[[package]] +name = "foldhash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -1128,7 +1135,7 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "foldhash", + "foldhash 0.1.5", "serde", ] @@ -1137,6 +1144,11 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", + "serde", + "serde_core", +] [[package]] name = "heck" @@ -3137,6 +3149,16 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wasm-encoder" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9dca005e69bf015e45577e415b9af8c67e8ee3c0e38b5b0add5aa92581ed5c" +dependencies = [ + "leb128fmt", + "wasmparser 0.245.1", +] + [[package]] name = "wasm-metadata" version = "0.244.0" @@ -3156,6 +3178,18 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wasm-metadata" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da55e60097e8b37b475a0fa35c3420dd71d9eb7bd66109978ab55faf56a57efb" +dependencies = [ + "anyhow", + "indexmap", + "wasm-encoder 0.245.1", + "wasmparser 0.245.1", +] + [[package]] name = "wasmparser" version = "0.243.0" @@ -3182,6 +3216,19 @@ dependencies = [ "serde", ] +[[package]] +name = "wasmparser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f08c9adee0428b7bddf3890fc27e015ac4b761cc608c822667102b8bfd6995e" +dependencies = [ + "bitflags", + "hashbrown 0.16.1", + "indexmap", + "semver", + "serde", +] + [[package]] name = "wasmprinter" version = "0.243.0" @@ -3918,6 +3965,17 @@ dependencies = [ "wit-parser 0.244.0", ] +[[package]] +name = "wit-bindgen-core" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3deda4b7e9f522d994906f6e6e0fc67965ea8660306940a776b76732be8f3933" +dependencies = [ + "anyhow", + "heck", + "wit-parser 0.245.1", +] + [[package]] name = "wit-bindgen-rust" version = "0.52.0" @@ -3929,9 +3987,9 @@ dependencies = [ "indexmap", "prettyplease", "syn", - "wasm-metadata", - "wit-bindgen-core", - "wit-component", + "wasm-metadata 0.244.0", + "wit-bindgen-core 0.52.0", + "wit-component 0.244.0", ] [[package]] @@ -3945,7 +4003,7 @@ dependencies = [ "proc-macro2", "quote", "syn", - "wit-bindgen-core", + "wit-bindgen-core 0.52.0", "wit-bindgen-rust", ] @@ -3963,21 +4021,40 @@ dependencies = [ "serde_derive", "serde_json", "wasm-encoder 0.244.0", - "wasm-metadata", + "wasm-metadata 0.244.0", "wasmparser 0.244.0", "wit-parser 0.244.0", ] +[[package]] +name = "wit-component" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4894f10d2d5cbc17c77e91f86a1e48e191a788da4425293b55c98b44ba3fcac9" +dependencies = [ + "anyhow", + "bitflags", + "indexmap", + "log", + "serde", + "serde_derive", + "serde_json", + "wasm-encoder 0.245.1", + "wasm-metadata 0.245.1", + "wasmparser 0.245.1", + "wit-parser 0.245.1", +] + [[package]] name = "wit-dylib" -version = "0.244.0" +version = "0.245.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf3ed23ad7d72a88d566eaaae4d2b6bc2c3b86a6af92d0b0d6a5511ca6e9b6c9" +checksum = "4cfce934866f549164ec28f91d9b0db4a6e9b4c31f87090cf01504f249e630dc" dependencies = [ "anyhow", "indexmap", - "wasm-encoder 0.244.0", - "wit-parser 0.244.0", + "wasm-encoder 0.245.1", + "wit-parser 0.245.1", ] [[package]] @@ -4021,6 +4098,25 @@ dependencies = [ "wasmparser 0.244.0", ] +[[package]] +name = "wit-parser" +version = "0.245.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330698718e82983499419494dd1e3d7811a457a9bf9f69734e8c5f07a2547929" +dependencies = [ + "anyhow", + "hashbrown 0.16.1", + "id-arena", + "indexmap", + "log", + "semver", + "serde", + "serde_derive", + "serde_json", + "unicode-xid", + "wasmparser 0.245.1", +] + [[package]] name = "witx" version = "0.9.1" diff --git a/Cargo.toml b/Cargo.toml index 4b0636b..d98e1ff 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,11 +14,11 @@ clap = { version = "4.5.20", features = ["derive"] } tar = "0.4.42" tempfile = "3.13.0" zstd = "0.13.2" -wasm-encoder = { version = "0.244.0", features = ["wasmparser"] } -wit-dylib = "0.244.0" -wit-parser = "0.244.0" -wit-component = "0.244.0" -wasmparser = "0.244.0" +wasm-encoder = { version = "0.245.0", features = ["wasmparser"] } +wit-dylib = "0.245.0" +wit-parser = "0.245.0" +wit-component = "0.245.0" +wasmparser = "0.245.0" indexmap = "2.6.0" bincode = "1.3.3" heck = "0.5.0" @@ -45,6 +45,7 @@ im-rc = "15.1.0" serde = { version = "1.0.213", features = ["derive"] } toml = "0.8.19" semver = "1.0.23" +wit-bindgen-core = "0.53.1" [dev-dependencies] assert_cmd = "2.0.16" diff --git a/src/lib.rs b/src/lib.rs index 1af8f2a..ba72b0d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -372,7 +372,7 @@ pub async fn componentize( docs: Default::default(), stability: Stability::Unknown, includes: Default::default(), - include_names: Default::default(), + span: Default::default(), }); resolve.packages[union_package] @@ -803,7 +803,7 @@ fn add_wasi_and_stubs( .or_default() .push(Stub::Function(&function.name, &function.kind)); } - WorldItem::Type(id) => { + WorldItem::Type { id, .. } => { let ty = &resolve.types[*id]; if let TypeDefKind::Resource = &ty.kind { stubs diff --git a/src/summary.rs b/src/summary.rs index 8b0576f..38639b9 100644 --- a/src/summary.rs +++ b/src/summary.rs @@ -19,10 +19,11 @@ use { path::Path, str, }, + wit_bindgen_core::Types, wit_dylib::Metadata, wit_parser::{ - CloneMaps, Handle, InterfaceId, Resolve, Result_, Type, TypeDef, TypeDefKind, TypeId, - TypeOwner, WorldId, WorldItem, WorldKey, + CloneMaps, Handle, InterfaceId, Param, Resolve, Result_, Type, TypeDef, TypeDefKind, + TypeId, TypeOwner, WorldId, WorldItem, WorldKey, }, }; @@ -72,7 +73,7 @@ pub struct MyFunction<'a> { pub interface: Option>, pub name: &'a str, pub docs: Option<&'a str>, - pub params: &'a [(String, Type)], + pub params: &'a [Param], pub result: &'a Option, pub wit_kind: wit_parser::FunctionKind, } @@ -336,7 +337,7 @@ impl<'a> Summary<'a> { interface: Option>, name: &'a str, docs: Option<&'a str>, - params: &'a [(String, Type)], + params: &'a [Param], result: &'a Option, direction: Direction, wit_kind: wit_parser::FunctionKind, @@ -471,7 +472,7 @@ impl<'a> Summary<'a> { ); } - WorldItem::Type(ty) => self.visit_type(Type::Id(*ty), world), + WorldItem::Type { id, .. } => self.visit_type(Type::Id(*id), world), } } Ok(()) @@ -973,9 +974,9 @@ impl<'a> Summary<'a> { let params = self_ .map(|s| s.to_string()) .into_iter() - .chain(function.params.iter().skip(skip_count).map(|(name, ty)| { - let snake = name.to_snake_case().escape(); - format!("{snake}: {}", type_name(*ty)) + .chain(function.params.iter().skip(skip_count).map(|p| { + let snake = p.name.to_snake_case().escape(); + format!("{snake}: {}", type_name(p.ty)) })) .collect::>() .join(", "); @@ -983,7 +984,7 @@ impl<'a> Summary<'a> { let args = function .params .iter() - .map(|(name, _)| name.to_snake_case().escape()) + .map(|p| p.name.to_snake_case().escape()) .collect::>() .join(", "); @@ -1117,8 +1118,8 @@ impl<'a> Summary<'a> { visited.insert(id); let sort = |function: &MyFunction, sorted: &mut _, visited: &mut _| { - for (_, ty) in function.params { - self.sort(*ty, &mut *sorted, &mut *visited); + for p in function.params { + self.sort(p.ty, &mut *sorted, &mut *visited); } for ty in function.result.types() { @@ -1278,7 +1279,7 @@ impl<'a> Summary<'a> { .params .iter() .skip(skip_count) - .map(|(name, _)| name.to_snake_case().escape()) + .map(|p| p.name.to_snake_case().escape()) .collect::>() .join(", "); @@ -1401,6 +1402,10 @@ impl<'a> Summary<'a> { let mut seen = HashSet::new(); let mut stream_payloads = HashSet::new(); let mut future_payloads = HashSet::new(); + let mut types = Types::default(); + types.analyze(self.resolve); + types.collect_equal_types(self.resolve, &|_| true); + for (index, id) in self.types.iter().copied().enumerate() { if !self .world_types @@ -1742,10 +1747,11 @@ class {camel}(Protocol): | TypeDefKind::Result(_) | TypeDefKind::Handle(_) => (None, Vec::new()), TypeDefKind::Stream(ty) => { - let code = if stream_payloads.contains(ty) { + let canonical = canonical_payload(self.resolve, &mut types, ty); + let code = if stream_payloads.contains(&canonical) { None } else { - stream_payloads.insert(ty); + stream_payloads.insert(canonical); Some(if let Some(Type::U8 | Type::S8) = ty { if stub_runtime_calls { @@ -1795,10 +1801,11 @@ def {snake}_stream() -> tuple[StreamWriter[{camel}], StreamReader[{camel}]]: (code.map(Code::Shared), Vec::new()) } TypeDefKind::Future(ty) => { - let code = if future_payloads.contains(ty) { + let canonical = canonical_payload(self.resolve, &mut types, ty); + let code = if future_payloads.contains(&canonical) { None } else { - future_payloads.insert(ty); + future_payloads.insert(canonical); let snake = ty .map(|ty| names.mangle_name(ty)) @@ -2641,6 +2648,19 @@ fn docstring( } } +fn canonical_payload(resolve: &Resolve, types: &mut Types, ty: &Option) -> Option { + match ty { + Some(Type::Id(id)) => { + let id = types.get_representative_type(*id); + match resolve.types[id].kind { + TypeDefKind::Type(t) => Some(t), + _ => Some(Type::Id(id)), + } + } + other => *other, + } +} + fn dealias(resolve: &Resolve, mut id: TypeId) -> TypeId { loop { match &resolve.types[id].kind { diff --git a/src/util.rs b/src/util.rs index a8e4fd0..6551efa 100644 --- a/src/util.rs +++ b/src/util.rs @@ -1,20 +1,15 @@ use { std::iter, - wit_parser::{Flags, FlagsRepr, Type}, + wit_parser::{Flags, FlagsRepr, Param, Type}, }; pub trait Types { fn types(&self) -> Box>; } -impl Types for &[(String, Type)] { +impl Types for &[Param] { fn types(&self) -> Box> { - Box::new( - self.iter() - .map(|(_, ty)| *ty) - .collect::>() - .into_iter(), - ) + Box::new(self.iter().map(|p| p.ty).collect::>().into_iter()) } }