Skip to content

Commit e6f980f

Browse files
committed
extract parse_pat_range_starting_with_path
1 parent e32bd69 commit e6f980f

File tree

1 file changed

+25
-15
lines changed
  • src/libsyntax/parse/parser

1 file changed

+25
-15
lines changed

src/libsyntax/parse/parser/pat.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use super::{Parser, PResult, PathStyle};
33
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
44
use crate::ptr::P;
55
use crate::ast::{self, Attribute, Pat, PatKind, FieldPat, RangeEnd, RangeSyntax, Mac_};
6-
use crate::ast::{BindingMode, Ident, Mutability, Path, Expr, ExprKind};
6+
use crate::ast::{BindingMode, Ident, Mutability, Path, QSelf, Expr, ExprKind};
77
use crate::parse::token::{self};
88
use crate::print::pprust;
99
use crate::source_map::{respan, Span, Spanned};
@@ -167,20 +167,7 @@ impl<'a> Parser<'a> {
167167
match self.token.kind {
168168
token::Not if qself.is_none() => self.parse_pat_mac_invoc(lo, path)?,
169169
token::DotDotDot | token::DotDotEq | token::DotDot => {
170-
let (end_kind, form) = match self.token.kind {
171-
token::DotDot => (RangeEnd::Excluded, ".."),
172-
token::DotDotDot => (RangeEnd::Included(RangeSyntax::DotDotDot), "..."),
173-
token::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
174-
_ => panic!("can only parse `..`/`...`/`..=` for ranges \
175-
(checked above)"),
176-
};
177-
let op_span = self.token.span;
178-
// Parse range
179-
let span = lo.to(self.prev_span);
180-
let begin = self.mk_expr(span, ExprKind::Path(qself, path), ThinVec::new());
181-
self.bump();
182-
let end = self.parse_pat_range_end_opt(&begin, form)?;
183-
PatKind::Range(begin, end, respan(op_span, end_kind))
170+
self.parse_pat_range_starting_with_path(lo, qself, path)?
184171
}
185172
token::OpenDelim(token::Brace) => {
186173
if qself.is_some() {
@@ -350,6 +337,29 @@ impl<'a> Parser<'a> {
350337
Ok(PatKind::Mac(mac))
351338
}
352339

340+
/// Parse a range pattern `$path $form $end?` where `$form = ".." | "..." | "..=" ;`.
341+
/// The `$path` has already been parsed and the next token is the `$form`.
342+
fn parse_pat_range_starting_with_path(
343+
&mut self,
344+
lo: Span,
345+
qself: Option<QSelf>,
346+
path: Path
347+
) -> PResult<'a, PatKind> {
348+
let (end_kind, form) = match self.token.kind {
349+
token::DotDot => (RangeEnd::Excluded, ".."),
350+
token::DotDotDot => (RangeEnd::Included(RangeSyntax::DotDotDot), "..."),
351+
token::DotDotEq => (RangeEnd::Included(RangeSyntax::DotDotEq), "..="),
352+
_ => panic!("can only parse `..`/`...`/`..=` for ranges (checked above)"),
353+
};
354+
let op_span = self.token.span;
355+
// Parse range
356+
let span = lo.to(self.prev_span);
357+
let begin = self.mk_expr(span, ExprKind::Path(qself, path), ThinVec::new());
358+
self.bump();
359+
let end = self.parse_pat_range_end_opt(&begin, form)?;
360+
Ok(PatKind::Range(begin, end, respan(op_span, end_kind)))
361+
}
362+
353363
// Helper function to decide whether to parse as ident binding
354364
// or to try to do something more complex like range patterns.
355365
fn parse_as_ident(&mut self) -> bool {

0 commit comments

Comments
 (0)