about summary refs log tree commit diff
path: root/src/libsyntax/parse/parser.rs
diff options
context:
space:
mode:
authorSunjay Varma <varma.sunjay@gmail.com>2017-11-05 16:14:22 -0500
committerSunjay Varma <varma.sunjay@gmail.com>2017-12-01 01:24:53 -0500
commit19e25b61d10e359ab1ef0778eb12c33b3f3437fb (patch)
treea661e34f6fadc5d009137238e2c41906dca1e99d /src/libsyntax/parse/parser.rs
parent804b15be82ea668d943fab70195eb57a2f942d4b (diff)
downloadrust-19e25b61d10e359ab1ef0778eb12c33b3f3437fb.tar.gz
rust-19e25b61d10e359ab1ef0778eb12c33b3f3437fb.zip
Parsing generics in both trait items and impl items
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
-rw-r--r--src/libsyntax/parse/parser.rs39
1 files changed, 36 insertions, 3 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs
index 07956ecb5af..ad7d0d22f81 100644
--- a/src/libsyntax/parse/parser.rs
+++ b/src/libsyntax/parse/parser.rs
@@ -1293,9 +1293,10 @@ impl<'a> Parser<'a> {
         let lo = self.span;
 
         let (name, node, generics) = if self.eat_keyword(keywords::Type) {
-            let TyParam {ident, bounds, default, ..} = self.parse_ty_param(vec![])?;
+            let (generics, TyParam {ident, bounds, default, ..}) =
+                self.parse_trait_item_assoc_ty(vec![])?;
             self.expect(&token::Semi)?;
-            (ident, TraitItemKind::Type(bounds, default), ast::Generics::default())
+            (ident, TraitItemKind::Type(bounds, default), generics)
         } else if self.is_const_item() {
             self.expect_keyword(keywords::Const)?;
             let ident = self.parse_ident()?;
@@ -4442,6 +4443,36 @@ impl<'a> Parser<'a> {
         })
     }
 
+    fn parse_trait_item_assoc_ty(&mut self, preceding_attrs: Vec<Attribute>)
+        -> PResult<'a, (Generics, TyParam)> {
+        let span = self.span;
+        let ident = self.parse_ident()?;
+        let mut generics = self.parse_generics()?;
+
+        // Parse optional colon and param bounds.
+        let bounds = if self.eat(&token::Colon) {
+            self.parse_ty_param_bounds()?
+        } else {
+            Vec::new()
+        };
+
+        let default = if self.eat(&token::Eq) {
+            Some(self.parse_ty()?)
+        } else {
+            None
+        };
+        generics.where_clause = self.parse_where_clause()?;
+
+        Ok((Generics, TyParam {
+            attrs: preceding_attrs.into(),
+            ident,
+            id: ast::DUMMY_NODE_ID,
+            bounds,
+            default,
+            span,
+        }))
+    }
+
     /// Parses (possibly empty) list of lifetime and type parameters, possibly including
     /// trailing comma and erroneous trailing attributes.
     pub fn parse_generic_params(&mut self) -> PResult<'a, (Vec<LifetimeDef>, Vec<TyParam>)> {
@@ -4984,10 +5015,12 @@ impl<'a> Parser<'a> {
         let defaultness = self.parse_defaultness()?;
         let (name, node, generics) = if self.eat_keyword(keywords::Type) {
             let name = self.parse_ident()?;
+            let mut generics = self.parse_generics()?;
             self.expect(&token::Eq)?;
             let typ = self.parse_ty()?;
+            generics.where_clause = self.parse_where_clause()?;
             self.expect(&token::Semi)?;
-            (name, ast::ImplItemKind::Type(typ), ast::Generics::default())
+            (name, ast::ImplItemKind::Type(typ), generics)
         } else if self.is_const_item() {
             self.expect_keyword(keywords::Const)?;
             let name = self.parse_ident()?;