summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_parse/src/parser/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_parse/src/parser/mod.rs')
-rw-r--r--compiler/rustc_parse/src/parser/mod.rs35
1 files changed, 24 insertions, 11 deletions
diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs
index e84d8f5b3..1a7ae4069 100644
--- a/compiler/rustc_parse/src/parser/mod.rs
+++ b/compiler/rustc_parse/src/parser/mod.rs
@@ -11,6 +11,7 @@ mod stmt;
mod ty;
use crate::lexer::UnmatchedDelim;
+use ast::Gen;
pub use attr_wrapper::AttrWrapper;
pub use diagnostics::AttemptLocalParseRecovery;
pub(crate) use expr::ForbiddenLetReason;
@@ -35,8 +36,8 @@ use rustc_errors::{
Applicability, DiagnosticBuilder, ErrorGuaranteed, FatalError, IntoDiagnostic, MultiSpan,
};
use rustc_session::parse::ParseSess;
-use rustc_span::source_map::{Span, DUMMY_SP};
use rustc_span::symbol::{kw, sym, Ident, Symbol};
+use rustc_span::{Span, DUMMY_SP};
use std::ops::Range;
use std::{mem, slice};
use thin_vec::ThinVec;
@@ -52,6 +53,7 @@ bitflags::bitflags! {
const NO_STRUCT_LITERAL = 1 << 1;
const CONST_EXPR = 1 << 2;
const ALLOW_LET = 1 << 3;
+ const IN_IF_GUARD = 1 << 4;
}
}
@@ -158,8 +160,9 @@ pub struct Parser<'a> {
/// appropriately.
///
/// See the comments in the `parse_path_segment` function for more details.
- unmatched_angle_bracket_count: u32,
- max_angle_bracket_count: u32,
+ unmatched_angle_bracket_count: u16,
+ max_angle_bracket_count: u16,
+ angle_bracket_nesting: u16,
last_unexpected_token_span: Option<Span>,
/// If present, this `Parser` is not parsing Rust code but rather a macro call.
@@ -393,6 +396,7 @@ impl<'a> Parser<'a> {
break_last_token: false,
unmatched_angle_bracket_count: 0,
max_angle_bracket_count: 0,
+ angle_bracket_nesting: 0,
last_unexpected_token_span: None,
subparser_name,
capture_state: CaptureState {
@@ -557,8 +561,9 @@ impl<'a> Parser<'a> {
}
if case == Case::Insensitive
- && let Some((ident, /* is_raw */ false)) = self.token.ident()
- && ident.as_str().to_lowercase() == kw.as_str().to_lowercase() {
+ && let Some((ident, /* is_raw */ false)) = self.token.ident()
+ && ident.as_str().to_lowercase() == kw.as_str().to_lowercase()
+ {
true
} else {
false
@@ -586,12 +591,10 @@ impl<'a> Parser<'a> {
}
if case == Case::Insensitive
- && let Some((ident, /* is_raw */ false)) = self.token.ident()
- && ident.as_str().to_lowercase() == kw.as_str().to_lowercase() {
- self.sess.emit_err(errors::KwBadCase {
- span: ident.span,
- kw: kw.as_str()
- });
+ && let Some((ident, /* is_raw */ false)) = self.token.ident()
+ && ident.as_str().to_lowercase() == kw.as_str().to_lowercase()
+ {
+ self.sess.emit_err(errors::KwBadCase { span: ident.span, kw: kw.as_str() });
self.bump();
return true;
}
@@ -1126,6 +1129,16 @@ impl<'a> Parser<'a> {
}
}
+ /// Parses genness: `gen` or nothing.
+ fn parse_genness(&mut self, case: Case) -> Gen {
+ if self.token.span.at_least_rust_2024() && self.eat_keyword_case(kw::Gen, case) {
+ let span = self.prev_token.uninterpolated_span();
+ Gen::Yes { span, closure_id: DUMMY_NODE_ID, return_impl_trait_id: DUMMY_NODE_ID }
+ } else {
+ Gen::No
+ }
+ }
+
/// Parses unsafety: `unsafe` or nothing.
fn parse_unsafety(&mut self, case: Case) -> Unsafe {
if self.eat_keyword_case(kw::Unsafe, case) {