diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-12-31 03:46:22 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-31 03:46:22 -0600 |
commit | 4ba795081cd1efa42ce03c996d574cfe96f68ece (patch) | |
tree | 573117806f6ca3e8e53106dd88de1d15cc82a6f3 | |
parent | ebff37b80720447044cc38553558e8339512144f (diff) | |
parent | 537fda543e4c8f6512ede65369e8a29dc753686b (diff) | |
download | servo-4ba795081cd1efa42ce03c996d574cfe96f68ece.tar.gz servo-4ba795081cd1efa42ce03c996d574cfe96f68ece.zip |
Auto merge of #19665 - emilio:derive-parse-alias, r=Manishearth
style_derive: Support parse-time aliases.
This will allow #19659 to use derive on display using:
#[parse(aliases = "-webkit-flex")]
Flex,
#[parse(aliases = "-webkit-inline-flex")]
InlineFlex,
And such.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/19665)
<!-- Reviewable:end -->
-rw-r--r-- | components/style_derive/lib.rs | 2 | ||||
-rw-r--r-- | components/style_derive/parse.rs | 22 |
2 files changed, 23 insertions, 1 deletions
diff --git a/components/style_derive/lib.rs b/components/style_derive/lib.rs index cbe33a3d199..a9a8a32dbf7 100644 --- a/components/style_derive/lib.rs +++ b/components/style_derive/lib.rs @@ -39,7 +39,7 @@ pub fn derive_to_animated_value(stream: TokenStream) -> TokenStream { to_animated_value::derive(input).to_string().parse().unwrap() } -#[proc_macro_derive(Parse)] +#[proc_macro_derive(Parse, attributes(parse))] pub fn derive_parse(stream: TokenStream) -> TokenStream { let input = syn::parse_derive_input(&stream.to_string()).unwrap(); parse::derive(input).to_string().parse().unwrap() diff --git a/components/style_derive/parse.rs b/components/style_derive/parse.rs index 41fc74bb733..cac626749bd 100644 --- a/components/style_derive/parse.rs +++ b/components/style_derive/parse.rs @@ -19,11 +19,25 @@ pub fn derive(input: DeriveInput) -> Tokens { "Parse is only supported for single-variant enums for now" ); + let variant_attrs = cg::parse_variant_attrs::<ParseVariantAttrs>(variant); let identifier = cg::to_css_identifier(variant.ident.as_ref()); let ident = &variant.ident; + match_body = quote! { #match_body #identifier => Ok(#name::#ident), + }; + + let aliases = match variant_attrs.aliases { + Some(aliases) => aliases, + None => return, + }; + + for alias in aliases.split(",") { + match_body = quote! { + #match_body + #alias => Ok(#name::#ident), + }; } }); @@ -73,3 +87,11 @@ pub fn derive(input: DeriveInput) -> Tokens { #methods_impl } } + +#[darling(attributes(parse), default)] +#[derive(Default, FromVariant)] +struct ParseVariantAttrs { + /// The comma-separated list of aliases this variant should be aliased to at + /// parse time. + aliases: Option<String>, +} |