Skip to content

Commit e67bba8

Browse files
Fix missing impl trait display as ret type
1 parent bf1e461 commit e67bba8

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

src/librustdoc/clean/mod.rs

+9
Original file line numberDiff line numberDiff line change
@@ -2378,6 +2378,7 @@ impl From<ast::FloatTy> for PrimitiveType {
23782378
impl Clean<Type> for hir::Ty {
23792379
fn clean(&self, cx: &DocContext) -> Type {
23802380
use rustc::hir::*;
2381+
23812382
match self.node {
23822383
TyKind::Never => Never,
23832384
TyKind::Ptr(ref m) => RawPointer(m.mutbl.clean(cx), box m.ty.clean(cx)),
@@ -2415,6 +2416,14 @@ impl Clean<Type> for hir::Ty {
24152416
if let Some(bounds) = cx.impl_trait_bounds.borrow_mut().remove(&did) {
24162417
return ImplTrait(bounds);
24172418
}
2419+
} else if let Def::Existential(did) = path.def {
2420+
// This block is for returned impl trait only.
2421+
if let Some(node_id) = cx.tcx.hir.as_local_node_id(did) {
2422+
let item = cx.tcx.hir.expect_item(node_id);
2423+
if let hir::ItemKind::Existential(ref ty) = item.node {
2424+
return ImplTrait(ty.bounds.clean(cx));
2425+
}
2426+
}
24182427
}
24192428

24202429
let mut alias = None;

src/test/rustdoc/impl-everywhere.rs

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright 2018 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
#![crate_name = "foo"]
12+
13+
pub trait Foo {}
14+
pub trait Foo2 {}
15+
16+
pub struct Bar;
17+
18+
impl Foo for Bar {}
19+
impl Foo2 for Bar {}
20+
21+
// @!has foo/fn.foo.html '//section[@id="main"]//pre' "x: &\'x impl Foo"
22+
// @!has foo/fn.foo.html '//section[@id="main"]//pre' "-> &\'x impl Foo {"
23+
pub fn foo<'x>(x: &'x impl Foo) -> &'x impl Foo {
24+
x
25+
}
26+
27+
// @!has foo/fn.foo2.html '//section[@id="main"]//pre' "x: &\'x impl Foo"
28+
// @!has foo/fn.foo2.html '//section[@id="main"]//pre' '-> impl Foo2 {'
29+
pub fn foo2<'x>(_x: &'x impl Foo) -> impl Foo2 {
30+
Bar
31+
}
32+
33+
// @!has foo/fn.foo_foo.html '//section[@id="main"]//pre' '-> impl Foo + Foo2 {'
34+
pub fn foo_foo() -> impl Foo + Foo2 {
35+
Bar
36+
}
37+
38+
// @!has foo/fn.foo2.html '//section[@id="main"]//pre' "x: &'x (impl Foo + Foo2)"
39+
pub fn foo_foo_foo<'x>(_x: &'x (impl Foo + Foo2)) {
40+
}

0 commit comments

Comments
 (0)