@@ -155,6 +155,60 @@ impl<'a> TtIter<'a> {
155155 ok
156156 }
157157
158+ pub ( crate ) fn expect_tt ( & mut self ) -> Result < tt:: TokenTree , ( ) > {
159+ let tt = self . next ( ) . ok_or_else ( || ( ) ) ?. clone ( ) ;
160+ let punct = match tt {
161+ tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( punct) ) if punct. spacing == tt:: Spacing :: Joint => {
162+ punct
163+ }
164+ _ => return Ok ( tt) ,
165+ } ;
166+
167+ let ( second, third) = match ( self . peek_n ( 0 ) , self . peek_n ( 1 ) ) {
168+ (
169+ Some ( tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( p2) ) ) ,
170+ Some ( tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( p3) ) ) ,
171+ ) if p2. spacing == tt:: Spacing :: Joint => ( p2. char , Some ( p3. char ) ) ,
172+ ( Some ( tt:: TokenTree :: Leaf ( tt:: Leaf :: Punct ( p2) ) ) , _) => ( p2. char , None ) ,
173+ _ => return Ok ( tt) ,
174+ } ;
175+
176+ match ( punct. char , second, third) {
177+ ( '.' , '.' , Some ( '.' ) )
178+ | ( '.' , '.' , Some ( '=' ) )
179+ | ( '<' , '<' , Some ( '=' ) )
180+ | ( '>' , '>' , Some ( '=' ) ) => {
181+ let tt2 = self . next ( ) . unwrap ( ) . clone ( ) ;
182+ let tt3 = self . next ( ) . unwrap ( ) . clone ( ) ;
183+ Ok ( tt:: Subtree { delimiter : None , token_trees : vec ! [ tt, tt2, tt3] } . into ( ) )
184+ }
185+ ( '-' , '=' , None )
186+ | ( '-' , '>' , None )
187+ | ( ':' , ':' , None )
188+ | ( '!' , '=' , None )
189+ | ( '.' , '.' , None )
190+ | ( '*' , '=' , None )
191+ | ( '/' , '=' , None )
192+ | ( '&' , '&' , None )
193+ | ( '&' , '=' , None )
194+ | ( '%' , '=' , None )
195+ | ( '^' , '=' , None )
196+ | ( '+' , '=' , None )
197+ | ( '<' , '<' , None )
198+ | ( '<' , '=' , None )
199+ | ( '=' , '=' , None )
200+ | ( '=' , '>' , None )
201+ | ( '>' , '=' , None )
202+ | ( '>' , '>' , None )
203+ | ( '|' , '=' , None )
204+ | ( '|' , '|' , None ) => {
205+ let tt2 = self . next ( ) . unwrap ( ) . clone ( ) ;
206+ Ok ( tt:: Subtree { delimiter : None , token_trees : vec ! [ tt. clone( ) , tt2] } . into ( ) )
207+ }
208+ _ => Ok ( tt) ,
209+ }
210+ }
211+
158212 pub ( crate ) fn expect_lifetime ( & mut self ) -> Result < & tt:: Ident , ( ) > {
159213 let ident = self . expect_ident ( ) ?;
160214 // check if it start from "`"
@@ -302,7 +356,7 @@ fn match_meta_var(kind: &str, input: &mut TtIter) -> Result<Option<Fragment>, Ex
302356 let ident = input. expect_ident ( ) . map_err ( |( ) | err ! ( "expected ident" ) ) ?. clone ( ) ;
303357 tt:: Leaf :: from ( ident) . into ( )
304358 }
305- "tt" => input. next ( ) . ok_or_else ( | | err ! ( ) ) ?. clone ( ) ,
359+ "tt" => input. expect_tt ( ) . map_err ( | ( ) | err ! ( ) ) ?. clone ( ) ,
306360 "lifetime" => {
307361 let ident = input. expect_lifetime ( ) . map_err ( |( ) | err ! ( ) ) ?;
308362 tt:: Leaf :: Ident ( ident. clone ( ) ) . into ( )
0 commit comments