aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-12-31 03:46:22 -0600
committerGitHub <noreply@github.com>2017-12-31 03:46:22 -0600
commit4ba795081cd1efa42ce03c996d574cfe96f68ece (patch)
tree573117806f6ca3e8e53106dd88de1d15cc82a6f3
parentebff37b80720447044cc38553558e8339512144f (diff)
parent537fda543e4c8f6512ede65369e8a29dc753686b (diff)
downloadservo-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.rs2
-rw-r--r--components/style_derive/parse.rs22
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>,
+}