Skip to content

Commit 2ee0621

Browse files
committed
yeast: Address review comments
Does the parsing of arguments in a slightly more principled way.
1 parent 35c84d2 commit 2ee0621

1 file changed

Lines changed: 25 additions & 16 deletions

File tree

‎shared/yeast-macros/src/parse.rs‎

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ use proc_macro2::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree};
22
use quote::quote;
33
use std::iter::Peekable;
44
use std::sync::atomic::{AtomicUsize, Ordering};
5-
use syn::Lifetime;
5+
use syn::{
6+
Expr, Lifetime, Token,
7+
parse::{Parse, ParseStream},
8+
};
69

710
type Tokens = Peekable<proc_macro2::token_stream::IntoIter>;
811
type Result<T> = std::result::Result<T, syn::Error>;
@@ -371,8 +374,11 @@ pub fn parse_trees_top(input: TokenStream) -> Result<TokenStream> {
371374
}
372375

373376
pub 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

398404
pub 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

Comments
 (0)