diff options
| author | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-08 11:19:24 +0100 |
|---|---|---|
| committer | Mazdak Farrokhzad <twingoow@gmail.com> | 2019-12-21 19:20:41 +0100 |
| commit | 50e00c73ee7efee610fa1dfca85155f3ce81b91e (patch) | |
| tree | c9d7d5ddd807bb94bcdcffe513840f780d627e97 /src/librustc_parse/parser | |
| parent | 1cfeb567735a0a6c6ec9a32cbaa1ea672db637b1 (diff) | |
| download | rust-50e00c73ee7efee610fa1dfca85155f3ce81b91e.tar.gz rust-50e00c73ee7efee610fa1dfca85155f3ce81b91e.zip | |
extract parse_generic_ty_bound
Diffstat (limited to 'src/librustc_parse/parser')
| -rw-r--r-- | src/librustc_parse/parser/ty.rs | 39 |
1 files 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 @@ impl<'a> Parser<'a> { /// ``` /// BOUND = TY_BOUND | LT_BOUND /// LT_BOUND = LIFETIME (e.g., `'a`) - /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) - /// TY_BOUND_NOPAREN = [?] [for<LT_PARAM_DEFS>] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) /// ``` fn parse_generic_bound( &mut self, @@ -454,22 +452,11 @@ impl<'a> Parser<'a> { } 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 @@ impl<'a> Parser<'a> { Ok(()) } + /// Parses a type bound according to: + /// ``` + /// TY_BOUND = TY_BOUND_NOPAREN | (TY_BOUND_NOPAREN) + /// TY_BOUND_NOPAREN = [?] [for<LT_PARAM_DEFS>] SIMPLE_PATH (e.g., `?for<'a: 'b> m::Trait<'a>`) + /// ``` + fn parse_generic_ty_bound( + &mut self, + lo: Span, + has_parens: bool, + question: Option<Span>, + ) -> 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<GenericParam>> { if self.eat_keyword(kw::For) { self.expect_lt()?; |
