@@ -2,7 +2,10 @@ use proc_macro2::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree};
22use quote:: quote;
33use std:: iter:: Peekable ;
44use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
5- use syn:: Lifetime ;
5+ use syn:: {
6+ Expr , Lifetime , Token ,
7+ parse:: { Parse , ParseStream } ,
8+ } ;
69
710type Tokens = Peekable < proc_macro2:: token_stream:: IntoIter > ;
811type Result < T > = std:: result:: Result < T , syn:: Error > ;
@@ -371,8 +374,11 @@ pub fn parse_trees_top(input: TokenStream) -> Result<TokenStream> {
371374}
372375
373376pub fn parse_tree_at_top ( input : TokenStream ) -> Result < TokenStream > {
374- let mut tokens = input. into_iter ( ) . peekable ( ) ;
375- let source = parse_argument ( & mut tokens, "expected `,` after source node" ) ?;
377+ let LocatedTreeInput {
378+ source,
379+ template,
380+ } = syn:: parse2 ( input) ?;
381+ let mut tokens = template. into_iter ( ) . peekable ( ) ;
376382 let ctx = Ident :: new ( IMPLICIT_CTX , Span :: call_site ( ) ) ;
377383 let node = parse_direct_node ( & mut tokens, & ctx, None ) ?;
378384 if let Some ( tok) = tokens. next ( ) {
@@ -396,8 +402,11 @@ pub fn parse_tree_at_top(input: TokenStream) -> Result<TokenStream> {
396402}
397403
398404pub fn parse_tree_spanning_top ( input : TokenStream ) -> Result < TokenStream > {
399- let mut tokens = input. into_iter ( ) . peekable ( ) ;
400- let sources = parse_argument ( & mut tokens, "expected `,` after source nodes" ) ?;
405+ let LocatedTreeInput {
406+ source : sources,
407+ template,
408+ } = syn:: parse2 ( input) ?;
409+ let mut tokens = template. into_iter ( ) . peekable ( ) ;
401410 let ctx = Ident :: new ( IMPLICIT_CTX , Span :: call_site ( ) ) ;
402411 let node = parse_direct_node ( & mut tokens, & ctx, None ) ?;
403412 if let Some ( tok) = tokens. next ( ) {
@@ -420,18 +429,18 @@ pub fn parse_tree_spanning_top(input: TokenStream) -> Result<TokenStream> {
420429 } )
421430}
422431
423- fn parse_argument ( tokens : & mut Tokens , missing_comma : & str ) -> Result < TokenStream > {
424- let mut argument = TokenStream :: new ( ) ;
425- while let Some ( token) = tokens. next ( ) {
426- if matches ! ( & token, TokenTree :: Punct ( p) if p. as_char( ) == ',' ) {
427- if argument. is_empty ( ) {
428- return Err ( syn:: Error :: new_spanned ( token, "expected expression" ) ) ;
429- }
430- return Ok ( argument) ;
431- }
432- argument. extend ( [ token] ) ;
432+ struct LocatedTreeInput {
433+ source : Expr ,
434+ template : TokenStream ,
435+ }
436+
437+ impl Parse for LocatedTreeInput {
438+ fn parse ( input : ParseStream < ' _ > ) -> syn:: Result < Self > {
439+ let source = input. parse ( ) ?;
440+ input. parse :: < Token ! [ , ] > ( ) ?;
441+ let template = input. parse ( ) ?;
442+ Ok ( Self { source, template } )
433443 }
434- Err ( syn:: Error :: new ( Span :: call_site ( ) , missing_comma) )
435444}
436445
437446/// Parse a single node template and generate code that returns an `Id`.
0 commit comments