Skip to content

Commit

Permalink
Merge pull request #907 from dtolnay/pat
Browse files Browse the repository at this point in the history
Fix parsing path Pat inside of None-delimited group
  • Loading branch information
dtolnay authored Oct 10, 2020
2 parents 4f547c9 + 43cdc12 commit 22d3e6e
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 16 deletions.
30 changes: 14 additions & 16 deletions src/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,22 +285,20 @@ pub mod parsing {
fn parse(input: ParseStream) -> Result<Self> {
let begin = input.fork();
let lookahead = input.lookahead1();
if lookahead.peek(Ident)
&& ({
input.peek2(Token![::])
|| input.peek2(Token![!])
|| input.peek2(token::Brace)
|| input.peek2(token::Paren)
|| input.peek2(Token![..])
&& !{
let ahead = input.fork();
ahead.parse::<Ident>()?;
ahead.parse::<RangeLimits>()?;
ahead.is_empty() || ahead.peek(Token![,])
}
})
|| input.peek(Token![self]) && input.peek2(Token![::])
|| lookahead.peek(Token![::])
if {
let ahead = input.fork();
ahead.parse::<Option<Ident>>()?.is_some()
&& (ahead.peek(Token![::])
|| ahead.peek(Token![!])
|| ahead.peek(token::Brace)
|| ahead.peek(token::Paren)
|| ahead.peek(Token![..])
&& ahead.parse::<RangeLimits>().is_ok()
&& !(ahead.is_empty() || ahead.peek(Token![,])))
} || {
let ahead = input.fork();
ahead.parse::<Option<Token![self]>>()?.is_some() && ahead.peek(Token![::])
} || lookahead.peek(Token![::])
|| lookahead.peek(Token![<])
|| input.peek(Token![Self])
|| input.peek(Token![super])
Expand Down
29 changes: 29 additions & 0 deletions tests/test_pat.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
#[macro_use]
mod macros;

use proc_macro2::{Delimiter, Group, TokenStream, TokenTree};
use quote::quote;
use std::iter::FromIterator;
use syn::{Item, Pat, Stmt};

#[test]
Expand Down Expand Up @@ -36,3 +41,27 @@ fn test_leading_vert() {
syn::parse_str::<Stmt>("let NS { f: | A }: NS;").unwrap_err();
syn::parse_str::<Stmt>("let NS { f: || A }: NS;").unwrap_err();
}

#[test]
fn test_group() {
let group = Group::new(Delimiter::None, quote!(Some(_)));
let tokens = TokenStream::from_iter(vec![TokenTree::Group(group)]);

snapshot!(tokens as Pat, @r###"
Pat::TupleStruct {
path: Path {
segments: [
PathSegment {
ident: "Some",
arguments: None,
},
],
},
pat: PatTuple {
elems: [
Pat::Wild,
],
},
}
"###);
}

0 comments on commit 22d3e6e

Please sign in to comment.