mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-06-13 21:11:22 +00:00
Fix conditional #[wasm_bindgen] in impls
Reported in #1191 the fix requires us to get a bit creative I think. The general gist is that a block like this: #[wasm_bindgen] impl Foo { pub fn foo() {} } was previously expanded all in one go. Now, however, it's expanded into: impl Foo { #[__wasm_bindgen_class_marker(Foo = "Foo")] pub fn foo() {} } // goop generated by orginal #[wasm_bindgen] This method of expansion takes advantage of rustc's recursive expansion feature. It also allows us to expand `impl` blocks and allow inner items to not be fully expanded yet, such as still having `#[cfg]` attributes (like in the original bug report). We use theinternal `__wasm_bindgen_class_marker` to indicate that we're parsing an `ImplItemMethod` unconditionally, and then generation proceeds as usual. The only final catch is that when we're expanding in an `impl` block we have to generate tokens for the `Program` (wasm-bindgen injected goop like the custom section) inside the body of the function itself instead of next to it. Otherwise we'd get syntax errors inside of impl blocks! Closes #1191
This commit is contained in:
@ -143,3 +143,8 @@ exports.js_renamed_export = () => {
|
||||
x.foo();
|
||||
x.bar(x);
|
||||
};
|
||||
|
||||
exports.js_conditional_bindings = () => {
|
||||
const x = new wasm.ConditionalBindings();
|
||||
x.free();
|
||||
};
|
||||
|
@ -22,6 +22,7 @@ extern "C" {
|
||||
fn js_js_rename();
|
||||
fn js_access_fields();
|
||||
fn js_renamed_export();
|
||||
fn js_conditional_bindings();
|
||||
}
|
||||
|
||||
#[wasm_bindgen_test]
|
||||
@ -402,3 +403,19 @@ impl RenamedExport {
|
||||
fn renamed_export() {
|
||||
js_renamed_export();
|
||||
}
|
||||
|
||||
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
|
||||
pub struct ConditionalBindings {
|
||||
}
|
||||
|
||||
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
|
||||
impl ConditionalBindings {
|
||||
#[cfg_attr(target_arch = "wasm32", wasm_bindgen(constructor))]
|
||||
pub fn new() -> ConditionalBindings {
|
||||
ConditionalBindings {}
|
||||
}
|
||||
}
|
||||
#[wasm_bindgen_test]
|
||||
fn conditional_bindings() {
|
||||
js_conditional_bindings();
|
||||
}
|
||||
|
Reference in New Issue
Block a user