mirror of
https://github.com/fluencelabs/wasm-bindgen
synced 2025-04-25 06:02:13 +00:00
Add ability to rename enums (js_name = new_name) (#2071)
* Add ability to rename enums (js_name = new_name) * Add a test
This commit is contained in:
parent
b9f78aba57
commit
2b128288c7
@ -251,7 +251,8 @@ pub struct StructField {
|
|||||||
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
|
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct Enum {
|
pub struct Enum {
|
||||||
pub name: Ident,
|
pub rust_name: Ident,
|
||||||
|
pub js_name: String,
|
||||||
pub variants: Vec<Variant>,
|
pub variants: Vec<Variant>,
|
||||||
pub comments: Vec<String>,
|
pub comments: Vec<String>,
|
||||||
pub hole: u32,
|
pub hole: u32,
|
||||||
|
@ -1113,7 +1113,7 @@ impl<'a> ToTokens for DescribeImport<'a> {
|
|||||||
|
|
||||||
impl ToTokens for ast::Enum {
|
impl ToTokens for ast::Enum {
|
||||||
fn to_tokens(&self, into: &mut TokenStream) {
|
fn to_tokens(&self, into: &mut TokenStream) {
|
||||||
let enum_name = &self.name;
|
let enum_name = &self.rust_name;
|
||||||
let hole = &self.hole;
|
let hole = &self.hole;
|
||||||
let cast_clauses = self.variants.iter().map(|variant| {
|
let cast_clauses = self.variants.iter().map(|variant| {
|
||||||
let variant_name = &variant.name;
|
let variant_name = &variant.name;
|
||||||
|
@ -212,7 +212,7 @@ fn shared_function<'a>(func: &'a ast::Function, _intern: &'a Interner) -> Functi
|
|||||||
|
|
||||||
fn shared_enum<'a>(e: &'a ast::Enum, intern: &'a Interner) -> Enum<'a> {
|
fn shared_enum<'a>(e: &'a ast::Enum, intern: &'a Interner) -> Enum<'a> {
|
||||||
Enum {
|
Enum {
|
||||||
name: intern.intern(&e.name),
|
name: &e.js_name,
|
||||||
variants: e
|
variants: e
|
||||||
.variants
|
.variants
|
||||||
.iter()
|
.iter()
|
||||||
|
@ -1058,7 +1058,6 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
|
|||||||
bail_span!(self, "cannot export empty enums to JS");
|
bail_span!(self, "cannot export empty enums to JS");
|
||||||
}
|
}
|
||||||
let generate_typescript = opts.skip_typescript().is_none();
|
let generate_typescript = opts.skip_typescript().is_none();
|
||||||
opts.check_used()?;
|
|
||||||
|
|
||||||
// Check if the first value is a string literal
|
// Check if the first value is a string literal
|
||||||
match self.variants[0].discriminant {
|
match self.variants[0].discriminant {
|
||||||
@ -1069,10 +1068,16 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
|
|||||||
lit: syn::Lit::Str(_),
|
lit: syn::Lit::Str(_),
|
||||||
}),
|
}),
|
||||||
)) => {
|
)) => {
|
||||||
|
opts.check_used()?;
|
||||||
return import_enum(self, program);
|
return import_enum(self, program);
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
let js_name = opts
|
||||||
|
.js_name()
|
||||||
|
.map(|s| s.0)
|
||||||
|
.map_or_else(|| self.ident.to_string(), |s| s.to_string());
|
||||||
|
opts.check_used()?;
|
||||||
|
|
||||||
let has_discriminant = self.variants[0].discriminant.is_some();
|
let has_discriminant = self.variants[0].discriminant.is_some();
|
||||||
|
|
||||||
@ -1155,7 +1160,8 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
|
|||||||
self.to_tokens(tokens);
|
self.to_tokens(tokens);
|
||||||
|
|
||||||
program.enums.push(ast::Enum {
|
program.enums.push(ast::Enum {
|
||||||
name: self.ident,
|
rust_name: self.ident,
|
||||||
|
js_name,
|
||||||
variants,
|
variants,
|
||||||
comments,
|
comments,
|
||||||
hole,
|
hole,
|
||||||
|
@ -28,3 +28,7 @@ exports.js_expect_enum = (a, b) => {
|
|||||||
exports.js_expect_enum_none = a => {
|
exports.js_expect_enum_none = a => {
|
||||||
assert.strictEqual(a, undefined);
|
assert.strictEqual(a, undefined);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
exports.js_renamed_enum = b => {
|
||||||
|
assert.strictEqual(wasm.JsRenamedEnum.B, b);
|
||||||
|
};
|
||||||
|
@ -9,6 +9,7 @@ extern "C" {
|
|||||||
fn js_handle_optional_enums(x: Option<Color>) -> Option<Color>;
|
fn js_handle_optional_enums(x: Option<Color>) -> Option<Color>;
|
||||||
fn js_expect_enum(x: Color, y: Option<Color>);
|
fn js_expect_enum(x: Color, y: Option<Color>);
|
||||||
fn js_expect_enum_none(x: Option<Color>);
|
fn js_expect_enum_none(x: Option<Color>);
|
||||||
|
fn js_renamed_enum(b: RenamedEnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
@ -30,6 +31,13 @@ pub mod inner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen(js_name = JsRenamedEnum)]
|
||||||
|
#[derive(Copy, Clone)]
|
||||||
|
pub enum RenamedEnum {
|
||||||
|
A = 10,
|
||||||
|
B = 20,
|
||||||
|
}
|
||||||
|
|
||||||
#[wasm_bindgen]
|
#[wasm_bindgen]
|
||||||
pub fn enum_cycle(color: Color) -> Color {
|
pub fn enum_cycle(color: Color) -> Color {
|
||||||
match color {
|
match color {
|
||||||
@ -82,3 +90,8 @@ fn test_optional_enum_values() {
|
|||||||
js_expect_enum(Red, Some(Red));
|
js_expect_enum(Red, Some(Red));
|
||||||
js_expect_enum_none(None);
|
js_expect_enum_none(None);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[wasm_bindgen_test]
|
||||||
|
fn test_renamed_enum() {
|
||||||
|
js_renamed_enum(RenamedEnum::B);
|
||||||
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user