diff options
| author | Jonas Schievink <jonasschievink@gmail.com> | 2020-02-09 18:23:34 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-02-09 18:23:34 +0100 |
| commit | da005822cef776e9757127ce0e609e9c3a737b39 (patch) | |
| tree | 52c5691c43d22163c42bf951294e106957a1ac47 | |
| parent | f6b8281d34c9b272f097d7a6f8589d391526427b (diff) | |
| parent | bf82582d6f8de744df5c34e80a04ad72f40afed7 (diff) | |
| download | rust-da005822cef776e9757127ce0e609e9c3a737b39.tar.gz rust-da005822cef776e9757127ce0e609e9c3a737b39.zip | |
Rollup merge of #68913 - Areredify:gat_pretty, r=cramertj
Pretty-print generic params and where clauses on associated types closes #67509
| -rw-r--r-- | src/librustc_ast_pretty/pprust.rs | 5 | ||||
| -rw-r--r-- | src/librustc_hir/print.rs | 6 | ||||
| -rw-r--r-- | src/test/pretty/gat-bounds.pp | 25 | ||||
| -rw-r--r-- | src/test/pretty/gat-bounds.rs | 17 |
4 files changed, 51 insertions, 2 deletions
diff --git a/src/librustc_ast_pretty/pprust.rs b/src/librustc_ast_pretty/pprust.rs index d9077d1606f..78bf149f0e0 100644 --- a/src/librustc_ast_pretty/pprust.rs +++ b/src/librustc_ast_pretty/pprust.rs @@ -1074,12 +1074,15 @@ impl<'a> State<'a> { fn print_associated_type( &mut self, ident: ast::Ident, + generics: &ast::Generics, bounds: &ast::GenericBounds, ty: Option<&ast::Ty>, ) { self.word_space("type"); self.print_ident(ident); + self.print_generic_params(&generics.params); self.print_type_bounds(":", bounds); + self.print_where_clause(&generics.where_clause); if let Some(ty) = ty { self.s.space(); self.word_space("="); @@ -1474,7 +1477,7 @@ impl<'a> State<'a> { self.print_fn_full(sig, item.ident, &item.generics, &item.vis, body, &item.attrs); } ast::AssocItemKind::TyAlias(bounds, ty) => { - self.print_associated_type(item.ident, bounds, ty.as_deref()); + self.print_associated_type(item.ident, &item.generics, bounds, ty.as_deref()); } ast::AssocItemKind::Macro(mac) => { self.print_mac(mac); diff --git a/src/librustc_hir/print.rs b/src/librustc_hir/print.rs index b0d2f96c71a..071c3de4b1c 100644 --- a/src/librustc_hir/print.rs +++ b/src/librustc_hir/print.rs @@ -454,14 +454,17 @@ impl<'a> State<'a> { fn print_associated_type( &mut self, ident: ast::Ident, + generics: &hir::Generics<'_>, bounds: Option<hir::GenericBounds<'_>>, ty: Option<&hir::Ty<'_>>, ) { self.word_space("type"); self.print_ident(ident); + self.print_generic_params(&generics.params); if let Some(bounds) = bounds { self.print_bounds(":", bounds); } + self.print_where_clause(&generics.where_clause); if let Some(ty) = ty { self.s.space(); self.word_space("="); @@ -902,6 +905,7 @@ impl<'a> State<'a> { hir::TraitItemKind::Type(ref bounds, ref default) => { self.print_associated_type( ti.ident, + &ti.generics, Some(bounds), default.as_ref().map(|ty| &**ty), ); @@ -930,7 +934,7 @@ impl<'a> State<'a> { self.ann.nested(self, Nested::Body(body)); } hir::ImplItemKind::TyAlias(ref ty) => { - self.print_associated_type(ii.ident, None, Some(ty)); + self.print_associated_type(ii.ident, &ii.generics, None, Some(ty)); } hir::ImplItemKind::OpaqueTy(bounds) => { self.word_space("type"); diff --git a/src/test/pretty/gat-bounds.pp b/src/test/pretty/gat-bounds.pp new file mode 100644 index 00000000000..0c95add4901 --- /dev/null +++ b/src/test/pretty/gat-bounds.pp @@ -0,0 +1,25 @@ +// Check that associated types print generic parameters and where clauses. +// See issue #67509. + +// pretty-compare-only +// pp-exact:gat-bounds.pp + +#![feature(generic_associated_types)] + +trait X { + type + Y<T>: Trait + where + Self: Sized; +} + +impl X for () { + type + Y<T> + where + Self: Sized + = + u32; +} + +fn main() { } diff --git a/src/test/pretty/gat-bounds.rs b/src/test/pretty/gat-bounds.rs new file mode 100644 index 00000000000..1275f432a3c --- /dev/null +++ b/src/test/pretty/gat-bounds.rs @@ -0,0 +1,17 @@ +// Check that associated types print generic parameters and where clauses. +// See issue #67509. + +// pretty-compare-only +// pp-exact:gat-bounds.pp + +#![feature(generic_associated_types)] + +trait X { + type Y<T>: Trait where Self: Sized; +} + +impl X for () { + type Y<T> where Self: Sized = u32; +} + +fn main() { } |
