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:
0xd4d
2020-04-13 16:14:41 +02:00
committed by GitHub
parent b9f78aba57
commit 2b128288c7
6 changed files with 29 additions and 5 deletions

View File

@ -251,7 +251,8 @@ pub struct StructField {
#[cfg_attr(feature = "extra-traits", derive(Debug, PartialEq, Eq))]
#[derive(Clone)]
pub struct Enum {
pub name: Ident,
pub rust_name: Ident,
pub js_name: String,
pub variants: Vec<Variant>,
pub comments: Vec<String>,
pub hole: u32,

View File

@ -1113,7 +1113,7 @@ impl<'a> ToTokens for DescribeImport<'a> {
impl ToTokens for ast::Enum {
fn to_tokens(&self, into: &mut TokenStream) {
let enum_name = &self.name;
let enum_name = &self.rust_name;
let hole = &self.hole;
let cast_clauses = self.variants.iter().map(|variant| {
let variant_name = &variant.name;

View File

@ -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> {
Enum {
name: intern.intern(&e.name),
name: &e.js_name,
variants: e
.variants
.iter()

View File

@ -1058,7 +1058,6 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
bail_span!(self, "cannot export empty enums to JS");
}
let generate_typescript = opts.skip_typescript().is_none();
opts.check_used()?;
// Check if the first value is a string literal
match self.variants[0].discriminant {
@ -1069,10 +1068,16 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
lit: syn::Lit::Str(_),
}),
)) => {
opts.check_used()?;
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();
@ -1155,7 +1160,8 @@ impl<'a> MacroParse<(&'a mut TokenStream, BindgenAttrs)> for syn::ItemEnum {
self.to_tokens(tokens);
program.enums.push(ast::Enum {
name: self.ident,
rust_name: self.ident,
js_name,
variants,
comments,
hole,