@@ -9,21 +9,33 @@ extern crate syn;
9
9
10
10
use std:: ascii:: AsciiExt ;
11
11
12
- /// Find a `#[cssparser__match_ignore_ascii_case__data(string = "…", string = "…")]` attribute,
13
- /// panic if any string contains ASCII uppercase letters,
14
- /// emit a `MAX_LENGTH` constant with the length of the longest string.
15
- #[ proc_macro_derive( cssparser__match_ignore_ascii_case__max_len,
16
- attributes( cssparser__match_ignore_ascii_case__data) ) ]
17
- pub fn max_len ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
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) ) ]
16
+ pub fn assert_ascii_lowercase ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
18
17
let input = syn:: parse_macro_input ( & input. to_string ( ) ) . unwrap ( ) ;
19
- let data = list_attr ( & input, "cssparser__match_ignore_ascii_case__data " ) ;
18
+ let data = list_attr ( & input, "cssparser__assert_ascii_lowercase__data " ) ;
20
19
21
- let lengths = data. iter ( ) . map ( |sub_attr| {
20
+ for sub_attr in data {
22
21
let string = sub_attr_value ( sub_attr, "string" ) ;
23
22
assert_eq ! ( * string, string. to_ascii_lowercase( ) ,
24
23
"the expected strings must be given in ASCII lowercase" ) ;
25
- string. len ( )
26
- } ) ;
24
+ }
25
+
26
+ "" . parse ( ) . unwrap ( )
27
+ }
28
+
29
+ /// Find a `#[cssparser__max_len__data(string = "…", string = "…")]` attribute,
30
+ /// panic if any string contains ASCII uppercase letters,
31
+ /// emit a `MAX_LENGTH` constant with the length of the longest string.
32
+ #[ proc_macro_derive( cssparser__max_len,
33
+ attributes( cssparser__max_len__data) ) ]
34
+ pub fn max_len ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
35
+ let input = syn:: parse_macro_input ( & input. to_string ( ) ) . unwrap ( ) ;
36
+ let data = list_attr ( & input, "cssparser__max_len__data" ) ;
37
+
38
+ let lengths = data. iter ( ) . map ( |sub_attr| sub_attr_value ( sub_attr, "string" ) . len ( ) ) ;
27
39
let max_length = lengths. max ( ) . expect ( "expected at least one string" ) ;
28
40
29
41
let tokens = quote ! {
@@ -37,6 +49,7 @@ pub fn max_len(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
37
49
/// `fn map() -> &'static ::phf::Map<&'static str, $ValueType>`.
38
50
/// The map’s content is given as:
39
51
/// `#[cssparser__phf_map__kv_pairs(key = "…", value = "…", key = "…", value = "…")]`.
52
+ /// Keys are ASCII-lowercased.
40
53
#[ proc_macro_derive( cssparser__phf_map,
41
54
attributes( cssparser__phf_map__kv_pairs) ) ]
42
55
pub fn phf_map ( input : proc_macro:: TokenStream ) -> proc_macro:: TokenStream {
@@ -49,13 +62,15 @@ pub fn phf_map(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
49
62
_ => panic ! ( "expected tuple struct newtype, got {:?}" , input. body)
50
63
} ;
51
64
52
- let kv_pairs = list_attr ( & input, "cssparser__phf_map__kv_pairs" ) ;
53
-
54
- let mut map = phf_codegen:: Map :: new ( ) ;
55
- for chunk in kv_pairs. chunks ( 2 ) {
65
+ let pairs: Vec < _ > = list_attr ( & input, "cssparser__phf_map__kv_pairs" ) . chunks ( 2 ) . map ( |chunk| {
56
66
let key = sub_attr_value ( & chunk[ 0 ] , "key" ) ;
57
67
let value = sub_attr_value ( & chunk[ 1 ] , "value" ) ;
58
- map. entry ( key, value) ;
68
+ ( key. to_ascii_lowercase ( ) , value)
69
+ } ) . collect ( ) ;
70
+
71
+ let mut map = phf_codegen:: Map :: new ( ) ;
72
+ for & ( ref key, value) in & pairs {
73
+ map. entry ( & * * key, value) ;
59
74
}
60
75
61
76
let mut initializer_bytes = Vec :: < u8 > :: new ( ) ;
0 commit comments