diff options
| author | Sunjay Varma <varma.sunjay@gmail.com> | 2017-11-05 16:14:22 -0500 |
|---|---|---|
| committer | Sunjay Varma <varma.sunjay@gmail.com> | 2017-12-01 01:24:53 -0500 |
| commit | 19e25b61d10e359ab1ef0778eb12c33b3f3437fb (patch) | |
| tree | a661e34f6fadc5d009137238e2c41906dca1e99d /src/libsyntax/parse/parser.rs | |
| parent | 804b15be82ea668d943fab70195eb57a2f942d4b (diff) | |
| download | rust-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.rs | 39 |
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()?; |
