diff options
| author | Eduard Burtescu <edy.burt@gmail.com> | 2014-01-30 19:28:02 +0200 |
|---|---|---|
| committer | Eduard Burtescu <edy.burt@gmail.com> | 2014-01-30 19:28:41 +0200 |
| commit | 7d967741c388a4c2e8f1e45f350d5a0abb083961 (patch) | |
| tree | 29a48dde22730fb4e1a36e10915dcb772a3802d1 /src/libsyntax/parse/parser.rs | |
| parent | 30e9bbaa2ce0042406c197cee142cbcbcbb7bc64 (diff) | |
| download | rust-7d967741c388a4c2e8f1e45f350d5a0abb083961.tar.gz rust-7d967741c388a4c2e8f1e45f350d5a0abb083961.zip | |
Implement default type parameters in generics.
Diffstat (limited to 'src/libsyntax/parse/parser.rs')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 0c81e87c7b8..04a984ba95d 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -3452,13 +3452,25 @@ impl Parser { return Some(result); } - // matches typaram = IDENT optbounds + // matches typaram = IDENT optbounds ( EQ ty )? fn parse_ty_param(&mut self) -> TyParam { let ident = self.parse_ident(); let opt_bounds = self.parse_optional_ty_param_bounds(); // For typarams we don't care about the difference b/w "<T>" and "<T:>". let bounds = opt_bounds.unwrap_or_default(); - ast::TyParam { ident: ident, id: ast::DUMMY_NODE_ID, bounds: bounds } + + let default = if self.token == token::EQ { + self.bump(); + Some(self.parse_ty(false)) + } + else { None }; + + TyParam { + ident: ident, + id: ast::DUMMY_NODE_ID, + bounds: bounds, + default: default + } } // parse a set of optional generic type parameter declarations @@ -3468,9 +3480,17 @@ impl Parser { pub fn parse_generics(&mut self) -> ast::Generics { if self.eat(&token::LT) { let lifetimes = self.parse_lifetimes(); - let ty_params = self.parse_seq_to_gt( - Some(token::COMMA), - |p| p.parse_ty_param()); + let mut seen_default = false; + let ty_params = self.parse_seq_to_gt(Some(token::COMMA), |p| { + let ty_param = p.parse_ty_param(); + if ty_param.default.is_some() { + seen_default = true; + } else if seen_default { + p.span_err(p.last_span, + "type parameters with a default must be trailing"); + } + ty_param + }); ast::Generics { lifetimes: lifetimes, ty_params: ty_params } } else { ast_util::empty_generics() |
