@@ -9,32 +9,27 @@ extern crate syn;
9
9
10
10
use std:: ascii:: AsciiExt ;
11
11
12
- /// Find a `#[cssparser__assert_ascii_lowercase__data(string = "…", string = "…")]` attribute,
13
- /// and panic if any string contains ASCII uppercase letters.
14
- #[ proc_macro_derive( cssparser__assert_ascii_lowercase,
15
- attributes( cssparser__assert_ascii_lowercase__data) ) ]
12
+ /// Panic if any string contains ASCII uppercase letters.
13
+ #[ proc_macro_derive( cssparser__assert_ascii_lowercase) ]
16
14
pub fn assert_ascii_lowercase ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
17
15
let input = syn:: parse_macro_input ( & input. to_string ( ) ) . unwrap ( ) ;
18
- let data = list_attr ( & input, "cssparser__assert_ascii_lowercase__data" ) ;
19
16
20
- for sub_attr in data {
21
- let string = sub_attr_value ( sub_attr , "string" ) ;
17
+ for token in find_smuggled_tokens ( & input ) {
18
+ let string = string_literal ( token ) ;
22
19
assert_eq ! ( * string, string. to_ascii_lowercase( ) ,
23
- "the expected strings must be given in ASCII lowercase" ) ;
20
+ "the string patterns must be given in ASCII lowercase" ) ;
24
21
}
25
22
26
23
"" . parse ( ) . unwrap ( )
27
24
}
28
25
29
- /// Find a `#[cssparser__max_len__data(string = "…", string = "…")]` attribute,
30
26
/// and emit a `MAX_LENGTH` constant with the length of the longest string.
31
- #[ proc_macro_derive( cssparser__max_len,
32
- attributes( cssparser__max_len__data) ) ]
27
+ #[ proc_macro_derive( cssparser__max_len) ]
33
28
pub fn max_len ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
34
29
let input = syn:: parse_macro_input ( & input. to_string ( ) ) . unwrap ( ) ;
35
- let data = list_attr ( & input, "cssparser__max_len__data" ) ;
36
30
37
- let lengths = data. iter ( ) . map ( |sub_attr| sub_attr_value ( sub_attr, "string" ) . len ( ) ) ;
31
+ let token_trees = find_smuggled_tokens ( & input) ;
32
+ let lengths = token_trees. iter ( ) . map ( |tt| string_literal ( tt) . len ( ) ) ;
38
33
let max_length = lengths. max ( ) . expect ( "expected at least one string" ) ;
39
34
40
35
let tokens = quote ! {
@@ -55,13 +50,11 @@ pub fn max_len(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
55
50
pub fn phf_map ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
56
51
let input = syn:: parse_macro_input ( & input. to_string ( ) ) . unwrap ( ) ;
57
52
let name = & input. ident ;
53
+
58
54
let token_trees = find_smuggled_tokens ( & input) ;
59
55
let value_type = & token_trees[ 0 ] ;
60
56
let pairs: Vec < _ > = token_trees[ 1 ..] . chunks ( 2 ) . map ( |chunk| {
61
- let key = match chunk[ 0 ] {
62
- syn:: TokenTree :: Token ( syn:: Token :: Literal ( syn:: Lit :: Str ( ref string, _) ) ) => string,
63
- _ => panic ! ( "expected string literal, got {:?}" , chunk[ 0 ] )
64
- } ;
57
+ let key = string_literal ( & chunk[ 0 ] ) ;
65
58
let value = & chunk[ 1 ] ;
66
59
( key. to_ascii_lowercase ( ) , quote ! ( #value) . to_string ( ) )
67
60
} ) . collect ( ) ;
@@ -125,33 +118,9 @@ fn find_smuggled_tokens(input: &syn::DeriveInput) -> &[syn::TokenTree] {
125
118
}
126
119
}
127
120
128
- /// Panic if the first attribute isn’t `#[foo(…)]` with the given name,
129
- /// or return the parameters.
130
- fn list_attr < ' a > ( input : & ' a syn:: DeriveInput , expected_name : & str ) -> & ' a [ syn:: NestedMetaItem ] {
131
- for attr in & input. attrs {
132
- match attr. value {
133
- syn:: MetaItem :: List ( ref name, ref nested) if name == expected_name => {
134
- return nested
135
- }
136
- _ => { }
137
- }
138
- }
139
- panic ! ( "expected a {} attribute" , expected_name)
140
- }
141
-
142
- /// Panic if `sub_attr` is not a name-value like `foo = "…"` with the given name,
143
- /// or return the value.
144
- fn sub_attr_value < ' a > ( sub_attr : & ' a syn:: NestedMetaItem , expected_name : & str ) -> & ' a str {
145
- match * sub_attr {
146
- syn:: NestedMetaItem :: MetaItem (
147
- syn:: MetaItem :: NameValue ( ref name, syn:: Lit :: Str ( ref value, _) )
148
- )
149
- if name == expected_name => {
150
- value
151
- }
152
- _ => {
153
- panic ! ( "expected a `{} = \" …\" ` parameter to the attribute, got {:?}" ,
154
- expected_name, sub_attr)
155
- }
121
+ fn string_literal ( token : & syn:: TokenTree ) -> & str {
122
+ match * token {
123
+ syn:: TokenTree :: Token ( syn:: Token :: Literal ( syn:: Lit :: Str ( ref string, _) ) ) => string,
124
+ _ => panic ! ( "expected string literal, got {:?}" , token)
156
125
}
157
126
}
0 commit comments