about summary refs log tree commit diff
path: root/src/librustc_parse/parser
diff options
context:
space:
mode:
authorMazdak Farrokhzad <twingoow@gmail.com>2019-12-08 11:19:24 +0100
committerMazdak Farrokhzad <twingoow@gmail.com>2019-12-21 19:20:41 +0100
commit50e00c73ee7efee610fa1dfca85155f3ce81b91e (patch)
treec9d7d5ddd807bb94bcdcffe513840f780d627e97 /src/librustc_parse/parser
parent1cfeb567735a0a6c6ec9a32cbaa1ea672db637b1 (diff)
downloadrust-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.rs39
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()?;