diff options
| author | bors <bors@rust-lang.org> | 2017-01-27 01:27:12 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2017-01-27 01:27:12 +0000 |
| commit | 23a94697c2fa67ec750a8fc09b2e86213b5e0af1 (patch) | |
| tree | 453b69936662fd4b908e63a5366d005aa6cb730c /src/libsyntax/parse/token.rs | |
| parent | 8430042a49bbd49bbb4fbc54f457feb5fb614f56 (diff) | |
| parent | bd4d5ec758cac866af2ca8fc09b27ce0d0112786 (diff) | |
| download | rust-23a94697c2fa67ec750a8fc09b2e86213b5e0af1.tar.gz rust-23a94697c2fa67ec750a8fc09b2e86213b5e0af1.zip | |
Auto merge of #39158 - petrochenkov:bounds, r=nikomatsakis
Bounds parsing refactoring 2
See https://github.com/rust-lang/rust/pull/37511 for previous discussion.
cc @matklad
Relaxed parsing rules:
- zero bounds after `:` are allowed in all contexts.
- zero predicates are allowed after `where`.
- trailing separator `,` is allowed after predicates in `where` clauses not followed by `{`.
Other parsing rules:
- trailing separator `+` is still allowed in all bound lists.
Code is also cleaned up and tests added.
I haven't touched parsing of trait object types yet, I'll do it later.
Diffstat (limited to 'src/libsyntax/parse/token.rs')
| -rw-r--r-- | src/libsyntax/parse/token.rs | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/libsyntax/parse/token.rs b/src/libsyntax/parse/token.rs index bf790b96e37..d9e47a6b56e 100644 --- a/src/libsyntax/parse/token.rs +++ b/src/libsyntax/parse/token.rs @@ -187,6 +187,29 @@ impl Token { } } + /// Returns `true` if the token can appear at the start of a type. + pub fn can_begin_type(&self) -> bool { + match *self { + OpenDelim(Paren) => true, // tuple + OpenDelim(Bracket) => true, // array + Ident(..) => true, // type name or keyword + Underscore => true, // placeholder + Not => true, // never + BinOp(Star) => true, // raw pointer + BinOp(And) => true, // reference + AndAnd => true, // double reference + Lt | BinOp(Shl) => true, // associated path + ModSep => true, // global path + Interpolated(ref nt) => match **nt { + NtTy(..) => true, + NtIdent(..) => true, + NtPath(..) => true, + _ => false, + }, + _ => false, + } + } + /// Returns `true` if the token is any literal pub fn is_lit(&self) -> bool { match *self { |
