@@ -9,21 +9,33 @@ extern crate syn;
99
1010use std:: ascii:: AsciiExt ;
1111
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 {
1817 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 " ) ;
2019
21- let lengths = data. iter ( ) . map ( |sub_attr| {
20+ for sub_attr in data {
2221 let string = sub_attr_value ( sub_attr, "string" ) ;
2322 assert_eq ! ( * string, string. to_ascii_lowercase( ) ,
2423 "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 ( ) ) ;
2739 let max_length = lengths. max ( ) . expect ( "expected at least one string" ) ;
2840
2941 let tokens = quote ! {
@@ -37,6 +49,7 @@ pub fn max_len(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
3749/// `fn map() -> &'static ::phf::Map<&'static str, $ValueType>`.
3850/// The map’s content is given as:
3951/// `#[cssparser__phf_map__kv_pairs(key = "…", value = "…", key = "…", value = "…")]`.
52+ /// Keys are ASCII-lowercased.
4053#[ proc_macro_derive( cssparser__phf_map,
4154 attributes( cssparser__phf_map__kv_pairs) ) ]
4255pub 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 {
4962 _ => panic ! ( "expected tuple struct newtype, got {:?}" , input. body)
5063 } ;
5164
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| {
5666 let key = sub_attr_value ( & chunk[ 0 ] , "key" ) ;
5767 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) ;
5974 }
6075
6176 let mut initializer_bytes = Vec :: < u8 > :: new ( ) ;
0 commit comments