diff options
| author | Alex Burka <alex@alexburka.com> | 2017-10-02 12:27:45 +0000 |
|---|---|---|
| committer | Alex Burka <aburka@seas.upenn.edu> | 2017-12-14 12:56:26 -0500 |
| commit | d4a28268cc1c8314f0de2519c78ff97696486a36 (patch) | |
| tree | 30a4094b487f9f0772a103adb182602fd9aef7dd /src/libsyntax/parse | |
| parent | 8624ea51172c8a86d5c7c47d740be65a3a9efbc6 (diff) | |
| download | rust-d4a28268cc1c8314f0de2519c78ff97696486a36.tar.gz rust-d4a28268cc1c8314f0de2519c78ff97696486a36.zip | |
add trait aliases to AST
Diffstat (limited to 'src/libsyntax/parse')
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 39 |
1 files changed, 25 insertions, 14 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index b3ef70fd18e..ec77d85f030 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -5182,7 +5182,7 @@ impl<'a> Parser<'a> { } } - /// Parse trait Foo { ... } + /// Parse `trait Foo { ... }` or `trait Foo = Bar;` fn parse_item_trait(&mut self, is_auto: IsAuto, unsafety: Unsafety) -> PResult<'a, ItemInfo> { let ident = self.parse_ident()?; let mut tps = self.parse_generics()?; @@ -5194,23 +5194,34 @@ impl<'a> Parser<'a> { Vec::new() }; - tps.where_clause = self.parse_where_clause()?; - - self.expect(&token::OpenDelim(token::Brace))?; - let mut trait_items = vec![]; - while !self.eat(&token::CloseDelim(token::Brace)) { - let mut at_end = false; - match self.parse_trait_item(&mut at_end) { - Ok(item) => trait_items.push(item), - Err(mut e) => { - e.emit(); - if !at_end { - self.recover_stmt_(SemiColonMode::Break, BlockMode::Break); + if self.eat(&token::Eq) { + // it's a trait alias + let bounds = self.parse_ty_param_bounds()?; + tps.where_clause = self.parse_where_clause()?; + self.expect(&token::Semi)?; + if unsafety != Unsafety::Normal { + self.span_err(self.prev_span, "trait aliases cannot be unsafe"); + } + Ok((ident, ItemKind::TraitAlias(tps, bounds), None)) + } else { + // it's a normal trait + tps.where_clause = self.parse_where_clause()?; + self.expect(&token::OpenDelim(token::Brace))?; + let mut trait_items = vec![]; + while !self.eat(&token::CloseDelim(token::Brace)) { + let mut at_end = false; + match self.parse_trait_item(&mut at_end) { + Ok(item) => trait_items.push(item), + Err(mut e) => { + e.emit(); + if !at_end { + self.recover_stmt_(SemiColonMode::Break, BlockMode::Break); + } } } } + Ok((ident, ItemKind::Trait(is_auto, unsafety, tps, bounds, trait_items), None)) } - Ok((ident, ItemKind::Trait(is_auto, unsafety, tps, bounds, trait_items), None)) } /// Parses items implementations variants |
