Skip to content

Commit eb0ff9b

Browse files
authored
Add support for renaming a struct field with js_name (#2360)
* Add support for renaming a field on the JS side using js_name * Fix cargo fmt
1 parent 316c5a7 commit eb0ff9b

File tree

6 files changed

+46
-13
lines changed

6 files changed

+46
-13
lines changed

crates/backend/src/ast.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -238,7 +238,8 @@ pub struct Struct {
238238
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
239239
#[derive(Clone)]
240240
pub struct StructField {
241-
pub name: syn::Member,
241+
pub rust_name: syn::Member,
242+
pub js_name: String,
242243
pub struct_name: Ident,
243244
pub readonly: bool,
244245
pub ty: syn::Type,

crates/backend/src/codegen.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ impl ToTokens for ast::Struct {
264264

265265
impl ToTokens for ast::StructField {
266266
fn to_tokens(&self, tokens: &mut TokenStream) {
267-
let name = &self.name;
267+
let rust_name = &self.rust_name;
268268
let struct_name = &self.struct_name;
269269
let ty = &self.ty;
270270
let getter = &self.getter;
@@ -287,7 +287,7 @@ impl ToTokens for ast::StructField {
287287

288288
let js = js as *mut WasmRefCell<#struct_name>;
289289
assert_not_null(js);
290-
let val = (*js).borrow().#name;
290+
let val = (*js).borrow().#rust_name;
291291
<#ty as IntoWasmAbi>::into_abi(val)
292292
}
293293
})
@@ -321,7 +321,7 @@ impl ToTokens for ast::StructField {
321321
let js = js as *mut WasmRefCell<#struct_name>;
322322
assert_not_null(js);
323323
let val = <#ty as FromWasmAbi>::from_abi(val);
324-
(*js).borrow_mut().#name = val;
324+
(*js).borrow_mut().#rust_name = val;
325325
}
326326
})
327327
.to_tokens(tokens);

crates/backend/src/encode.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,9 @@ fn shared_struct<'a>(s: &'a ast::Struct, intern: &'a Interner) -> Struct<'a> {
314314
}
315315
}
316316

317-
fn shared_struct_field<'a>(s: &'a ast::StructField, intern: &'a Interner) -> StructField<'a> {
317+
fn shared_struct_field<'a>(s: &'a ast::StructField, _intern: &'a Interner) -> StructField<'a> {
318318
StructField {
319-
name: match &s.name {
320-
syn::Member::Named(ident) => intern.intern(ident),
321-
syn::Member::Unnamed(index) => intern.intern_str(&index.index.to_string()),
322-
},
319+
name: &s.js_name,
323320
readonly: s.readonly,
324321
comments: s.comments.iter().map(|s| &**s).collect(),
325322
generate_typescript: s.generate_typescript,

crates/macro-support/src/parser.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,7 @@ impl<'a> ConvertToAst<BindgenAttrs> for &'a mut syn::ItemStruct {
380380
syn::Visibility::Public(..) => {}
381381
_ => continue,
382382
}
383-
let (name_str, member) = match &field.ident {
383+
let (js_field_name, member) = match &field.ident {
384384
Some(ident) => (ident.to_string(), syn::Member::Named(ident.clone())),
385385
None => (i.to_string(), syn::Member::Unnamed(i.into())),
386386
};
@@ -392,12 +392,18 @@ impl<'a> ConvertToAst<BindgenAttrs> for &'a mut syn::ItemStruct {
392392
continue;
393393
}
394394

395+
let js_field_name = match attrs.js_name() {
396+
Some((name, _)) => name.to_string(),
397+
None => js_field_name,
398+
};
399+
395400
let comments = extract_doc_comments(&field.attrs);
396-
let getter = shared::struct_field_get(&js_name, &name_str);
397-
let setter = shared::struct_field_set(&js_name, &name_str);
401+
let getter = shared::struct_field_get(&js_name, &js_field_name);
402+
let setter = shared::struct_field_set(&js_name, &js_field_name);
398403

399404
fields.push(ast::StructField {
400-
name: member,
405+
rust_name: member,
406+
js_name: js_field_name,
401407
struct_name: self.ident.clone(),
402408
readonly: attrs.readonly().is_some(),
403409
ty: field.ty.clone(),

tests/wasm/classes.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,13 @@ exports.js_renamed_export = () => {
147147
x.bar(x);
148148
};
149149

150+
exports.js_renamed_field = () => {
151+
const x = new wasm.RenamedField();
152+
assert.ok(x.bar === 3);
153+
154+
x.foo();
155+
}
156+
150157
exports.js_conditional_bindings = () => {
151158
const x = new wasm.ConditionalBindings();
152159
x.free();

tests/wasm/classes.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ extern "C" {
2222
fn js_js_rename();
2323
fn js_access_fields();
2424
fn js_renamed_export();
25+
fn js_renamed_field();
2526
fn js_conditional_bindings();
2627

2728
fn js_assert_none(a: Option<OptionClass>);
@@ -426,6 +427,27 @@ fn renamed_export() {
426427
js_renamed_export();
427428
}
428429

430+
#[wasm_bindgen]
431+
pub struct RenamedField {
432+
#[wasm_bindgen(js_name = bar)]
433+
pub foo: u32,
434+
}
435+
436+
#[wasm_bindgen(js_class = RenamedField)]
437+
impl RenamedField {
438+
#[wasm_bindgen(constructor)]
439+
pub fn new() -> RenamedField {
440+
RenamedField { foo: 3 }
441+
}
442+
443+
pub fn foo(&self) {}
444+
}
445+
446+
#[wasm_bindgen_test]
447+
fn renamed_field() {
448+
js_renamed_field();
449+
}
450+
429451
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
430452
pub struct ConditionalBindings {}
431453

0 commit comments

Comments
 (0)