mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-11-14 00:47:18 +00:00
Auto merge of #18349 - dqkqd:issue-18344, r=Veykril
feat: render docs from aliased type when type has no docs Trying to close #18344 - [x] ~Find the docs by traversing upwards if the type itself has none but aliasing for another type that might have.~ - [x] Show docs from aliased type. - [x] Showing description that we are displaying documentation for different definition in hover box. ![image](https://github.com/user-attachments/assets/820d6f97-aa2c-4dc4-8a25-75746e32d950)
This commit is contained in:
commit
eddab6e98c
2 changed files with 166 additions and 1 deletions
|
@ -178,7 +178,19 @@ impl Definition {
|
||||||
Definition::Static(it) => it.docs(db),
|
Definition::Static(it) => it.docs(db),
|
||||||
Definition::Trait(it) => it.docs(db),
|
Definition::Trait(it) => it.docs(db),
|
||||||
Definition::TraitAlias(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) => {
|
Definition::BuiltinType(it) => {
|
||||||
famous_defs.and_then(|fd| {
|
famous_defs.and_then(|fd| {
|
||||||
// std exposes prim_{} modules with docstrings on the root to document the builtins
|
// std exposes prim_{} modules with docstrings on the root to document the builtins
|
||||||
|
|
|
@ -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
|
||||||
|
"#]],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue