@@ -17,6 +17,7 @@ pub(crate) fn tokenize<'a>(
1717) -> Vec < Token < ' a > > {
1818 let mut tokens: Vec < Token > = Vec :: new ( ) ;
1919
20+ let mut last_non_whitespace_token = None ;
2021 let mut last_reserved_token = None ;
2122 let mut last_reserved_top_level_token = None ;
2223
@@ -27,7 +28,7 @@ pub(crate) fn tokenize<'a>(
2728 // Keep processing the string until it is empty
2829 while let Ok ( mut result) = get_next_token (
2930 & mut input,
30- tokens . last ( ) . cloned ( ) ,
31+ last_non_whitespace_token . clone ( ) ,
3132 last_reserved_token. clone ( ) ,
3233 last_reserved_top_level_token. clone ( ) ,
3334 named_placeholders,
@@ -49,6 +50,10 @@ pub(crate) fn tokenize<'a>(
4950 _ => { }
5051 }
5152
53+ if result. kind != TokenKind :: Whitespace {
54+ last_non_whitespace_token = Some ( result. clone ( ) ) ;
55+ }
56+
5257 tokens. push ( result) ;
5358
5459 if let Ok ( Some ( result) ) = opt ( get_whitespace_token) . parse_next ( & mut input) {
@@ -68,7 +73,7 @@ pub(crate) struct Token<'a> {
6873
6974#[ derive( Debug , Clone , Copy , PartialEq , Eq ) ]
7075pub ( crate ) enum TokenKind {
71- DoubleColon ,
76+ TypeSpecifier ,
7277 Whitespace ,
7378 String ,
7479 Reserved ,
@@ -119,6 +124,7 @@ fn get_next_token<'a>(
119124) -> Result < Token < ' a > > {
120125 alt ( (
121126 get_comment_token,
127+ |input : & mut _ | get_type_specifier_token ( input, previous_token. clone ( ) ) ,
122128 get_string_token,
123129 get_open_paren_token,
124130 get_close_paren_token,
@@ -131,20 +137,36 @@ fn get_next_token<'a>(
131137 last_reserved_top_level_token. clone ( ) ,
132138 )
133139 } ,
134- get_double_colon_token,
135140 get_operator_token,
136141 |input : & mut _ | get_placeholder_token ( input, named_placeholders) ,
137142 get_word_token,
138143 get_any_other_char,
139144 ) )
140145 . parse_next ( input)
141146}
142- fn get_double_colon_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
143- "::" . parse_next ( input) . map ( |token| Token {
144- kind : TokenKind :: DoubleColon ,
145- value : token,
146- key : None ,
147- } )
147+ fn get_type_specifier_token < ' i > (
148+ input : & mut & ' i str ,
149+ previous_token : Option < Token < ' i > > ,
150+ ) -> Result < Token < ' i > > {
151+ if previous_token. is_some_and ( |token| {
152+ ![
153+ TokenKind :: CloseParen ,
154+ TokenKind :: Placeholder ,
155+ TokenKind :: Reserved ,
156+ TokenKind :: String ,
157+ TokenKind :: TypeSpecifier ,
158+ TokenKind :: Word ,
159+ ]
160+ . contains ( & token. kind )
161+ } ) {
162+ fail. parse_next ( input)
163+ } else {
164+ alt ( ( "::" , "[]" ) ) . parse_next ( input) . map ( |token| Token {
165+ kind : TokenKind :: TypeSpecifier ,
166+ value : token,
167+ key : None ,
168+ } )
169+ }
148170}
149171fn get_whitespace_token < ' i > ( input : & mut & ' i str ) -> Result < Token < ' i > > {
150172 take_while ( 1 .., char:: is_whitespace)
0 commit comments