Skip to content

Commit 14ff1c8

Browse files
authored
Fix printing of the preamble in generated Rust code. (bytecodealliance#1087)
In the generated Rust bindings, Generate the preamble comments in a separate string, because `prettyplease` does not preserve comments. Also, add several more options to the preamble printing code. Fixes bytecodealliance#1086.
1 parent af2d6e8 commit 14ff1c8

File tree

1 file changed

+64
-12
lines changed

1 file changed

+64
-12
lines changed

crates/rust/src/lib.rs

Lines changed: 64 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ struct InterfaceName {
2727
#[derive(Default)]
2828
struct RustWasm {
2929
types: Types,
30+
src_preamble: Source,
3031
src: Source,
3132
opts: Opts,
3233
import_modules: Vec<(String, Vec<String>)>,
@@ -837,44 +838,90 @@ macro_rules! __export_{world_name}_impl {{
837838

838839
impl WorldGenerator for RustWasm {
839840
fn preprocess(&mut self, resolve: &Resolve, world: WorldId) {
840-
wit_bindgen_core::generated_preamble(&mut self.src, env!("CARGO_PKG_VERSION"));
841+
wit_bindgen_core::generated_preamble(&mut self.src_preamble, env!("CARGO_PKG_VERSION"));
841842

842843
// Render some generator options to assist with debugging and/or to help
843844
// recreate it if the original generation command is lost.
844-
uwriteln!(self.src, "// Options used:");
845+
uwriteln!(self.src_preamble, "// Options used:");
845846
if self.opts.std_feature {
846-
uwriteln!(self.src, "// * std_feature");
847+
uwriteln!(self.src_preamble, "// * std_feature");
847848
}
848849
if self.opts.raw_strings {
849-
uwriteln!(self.src, "// * raw_strings");
850+
uwriteln!(self.src_preamble, "// * raw_strings");
850851
}
851852
if !self.opts.skip.is_empty() {
852-
uwriteln!(self.src, "// * skip: {:?}", self.opts.skip);
853+
uwriteln!(self.src_preamble, "// * skip: {:?}", self.opts.skip);
854+
}
855+
if self.opts.stubs {
856+
uwriteln!(self.src_preamble, "// * stubs");
857+
}
858+
if let Some(export_prefix) = &self.opts.export_prefix {
859+
uwriteln!(
860+
self.src_preamble,
861+
"// * export_prefix: {:?}",
862+
export_prefix
863+
);
864+
}
865+
if let Some(runtime_path) = &self.opts.runtime_path {
866+
uwriteln!(self.src_preamble, "// * runtime_path: {:?}", runtime_path);
867+
}
868+
if let Some(bitflags_path) = &self.opts.bitflags_path {
869+
uwriteln!(
870+
self.src_preamble,
871+
"// * bitflags_path: {:?}",
872+
bitflags_path
873+
);
853874
}
854875
if !matches!(self.opts.ownership, Ownership::Owning) {
855-
uwriteln!(self.src, "// * ownership: {:?}", self.opts.ownership);
876+
uwriteln!(
877+
self.src_preamble,
878+
"// * ownership: {:?}",
879+
self.opts.ownership
880+
);
856881
}
857882
if !self.opts.additional_derive_attributes.is_empty() {
858883
uwriteln!(
859-
self.src,
884+
self.src_preamble,
860885
"// * additional derives {:?}",
861886
self.opts.additional_derive_attributes
862887
);
863888
}
864889
for (k, v) in self.opts.with.iter() {
865-
uwriteln!(self.src, "// * with {k:?} = {v}");
890+
uwriteln!(self.src_preamble, "// * with {k:?} = {v}");
891+
}
892+
if let Some(type_section_suffix) = &self.opts.type_section_suffix {
893+
uwriteln!(
894+
self.src_preamble,
895+
"// * type_section_suffix: {:?}",
896+
type_section_suffix
897+
);
866898
}
867899
if let Some(default) = &self.opts.default_bindings_module {
868-
uwriteln!(self.src, "// * default-bindings-module: {default:?}");
900+
uwriteln!(
901+
self.src_preamble,
902+
"// * default-bindings-module: {default:?}"
903+
);
869904
}
870905
if self.opts.disable_run_ctors_once_workaround {
871-
uwriteln!(self.src, "// * disable-run-ctors-once-workaround");
906+
uwriteln!(
907+
self.src_preamble,
908+
"// * disable-run-ctors-once-workaround"
909+
);
872910
}
873911
if let Some(s) = &self.opts.export_macro_name {
874-
uwriteln!(self.src, "// * export-macro-name: {s}");
912+
uwriteln!(self.src_preamble, "// * export-macro-name: {s}");
875913
}
876914
if self.opts.pub_export_macro {
877-
uwriteln!(self.src, "// * pub-export-macro");
915+
uwriteln!(self.src_preamble, "// * pub-export-macro");
916+
}
917+
if self.opts.generate_unused_types {
918+
uwriteln!(self.src_preamble, "// * generate_unused_types");
919+
}
920+
if self.opts.disable_custom_section_link_helpers {
921+
uwriteln!(
922+
self.src_preamble,
923+
"// * disable_custom_section_link_helpers"
924+
);
878925
}
879926
self.types.analyze(resolve);
880927
self.world = Some(world);
@@ -1101,6 +1148,11 @@ impl WorldGenerator for RustWasm {
11011148
*src.as_mut_string() = prettyplease::unparse(&syntax_tree);
11021149
}
11031150

1151+
// Prepend the preamble. We do this after formatting because
1152+
// `syn::parse_file` + `prettyplease::unparse` does not preserve comments.
1153+
let src_preamble = mem::take(&mut self.src_preamble);
1154+
*src.as_mut_string() = format!("{}{}", src_preamble.as_str(), src.as_str());
1155+
11041156
let module_name = name.to_snake_case();
11051157
files.push(&format!("{module_name}.rs"), src.as_bytes());
11061158

0 commit comments

Comments
 (0)