Skip to content

Commit

Permalink
Remove span in generated field getter (#3725)
Browse files Browse the repository at this point in the history
  • Loading branch information
Liamolucko committed Nov 29, 2023
1 parent 4fea53b commit def9147
Show file tree
Hide file tree
Showing 4 changed files with 45 additions and 1 deletion.
5 changes: 5 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,11 @@
* Add bindings for `UserActivation`.
[#3719](https://github.com/rustwasm/wasm-bindgen/pull/3719)

### Fixed

* Fixed a compiler error when using `#[wasm_bindgen]` inside `macro_rules!`.
[#3725](https://github.com/rustwasm/wasm-bindgen/pull/3725)

### Removed

* Removed Gecko-only `InstallTriggerData` and Gecko-internal `FlexLineGrowthState`, `GridDeclaration`, `GridTrackState`,
Expand Down
9 changes: 8 additions & 1 deletion crates/backend/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -389,7 +389,14 @@ impl ToTokens for ast::StructField {
};
let maybe_assert_copy = respan(maybe_assert_copy, ty);

let mut val = quote_spanned!(self.rust_name.span()=> (*js).borrow().#rust_name);
// Split this out so that it isn't affected by `quote_spanned!`.
//
// If we don't do this, it might end up being unable to reference `js`
// properly because it doesn't have the same span.
//
// See https://github.com/rustwasm/wasm-bindgen/pull/3725.
let js_token = quote! { js };
let mut val = quote_spanned!(self.rust_name.span()=> (*#js_token).borrow().#rust_name);
if let Some(span) = self.getter_with_clone {
val = quote_spanned!(span=> <#ty as Clone>::clone(&#val) );
}
Expand Down
7 changes: 7 additions & 0 deletions tests/wasm/classes.js
Original file line number Diff line number Diff line change
Expand Up @@ -241,3 +241,10 @@ exports.js_test_inspectable_classes_can_override_generated_methods = () => {
assert.strictEqual(overridden_inspectable.toString(), 'string was overwritten');
overridden_inspectable.free();
};

exports.js_test_class_defined_in_macro = () => {
const macroClass = new wasm.InsideMacro();
assert.strictEqual(macroClass.a, 3);
macroClass.a = 5;
assert.strictEqual(macroClass.a, 5);
};
25 changes: 25 additions & 0 deletions tests/wasm/classes.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ extern "C" {
fn js_test_option_classes();
fn js_test_inspectable_classes();
fn js_test_inspectable_classes_can_override_generated_methods();
fn js_test_class_defined_in_macro();
}

#[wasm_bindgen_test]
Expand Down Expand Up @@ -608,3 +609,27 @@ impl OverriddenInspectable {
String::from("string was overwritten")
}
}

macro_rules! make_struct {
($field:ident) => {
#[wasm_bindgen]
pub struct InsideMacro {
pub $field: u32,
}
};
}

make_struct!(a);

#[wasm_bindgen]
impl InsideMacro {
#[wasm_bindgen(constructor)]
pub fn new() -> Self {
Self { a: 3 }
}
}

#[wasm_bindgen_test]
fn class_defined_in_macro() {
js_test_class_defined_in_macro();
}

0 comments on commit def9147

Please sign in to comment.