Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 13 additions & 1 deletion crates/ide-db/src/defs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -179,7 +179,19 @@ impl Definition {
Definition::Static(it) => it.docs(db),
Definition::Trait(it) => it.docs(db),
Definition::TraitAlias(it) => it.docs(db),
Definition::TypeAlias(it) => it.docs(db),
Definition::TypeAlias(it) => {
it.docs(db).or_else(|| {
// docs are missing, try to fall back to the docs of the aliased item.
let adt = it.ty(db).as_adt()?;
let docs = adt.docs(db)?;
let docs = format!(
"*This is the documentation for* `{}`\n\n{}",
adt.display(db, edition),
docs.as_str()
);
Some(Documentation::new(docs))
})
}
Definition::BuiltinType(it) => {
famous_defs.and_then(|fd| {
// std exposes prim_{} modules with docstrings on the root to document the builtins
Expand Down
153 changes: 153 additions & 0 deletions crates/ide/src/hover/tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9018,3 +9018,156 @@ foo!(BAR_$0);
"#]],
);
}

#[test]
fn type_alias_without_docs() {
// Simple.
check(
r#"
/// Docs for B
struct B;

type A$0 = B;
"#,
expect![[r#"
*A*

```rust
test
```

```rust
// size = 0, align = 1
type A = B
```

---

*This is the documentation for* `struct B`

Docs for B
"#]],
);

// Nested.
check(
r#"
/// Docs for C
struct C;

type B = C;

type A$0 = B;
"#,
expect![[r#"
*A*

```rust
test
```

```rust
// size = 0, align = 1
type A = B
```

---

*This is the documentation for* `struct C`

Docs for C
"#]],
);

// Showing the docs for aliased struct instead of intermediate type.
check(
r#"
/// Docs for C
struct C;

/// Docs for B
type B = C;

type A$0 = B;
"#,
expect![[r#"
*A*

```rust
test
```

```rust
// size = 0, align = 1
type A = B
```

---

*This is the documentation for* `struct C`

Docs for C
"#]],
);

// No docs found.
check(
r#"
struct C;

type B = C;

type A$0 = B;
"#,
expect![[r#"
*A*

```rust
test
```

```rust
// size = 0, align = 1
type A = B
```
"#]],
);

// Multiple nested crate.
check(
r#"
//- /lib.rs crate:c
/// Docs for C
pub struct C;

//- /lib.rs crate:b deps:c
pub use c::C;
pub type B = C;

//- /lib.rs crate:a deps:b
pub use b::B;
pub type A = B;

//- /main.rs crate:main deps:a
use a::A$0;
"#,
expect![[r#"
*A*

```rust
a
```

```rust
// size = 0, align = 1
pub type A = B
```

---

*This is the documentation for* `pub struct C`

Docs for C
"#]],
);
}