Skip to content

feat: render docs from aliased type when type has no docs #18349

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 22, 2024
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
"#]],
);
}