From 50e00c73ee7efee610fa1dfca85155f3ce81b91e Mon Sep 17 00:00:00 2001 From: Mazdak Farrokhzad Date: Sun, 8 Dec 2019 11:19:24 +0100 Subject: [PATCH] extract parse_generic_ty_bound --- src/librustc_parse/parser/ty.rs | 39 ++++++++++++++++++++------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/src/librustc_parse/parser/ty.rs b/src/librustc_parse/parser/ty.rs index 2c362294ad0..a5ce46e9700 100644 --- a/src/librustc_parse/parser/ty.rs +++ b/src/librustc_parse/parser/ty.rs @@ -431,8 +431,6 @@ fn can_begin_bound(&mut self) -> bool { /// ``` /// BOUND = TY_BOUND | LT_BOUND /// LT_BOUND = LIFETIME (e.g., `'a`) - /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) - /// TY_BOUND_NOPAREN = [?] [for] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) /// ``` fn parse_generic_bound( &mut self, @@ -454,22 +452,11 @@ fn parse_generic_bound( } Ok(Ok(bound)) } else { - let lifetime_defs = self.parse_late_bound_lifetime_defs()?; - let path = self.parse_path(PathStyle::Type)?; - if has_parens { - self.expect(&token::CloseDelim(token::Paren))?; - } - let poly_span = lo.to(self.prev_span); + let (poly_span, bound) = self.parse_generic_ty_bound(lo, has_parens, question)?; if is_negative { Ok(Err(last_plus_span.or(colon_span).map(|sp| sp.to(poly_span)))) } else { - let poly_trait = PolyTraitRef::new(lifetime_defs, path, poly_span); - let modifier = if question.is_some() { - TraitBoundModifier::Maybe - } else { - TraitBoundModifier::None - }; - Ok(Ok(GenericBound::Trait(poly_trait, modifier))) + Ok(Ok(bound)) } } } @@ -501,6 +488,28 @@ fn recover_paren_lifetime(&mut self, lo: Span, inner_lo: Span) -> PResult<'a, () Ok(()) } + /// Parses a type bound according to: + /// ``` + /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) + /// TY_BOUND_NOPAREN = [?] [for] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) + /// ``` + fn parse_generic_ty_bound( + &mut self, + lo: Span, + has_parens: bool, + question: Option, + ) -> PResult<'a, (Span, GenericBound)> { + let lifetime_defs = self.parse_late_bound_lifetime_defs()?; + let path = self.parse_path(PathStyle::Type)?; + if has_parens { + self.expect(&token::CloseDelim(token::Paren))?; + } + let poly_span = lo.to(self.prev_span); + let poly_trait = PolyTraitRef::new(lifetime_defs, path, poly_span); + let modifier = question.map_or(TraitBoundModifier::None, |_| TraitBoundModifier::Maybe); + Ok((poly_span, GenericBound::Trait(poly_trait, modifier))) + } + pub(super) fn parse_late_bound_lifetime_defs(&mut self) -> PResult<'a, Vec> { if self.eat_keyword(kw::For) { self.expect_lt()?; -- 2.44.0