Skip to content

Commit 785edc9

Browse files
Require the use of remappings provided via --with (#842)
Signed-off-by: Brian H <brian.hardock@fermyon.com>
1 parent 1f4ab0f commit 785edc9

File tree

8 files changed

+46
-16
lines changed

8 files changed

+46
-16
lines changed

crates/c/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ impl WorldGenerator for C {
270270
gen.gen.src.append(&gen.src);
271271
}
272272

273-
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) {
273+
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) -> Result<()> {
274274
let linking_symbol = component_type_object::linking_symbol(&self.world);
275275
self.include("<stdlib.h>");
276276
let snake = self.world.to_snake_case();
@@ -463,6 +463,8 @@ impl WorldGenerator for C {
463463
.as_slice(),
464464
);
465465
}
466+
467+
Ok(())
466468
}
467469

468470
fn pre_export_interface(&mut self, resolve: &Resolve, _files: &mut Files) -> Result<()> {

crates/core/src/lib.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -294,8 +294,7 @@ pub trait WorldGenerator {
294294
for (name, id) in interfaces {
295295
self.export_interface(resolve, name, *id, files)?;
296296
}
297-
self.finish(resolve, id, files);
298-
Ok(())
297+
self.finish(resolve, id, files)
299298
}
300299

301300
fn finish_imports(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) {
@@ -348,7 +347,7 @@ pub trait WorldGenerator {
348347
types: &[(&str, TypeId)],
349348
files: &mut Files,
350349
);
351-
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files);
350+
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) -> Result<()>;
352351
}
353352

354353
/// This is a possible replacement for the `Generator` trait above, currently

crates/csharp/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ impl WorldGenerator for CSharp {
269269
gen.add_world_fragment();
270270
}
271271

272-
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) {
272+
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) -> Result<()> {
273273
let world = &resolve.worlds[id];
274274
let world_namespace = self.qualifier();
275275
let world_namespace = world_namespace.strip_suffix(".").unwrap();
@@ -654,6 +654,8 @@ impl WorldGenerator for CSharp {
654654
generate_stub(name.to_string(), files, Stubs::Interface(fragments));
655655
}
656656
}
657+
658+
Ok(())
657659
}
658660
}
659661

crates/go/src/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,7 +286,7 @@ impl WorldGenerator for TinyGo {
286286
self.src.push_str(&src);
287287
}
288288

289-
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) {
289+
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) -> Result<()> {
290290
// make sure all types are defined on top of the file
291291
let src = mem::take(&mut self.src);
292292
self.src.push_str(&src);
@@ -351,7 +351,9 @@ impl WorldGenerator for TinyGo {
351351
opts.no_object_file = true;
352352
opts.build()
353353
.generate(resolve, id, files)
354-
.expect("C generator should be infallible")
354+
.expect("C generator should be infallible");
355+
356+
Ok(())
355357
}
356358
}
357359

crates/markdown/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ impl WorldGenerator for Markdown {
200200
}
201201
}
202202

203-
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) {
203+
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) -> Result<()> {
204204
let world = &resolve.worlds[world];
205205
let parser = Parser::new(&self.src);
206206
let mut events = Vec::new();
@@ -227,6 +227,8 @@ impl WorldGenerator for Markdown {
227227
files.push(&format!("{}.md", world.name), self.src.as_bytes());
228228
files.push(&format!("{}.html", world.name), html_output.as_bytes());
229229
}
230+
231+
Ok(())
230232
}
231233
}
232234

crates/rust/src/lib.rs

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@ struct RustWasm {
4848
resources: HashMap<TypeId, ResourceInfo>,
4949
import_funcs_called: bool,
5050
with_name_counter: usize,
51+
// Track the with options that were used. Remapped interfaces provided via `with`
52+
// are required to be used.
53+
used_with_opts: HashSet<String>,
5154
}
5255

5356
#[cfg(feature = "clap")]
@@ -288,6 +291,7 @@ impl RustWasm {
288291
let with_name = resolve.name_world_key(name);
289292
let entry = if let Some(remapped_path) = self.opts.with.get(&with_name) {
290293
let name = format!("__with_name{}", self.with_name_counter);
294+
self.used_with_opts.insert(with_name);
291295
self.with_name_counter += 1;
292296
uwriteln!(self.src, "use {remapped_path} as {name};");
293297
InterfaceName {
@@ -459,7 +463,7 @@ impl WorldGenerator for RustWasm {
459463
}
460464
}
461465

462-
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) {
466+
fn finish(&mut self, resolve: &Resolve, world: WorldId, files: &mut Files) -> Result<()> {
463467
let name = &resolve.worlds[world].name;
464468

465469
let imports = mem::take(&mut self.import_modules);
@@ -582,6 +586,20 @@ impl WorldGenerator for RustWasm {
582586

583587
let module_name = name.to_snake_case();
584588
files.push(&format!("{module_name}.rs"), src.as_bytes());
589+
590+
let remapping_keys = self.opts.with.keys().cloned().collect::<HashSet<String>>();
591+
592+
let mut unused_keys = remapping_keys
593+
.difference(&self.used_with_opts)
594+
.collect::<Vec<&String>>();
595+
596+
unused_keys.sort();
597+
598+
if !unused_keys.is_empty() {
599+
bail!("unused remappings provided via `with`: {unused_keys:?}");
600+
}
601+
602+
Ok(())
585603
}
586604
}
587605

crates/teavm-java/src/lib.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ impl WorldGenerator for TeaVmJava {
177177
gen.add_world_fragment();
178178
}
179179

180-
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) {
180+
fn finish(&mut self, resolve: &Resolve, id: WorldId, files: &mut Files) -> Result<()> {
181181
let name = world_name(resolve, id);
182182
let (package, name) = split_qualified_name(&name);
183183

@@ -431,6 +431,8 @@ impl WorldGenerator for TeaVmJava {
431431
generate_stub(&package, format!("{name}Impl"), fragments, files);
432432
}
433433
}
434+
435+
Ok(())
434436
}
435437
}
436438

src/bin/wit-bindgen.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,15 @@ fn gen_world(
158158
let (pkg, _files) = resolve.push_path(&opts.wit)?;
159159
let world = resolve.select_world(pkg, opts.world.as_deref())?;
160160
if let Err(e) = generator.generate(&resolve, world, files) {
161-
eprintln!(
162-
"{e:?}\n\n\
163-
help: Specify export implementations using the `--exports` option.\n \
164-
For example: `--exports world=MyWorld,ns:pkg/iface=MyIface`\n \
165-
Alternatively, specify `--stubs` to generate stub implementations."
166-
);
161+
if e.to_string().starts_with("no `exports` map provided") {
162+
bail!(
163+
"{e:?}\n\n\
164+
help: Specify export implementations using the `--exports` option.\n \
165+
For example: `--exports world=MyWorld,ns:pkg/iface=MyIface`\n \
166+
Alternatively, specify `--stubs` to generate stub implementations."
167+
);
168+
}
169+
bail!("{e:?}");
167170
}
168171

169172
Ok(())

0 commit comments

Comments
 (0)