Skip to content

Commit 672a70a

Browse files
committed
add codegen tests for futures, streams, and error-contexts
Signed-off-by: Joel Dice <joel.dice@fermyon.com>
1 parent 2f37f79 commit 672a70a

File tree

27 files changed

+461
-14
lines changed

27 files changed

+461
-14
lines changed

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ clap = { version = "4.3.19", features = ["derive"] }
3131
indexmap = "2.0.0"
3232
prettyplease = "0.2.20"
3333
syn = { version = "2.0", features = ["printing"] }
34+
futures = "0.3.31"
3435

3536
wasmparser = { git = "https://github.com/dicej/wasm-tools", branch = "async" }
3637
wasm-encoder = { git = "https://github.com/dicej/wasm-tools", branch = "async" }

crates/c/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1342,6 +1342,21 @@ void __wasm_export_{ns}_{snake}_dtor({ns}_{snake}_t* arg) {{
13421342
self.finish_typedef_struct(id);
13431343
}
13441344

1345+
fn type_future(&mut self, id: TypeId, name: &str, ty: &Option<Type>, docs: &Docs) {
1346+
_ = (id, name, ty, docs);
1347+
todo!()
1348+
}
1349+
1350+
fn type_stream(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs) {
1351+
_ = (id, name, ty, docs);
1352+
todo!()
1353+
}
1354+
1355+
fn type_error_context(&mut self, id: TypeId, name: &str, docs: &Docs) {
1356+
_ = (id, name, docs);
1357+
todo!()
1358+
}
1359+
13451360
fn type_builtin(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs) {
13461361
let _ = (id, name, ty, docs);
13471362
}

crates/c/tests/codegen.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ use std::process::Command;
66
use wit_parser::{Resolve, UnresolvedPackageGroup};
77

88
macro_rules! codegen_test {
9+
// TODO: implement support for stream, future, and error-context, and then
10+
// remove these lines:
11+
(streams $name:tt $test:tt) => {};
12+
(futures $name:tt $test:tt) => {};
13+
(resources_with_streams $name:tt $test:tt) => {};
14+
(resources_with_futures $name:tt $test:tt) => {};
15+
(error_context $name:tt $test:tt) => {};
16+
917
($id:ident $name:tt $test:tt) => {
1018
#[test]
1119
fn $id() {

crates/core/src/abi.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -845,9 +845,7 @@ fn needs_post_return(resolve: &Resolve, ty: &Type) -> bool {
845845
.filter_map(|t| t.as_ref())
846846
.any(|t| needs_post_return(resolve, t)),
847847
TypeDefKind::Flags(_) | TypeDefKind::Enum(_) => false,
848-
TypeDefKind::Future(_) | TypeDefKind::Stream(_) | TypeDefKind::ErrorContext => {
849-
unimplemented!()
850-
}
848+
TypeDefKind::Future(_) | TypeDefKind::Stream(_) | TypeDefKind::ErrorContext => false,
851849
TypeDefKind::Unknown => unreachable!(),
852850
},
853851

crates/core/src/lib.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,9 @@ pub trait InterfaceGenerator<'a> {
170170
fn type_alias(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs);
171171
fn type_list(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs);
172172
fn type_builtin(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs);
173+
fn type_future(&mut self, id: TypeId, name: &str, ty: &Option<Type>, docs: &Docs);
174+
fn type_stream(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs);
175+
fn type_error_context(&mut self, id: TypeId, name: &str, docs: &Docs);
173176
fn types(&mut self, iface: InterfaceId) {
174177
let iface = &self.resolve().interfaces[iface];
175178
for (name, id) in iface.types.iter() {
@@ -190,12 +193,10 @@ pub trait InterfaceGenerator<'a> {
190193
TypeDefKind::Result(r) => self.type_result(id, name, r, &ty.docs),
191194
TypeDefKind::List(t) => self.type_list(id, name, t, &ty.docs),
192195
TypeDefKind::Type(t) => self.type_alias(id, name, t, &ty.docs),
193-
TypeDefKind::Future(_) => panic!("future types do not require definition"),
194-
TypeDefKind::Stream(_) => panic!("stream types do not require definition"),
196+
TypeDefKind::Future(t) => self.type_future(id, name, t, &ty.docs),
197+
TypeDefKind::Stream(t) => self.type_stream(id, name, t, &ty.docs),
195198
TypeDefKind::Handle(_) => panic!("handle types do not require definition"),
196-
TypeDefKind::ErrorContext => {
197-
panic!("the error-context type does not require definition")
198-
}
199+
TypeDefKind::ErrorContext => self.type_error_context(id, name, &ty.docs),
199200
TypeDefKind::Unknown => unreachable!(),
200201
}
201202
}

crates/core/src/types.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,9 @@ impl Types {
193193
info = self.optional_type_info(resolve, r.ok.as_ref());
194194
info |= self.optional_type_info(resolve, r.err.as_ref());
195195
}
196-
TypeDefKind::Future(_) | TypeDefKind::Stream(_) | TypeDefKind::ErrorContext => {}
196+
TypeDefKind::Future(_) | TypeDefKind::Stream(_) | TypeDefKind::ErrorContext => {
197+
info.has_resource = true;
198+
}
197199
TypeDefKind::Unknown => unreachable!(),
198200
}
199201
let prev = self.type_info.insert(ty, info);

crates/csharp/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1903,6 +1903,21 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for InterfaceGenerator<'a> {
19031903
self.type_name(&Type::Id(id));
19041904
}
19051905

1906+
fn type_future(&mut self, id: TypeId, name: &str, ty: &Option<Type>, docs: &Docs) {
1907+
_ = (id, name, ty, docs);
1908+
todo!()
1909+
}
1910+
1911+
fn type_stream(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs) {
1912+
_ = (id, name, ty, docs);
1913+
todo!()
1914+
}
1915+
1916+
fn type_error_context(&mut self, id: TypeId, name: &str, docs: &Docs) {
1917+
_ = (id, name, docs);
1918+
todo!()
1919+
}
1920+
19061921
fn type_builtin(&mut self, _id: TypeId, _name: &str, _ty: &Type, _docs: &Docs) {
19071922
unimplemented!();
19081923
}

crates/csharp/tests/codegen.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,14 @@ use std::{
88
use wit_component::StringEncoding;
99

1010
macro_rules! codegen_test {
11+
// TODO: implement support for stream, future, and error-context, and then
12+
// remove these lines:
13+
(streams $name:tt $test:tt) => {};
14+
(futures $name:tt $test:tt) => {};
15+
(resources_with_streams $name:tt $test:tt) => {};
16+
(resources_with_futures $name:tt $test:tt) => {};
17+
(error_context $name:tt $test:tt) => {};
18+
1119
($id:ident $name:tt $test:tt) => {
1220
#[test]
1321
fn $id() {

crates/go/src/interface.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,21 @@ impl<'a> wit_bindgen_core::InterfaceGenerator<'a> for InterfaceGenerator<'a> {
12661266
// no impl since these types are generated as anonymous types
12671267
}
12681268

1269+
fn type_future(&mut self, id: TypeId, name: &str, ty: &Option<Type>, docs: &Docs) {
1270+
_ = (id, name, ty, docs);
1271+
todo!()
1272+
}
1273+
1274+
fn type_stream(&mut self, id: TypeId, name: &str, ty: &Type, docs: &Docs) {
1275+
_ = (id, name, ty, docs);
1276+
todo!()
1277+
}
1278+
1279+
fn type_error_context(&mut self, id: TypeId, name: &str, docs: &Docs) {
1280+
_ = (id, name, docs);
1281+
todo!()
1282+
}
1283+
12691284
fn type_builtin(&mut self, _id: TypeId, _name: &str, _ty: &Type, _docs: &Docs) {
12701285
todo!("type_builtin")
12711286
}

0 commit comments

Comments
 (0)