Skip to content

Commit b9f78ab

Browse files
authored
try to fix js_name error when both getter and setter used (#2074)
* try to fix js_name error when both `getter` and `setter` used * add tests
1 parent 301a5f3 commit b9f78ab

File tree

4 files changed

+195
-7
lines changed

4 files changed

+195
-7
lines changed

crates/backend/src/ast.rs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -330,12 +330,6 @@ impl Function {
330330
pub fn infer_setter_property(&self) -> Result<String, Diagnostic> {
331331
let name = self.name.to_string();
332332

333-
// if `#[wasm_bindgen(js_name = "...")]` is used then that explicitly
334-
// because it was hand-written anyway.
335-
if self.renamed_via_js_name {
336-
return Ok(name);
337-
}
338-
339333
// Otherwise we infer names based on the Rust function name.
340334
if !name.starts_with("set_") {
341335
bail_span!(

crates/macro-support/src/parser.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::cell::Cell;
22

3+
use ast::OperationKind;
34
use backend::ast;
45
use backend::util::{ident_ty, ShortHash};
56
use backend::Diagnostic;
@@ -710,7 +711,16 @@ fn function_from_decl(
710711

711712
let (name, name_span, renamed_via_js_name) =
712713
if let Some((js_name, js_name_span)) = opts.js_name() {
713-
(js_name.to_string(), js_name_span, true)
714+
let kind = operation_kind(&opts);
715+
let prefix = match kind {
716+
OperationKind::Setter(_) => "set_",
717+
_ => "",
718+
};
719+
(
720+
format!("{}{}", prefix, js_name.to_string()),
721+
js_name_span,
722+
true,
723+
)
714724
} else {
715725
(decl_name.to_string(), decl_name.span(), false)
716726
};

tests/wasm/getters_and_setters.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,48 @@ exports._7_js = (rules) => {
4949
return rules;
5050
}
5151

52+
exports._8_js = (rules) => {
53+
let value = rules.new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name;
54+
assert.equal(value, 8);
55+
rules.new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name = value * 2;
56+
return rules;
57+
}
58+
59+
exports._9_js = (rules) => {
60+
let value = rules.new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name;
61+
assert.equal(value, 9);
62+
rules.new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name = value * 2;
63+
return rules;
64+
}
65+
66+
exports._10_js = (rules) => {
67+
let value = rules.new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name;
68+
assert.equal(value, 10);
69+
rules.new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name = value * 2;
70+
return rules;
71+
}
72+
73+
exports._11_js = (rules) => {
74+
let value = rules.new_js_name__getter_with_name__no_getter_without_name_for_field__same_getter_setter_name;
75+
assert.equal(value, 11);
76+
rules.new_js_name__setter_with_name__no_setter_without_name_for_field__same_getter_setter_name = value * 2;
77+
return rules;
78+
}
79+
80+
exports._12_js = (rules) => {
81+
let value = rules.new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name;
82+
assert.equal(value, 12);
83+
rules.new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name = value * 2;
84+
return rules;
85+
}
86+
87+
exports._13_js = (rules) => {
88+
let value = rules.new_js_name__getter_with_name__no_getter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name;
89+
assert.equal(value, 13);
90+
rules.new_js_name__setter_with_name__no_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name = value * 2;
91+
return rules;
92+
}
93+
5294
exports.test_getter_compute = x => {
5395
assert.equal(x.foo, 3)
5496
};

tests/wasm/getters_and_setters.rs

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,12 @@ extern "C" {
1212
fn _5_js(rules: Rules) -> Rules;
1313
fn _6_js(rules: Rules) -> Rules;
1414
fn _7_js(rules: Rules) -> Rules;
15+
fn _8_js(rules: Rules) -> Rules;
16+
fn _9_js(rules: Rules) -> Rules;
17+
fn _10_js(rules: Rules) -> Rules;
18+
fn _11_js(rules: Rules) -> Rules;
19+
fn _12_js(rules: Rules) -> Rules;
20+
fn _13_js(rules: Rules) -> Rules;
1521

1622
fn test_getter_compute(x: GetterCompute);
1723
fn test_setter_compute(x: SetterCompute);
@@ -86,6 +92,106 @@ impl Rules {
8692
pub fn set_js_name__setter_with_name__no_setter_without_name_for_field(&mut self, field: i32) {
8793
self.field = field;
8894
}
95+
96+
#[wasm_bindgen(getter, js_name = new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name)]
97+
pub fn js_name__no_getter_with_name__getter_without_name__same_getter_setter_name(
98+
&self,
99+
) -> i32 {
100+
self.field
101+
}
102+
#[wasm_bindgen(js_name = new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name, setter)]
103+
pub fn set_js_name__no_setter_with_name__setter_without_name__same_getter_setter_name(
104+
&mut self,
105+
field: i32,
106+
) {
107+
self.field = field;
108+
}
109+
110+
#[wasm_bindgen(getter, js_name = new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name)]
111+
pub fn js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name(
112+
&self,
113+
) -> i32 {
114+
self.field
115+
}
116+
#[wasm_bindgen(js_name = new_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name, setter)]
117+
pub fn set_js_name__no_getter_setter_with_name__getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name(
118+
&mut self,
119+
field: i32,
120+
) {
121+
self.field = field;
122+
}
123+
124+
#[wasm_bindgen(
125+
getter = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name,
126+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name)]
127+
pub fn js_name__getter_with_name__no_getter_without_name__same_getter_setter_name(
128+
&self,
129+
) -> i32 {
130+
self.field
131+
}
132+
#[wasm_bindgen(
133+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name,
134+
setter = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name)]
135+
pub fn set_js_name__setter_with_name__no_setter_without_name__same_getter_setter_name(
136+
&mut self,
137+
field: i32,
138+
) {
139+
self.field = field;
140+
}
141+
142+
#[wasm_bindgen(
143+
getter = new_js_name__getter_with_name__no_getter_without_name_for_field__same_getter_setter_name,
144+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__no_same_field_name)]
145+
pub fn js_name__getter_with_name__no_getter_without_name__same_getter_setter_name__no_same_field_name(
146+
&self,
147+
) -> i32 {
148+
self.field
149+
}
150+
#[wasm_bindgen(
151+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__no_same_field_name,
152+
setter = new_js_name__setter_with_name__no_setter_without_name_for_field__same_getter_setter_name)]
153+
pub fn set_js_name__setter_with_name__no_setter_without_name__same_getter_setter_name__no_same_field_name(
154+
&mut self,
155+
field: i32,
156+
) {
157+
self.field = field;
158+
}
159+
160+
#[wasm_bindgen(
161+
getter = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name,
162+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__same_getter_setter_origin_name)]
163+
pub fn js_name__getter_setter_with_name__no_getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name(
164+
&self,
165+
) -> i32 {
166+
self.field
167+
}
168+
#[wasm_bindgen(
169+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__same_getter_setter_origin_name,
170+
setter = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name)]
171+
pub fn set_js_name__getter_setter_with_name__no_getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name(
172+
&mut self,
173+
field: i32,
174+
) {
175+
self.field = field;
176+
}
177+
178+
#[wasm_bindgen(
179+
getter = new_js_name__getter_with_name__no_getter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name,
180+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__same_getter_setter_origin_name__no_same_field_name)]
181+
pub fn js_name__getter_setter_with_name__no_getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name__no_same_field_name(
182+
&self,
183+
) -> i32 {
184+
self.field
185+
}
186+
#[wasm_bindgen(
187+
js_name = new_js_name__getter_setter_with_name__no_getter_setter_without_name_for_method__same_getter_setter_name__same_getter_setter_origin_name__no_same_field_name,
188+
setter = new_js_name__setter_with_name__no_setter_without_name_for_field__same_getter_setter_name__same_getter_setter_origin_name)]
189+
pub fn set_js_name__getter_setter_with_name__no_getter_setter_without_name__same_getter_setter_name__same_getter_setter_origin_name__no_same_field_name(
190+
&mut self,
191+
field: i32,
192+
) {
193+
self.field = field;
194+
}
89195
}
90196

