Repair macro for syndicate patterns involving dicts and seqs
This commit is contained in:
parent
f3424c160d
commit
3dea29ffe4
|
@ -126,7 +126,7 @@ fn skip_commas(mut c: Cursor) -> Cursor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_group_inner<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
|
fn parse_group<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
|
||||||
mut c: Cursor<'c>,
|
mut c: Cursor<'c>,
|
||||||
f: F,
|
f: F,
|
||||||
after: Cursor<'c>,
|
after: Cursor<'c>,
|
||||||
|
@ -143,15 +143,6 @@ fn parse_group_inner<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_group<'c, R, F: Fn(Cursor<'c>) -> Result<(R, Cursor<'c>)>>(
|
|
||||||
d: Delimiter,
|
|
||||||
f: F,
|
|
||||||
c: Cursor<'c>,
|
|
||||||
) -> Result<(Vec<R>, Cursor<'c>)> {
|
|
||||||
let (inner, _, after) = c.group(d).unwrap();
|
|
||||||
parse_group_inner(inner, f, after)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn parse_kv(c: Cursor) -> Result<((Stx, Stx), Cursor)> {
|
fn parse_kv(c: Cursor) -> Result<((Stx, Stx), Cursor)> {
|
||||||
let (k, c) = parse1(c)?;
|
let (k, c) = parse1(c)?;
|
||||||
if let Some((':', c)) = punct_char(c) {
|
if let Some((':', c)) = punct_char(c) {
|
||||||
|
@ -208,8 +199,6 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
|
||||||
} else {
|
} else {
|
||||||
Ok((Stx::Rec(Box::new(q.remove(0)), q), c))
|
Ok((Stx::Rec(Box::new(q.remove(0)), q), c))
|
||||||
}),
|
}),
|
||||||
'{' => parse_group(Delimiter::Brace, parse_kv, c).map(|(q,c)| (Stx::Dict(q),c)),
|
|
||||||
'[' => parse_group(Delimiter::Bracket, parse1, c).map(|(q,c)| (Stx::Seq(q),c)),
|
|
||||||
'$' => {
|
'$' => {
|
||||||
let (maybe_id, next) = adjacent_ident(p.span().end(), next);
|
let (maybe_id, next) = adjacent_ident(p.span().end(), next);
|
||||||
let (maybe_type, next) = if let Some((':', next)) = punct_char(next) {
|
let (maybe_type, next) = if let Some((':', next)) = punct_char(next) {
|
||||||
|
@ -229,7 +218,7 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
|
||||||
}
|
}
|
||||||
'#' => {
|
'#' => {
|
||||||
if let Some((inner, _, next)) = next.group(Delimiter::Brace) {
|
if let Some((inner, _, next)) = next.group(Delimiter::Brace) {
|
||||||
parse_group_inner(inner, parse1, next).map(|(q,c)| (Stx::Set(q),c))
|
parse_group(inner, parse1, next).map(|(q,c)| (Stx::Set(q),c))
|
||||||
} else if let Some((inner, _, next)) = next.group(Delimiter::Parenthesis) {
|
} else if let Some((inner, _, next)) = next.group(Delimiter::Parenthesis) {
|
||||||
Ok((Stx::Subst(inner.token_stream()), next))
|
Ok((Stx::Subst(inner.token_stream()), next))
|
||||||
} else if let Some((tt, next)) = next.token_tree() {
|
} else if let Some((tt, next)) = next.token_tree() {
|
||||||
|
@ -267,6 +256,10 @@ fn parse1(c: Cursor) -> Result<(Stx, Cursor)> {
|
||||||
Lit::Verbatim(_) => return Err(Error::new(c.span(), "Verbatim literals not supported")),
|
Lit::Verbatim(_) => return Err(Error::new(c.span(), "Verbatim literals not supported")),
|
||||||
};
|
};
|
||||||
Ok((Stx::Atom(v), next))
|
Ok((Stx::Atom(v), next))
|
||||||
|
} else if let Some((inner, _, after)) = c.group(Delimiter::Brace) {
|
||||||
|
parse_group(inner, parse_kv, after).map(|(q,c)| (Stx::Dict(q),c))
|
||||||
|
} else if let Some((inner, _, after)) = c.group(Delimiter::Bracket) {
|
||||||
|
parse_group(inner, parse1, after).map(|(q,c)| (Stx::Seq(q),c))
|
||||||
} else {
|
} else {
|
||||||
Err(Error::new(c.span(), "Unexpected input"))
|
Err(Error::new(c.span(), "Unexpected input"))
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue