From e67bba8ebe14c815c4f756aa267249e5c35d5ec5 Mon Sep 17 00:00:00 2001 From: Guillaume Gomez Date: Tue, 21 Aug 2018 00:43:02 +0200 Subject: [PATCH] Fix missing impl trait display as ret type --- src/librustdoc/clean/mod.rs | 9 +++++++ src/test/rustdoc/impl-everywhere.rs | 40 +++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 src/test/rustdoc/impl-everywhere.rs diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index 9b77ff82f90..57ae2ac3a5b 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -2378,6 +2378,7 @@ impl From for PrimitiveType { impl Clean for hir::Ty { fn clean(&self, cx: &DocContext) -> Type { use rustc::hir::*; + match self.node { TyKind::Never => Never, TyKind::Ptr(ref m) => RawPointer(m.mutbl.clean(cx), box m.ty.clean(cx)), @@ -2415,6 +2416,14 @@ impl Clean for hir::Ty { if let Some(bounds) = cx.impl_trait_bounds.borrow_mut().remove(&did) { return ImplTrait(bounds); } + } else if let Def::Existential(did) = path.def { + // This block is for returned impl trait only. + if let Some(node_id) = cx.tcx.hir.as_local_node_id(did) { + let item = cx.tcx.hir.expect_item(node_id); + if let hir::ItemKind::Existential(ref ty) = item.node { + return ImplTrait(ty.bounds.clean(cx)); + } + } } let mut alias = None; diff --git a/src/test/rustdoc/impl-everywhere.rs b/src/test/rustdoc/impl-everywhere.rs new file mode 100644 index 00000000000..62da6f13942 --- /dev/null +++ b/src/test/rustdoc/impl-everywhere.rs @@ -0,0 +1,40 @@ +// Copyright 2018 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![crate_name = "foo"] + +pub trait Foo {} +pub trait Foo2 {} + +pub struct Bar; + +impl Foo for Bar {} +impl Foo2 for Bar {} + +// @!has foo/fn.foo.html '//section[@id="main"]//pre' "x: &\'x impl Foo" +// @!has foo/fn.foo.html '//section[@id="main"]//pre' "-> &\'x impl Foo {" +pub fn foo<'x>(x: &'x impl Foo) -> &'x impl Foo { + x +} + +// @!has foo/fn.foo2.html '//section[@id="main"]//pre' "x: &\'x impl Foo" +// @!has foo/fn.foo2.html '//section[@id="main"]//pre' '-> impl Foo2 {' +pub fn foo2<'x>(_x: &'x impl Foo) -> impl Foo2 { + Bar +} + +// @!has foo/fn.foo_foo.html '//section[@id="main"]//pre' '-> impl Foo + Foo2 {' +pub fn foo_foo() -> impl Foo + Foo2 { + Bar +} + +// @!has foo/fn.foo2.html '//section[@id="main"]//pre' "x: &'x (impl Foo + Foo2)" +pub fn foo_foo_foo<'x>(_x: &'x (impl Foo + Foo2)) { +}