91197
#[wasm_bindgen_test]
@@ -130,6 +236,42 @@ fn _7_rust() {
130236
assert_eq!(rules.field, 14);
131237
}
132238

239+
#[wasm_bindgen_test]
240+
fn _8_rust() {
241+
let rules = _8_js(Rules { field: 8 });
242+
assert_eq!(rules.field, 16);
243+
}
244+
245+
#[wasm_bindgen_test]
246+
fn _9_rust() {
247+
let rules = _9_js(Rules { field: 9 });
248+
assert_eq!(rules.field, 18);
249+
}
250+
251+
#[wasm_bindgen_test]
252+
fn _10_rust() {
253+
let rules = _10_js(Rules { field: 10 });
254+
assert_eq!(rules.field, 20);
255+
}
256+
257+
#[wasm_bindgen_test]
258+
fn _11_rust() {
259+
let rules = _11_js(Rules { field: 11 });
260+
assert_eq!(rules.field, 22);
261+
}
262+
263+
#[wasm_bindgen_test]
264+
fn _12_rust() {
265+
let rules = _12_js(Rules { field: 12 });
266+
assert_eq!(rules.field, 24);
267+
}
268+
269+
#[wasm_bindgen_test]
270+
fn _13_rust() {
271+
let rules = _13_js(Rules { field: 13 });
272+
assert_eq!(rules.field, 26);
273+
}
274+
133275
#[wasm_bindgen]
134276
struct GetterCompute;
135277

0 commit comments

Comments
 (0)