Skip to content

Commit 2b12828

Browse files
authored
Add ability to rename enums (js_name = new_name) (#2071)
* Add ability to rename enums (js_name = new_name) * Add a test
1 parent b9f78ab commit 2b12828

File tree

6 files changed

+29
-5
lines changed

6 files changed

+29
-5
lines changed

crates/backend/src/ast.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ pub struct StructField {
251251
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
252252
#[derive(Clone)]
253253
pub struct Enum {
254-
pub name: Ident,
254+
pub rust_name: Ident,
255+
pub js_name: String,
255256
pub variants: Vec<Variant>,
256257
pub comments: Vec<String>,
257258
pub hole: u32,

crates/backend/src/codegen.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1113,7 +1113,7 @@ impl<'a> ToTokens for DescribeImport<'a> {
11131113

11141114
impl ToTokens for ast::Enum {
11151115
fn to_tokens(&self, into: &mut TokenStream) {
1116-
let enum_name = &self.name;
1116+
let enum_name = &self.rust_name;
11171117
let hole = &self.hole;
11181118
let cast_clauses = self.variants.iter().map(|variant| {
11191119
let variant_name = &variant.name;

crates/backend/src/encode.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ fn shared_function<'a>(func: &'a ast::Function, _intern: &'a Interner) -> Functi
212212

213213
fn shared_enum<'a>(e: &'a ast::Enum, intern: &'a Interner) -> Enum<'a> {
214214
Enum {
215-
name: intern.intern(&e.name),
215+
name: &e.js_name,
216216
variants: e
217217
.variants
218218
.iter()

crates/macro-support/src/parser.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,7 +1058,6 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
10581058
bail_span!(self, "cannot export empty enums to JS");
10591059
}
10601060
let generate_typescript = opts.skip_typescript().is_none();
1061-
opts.check_used()?;
10621061

10631062
// Check if the first value is a string literal
10641063
match self.variants[0].discriminant {
@@ -1069,10 +1068,16 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
10691068
lit: syn::Lit::Str(_),
10701069
}),
10711070
)) => {
1071+
opts.check_used()?;
10721072
return import_enum(self, program);
10731073
}
10741074
_ => {}
10751075
}
1076+
let js_name = opts
1077+
.js_name()
1078+
.map(|s| s.0)
1079+
.map_or_else(|| self.ident.to_string(), |s| s.to_string());
1080+
opts.check_used()?;
10761081

10771082
let has_discriminant = self.variants[0].discriminant.is_some();
10781083

@@ -1155,7 +1160,8 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
11551160
self.to_tokens(tokens);
11561161

11571162
program.enums.push(ast::Enum {
1158-
name: self.ident,
1163+
rust_name: self.ident,
1164+
js_name,
11591165
variants,
11601166
comments,
11611167
hole,

tests/wasm/enums.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,7 @@ exports.js_expect_enum = (a, b) => {
2828
exports.js_expect_enum_none = a => {
2929
assert.strictEqual(a, undefined);
3030
};
31+
32+
exports.js_renamed_enum = b => {
33+
assert.strictEqual(wasm.JsRenamedEnum.B, b);
34+
};

tests/wasm/enums.rs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ extern "C" {
99
fn js_handle_optional_enums(x: Option<Color>) -> Option<Color>;
1010
fn js_expect_enum(x: Color, y: Option<Color>);
1111
fn js_expect_enum_none(x: Option<Color>);
12+
fn js_renamed_enum(b: RenamedEnum);
1213
}
1314

1415
#[wasm_bindgen]
@@ -30,6 +31,13 @@ pub mod inner {
3031
}
3132
}
3233

34+
#[wasm_bindgen(js_name = JsRenamedEnum)]
35+
#[derive(Copy, Clone)]
36+
pub enum RenamedEnum {
37+
A = 10,
38+
B = 20,
39+
}
40+
3341
#[wasm_bindgen]
3442
pub fn enum_cycle(color: Color) -> Color {
3543
match color {
@@ -82,3 +90,8 @@ fn test_optional_enum_values() {
8290
js_expect_enum(Red, Some(Red));
8391
js_expect_enum_none(None);
8492
}
93+
94+
#[wasm_bindgen_test]
95+
fn test_renamed_enum() {
96+
js_renamed_enum(RenamedEnum::B);
97+
}

0 commit comments

Comments
 (0)