rustdoc: prevent ctors from resolving
This commit is contained in:
parent
9ff5fc4ffb
commit
253fec494f
@ -2148,7 +2148,9 @@ fn resolve_rustdoc_path(
|
||||
|
||||
match self.maybe_resolve_path(&segments, Some(ns), &parent_scope, None) {
|
||||
PathResult::Module(ModuleOrUniformRoot::Module(module)) => Some(module.res().unwrap()),
|
||||
PathResult::NonModule(path_res) => path_res.full_res(),
|
||||
PathResult::NonModule(path_res) => {
|
||||
path_res.full_res().filter(|res| !matches!(res, Res::Def(DefKind::Ctor(..), _)))
|
||||
}
|
||||
PathResult::Module(ModuleOrUniformRoot::ExternPrelude) | PathResult::Failed { .. } => {
|
||||
None
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ struct X {
|
||||
//~| HELP prefix with `field@`
|
||||
|
||||
/// Link to [field@S::A]
|
||||
//~^ ERROR incompatible link kind for `S::A`
|
||||
//~| NOTE this link resolved
|
||||
//~^ ERROR unresolved link to `S::A`
|
||||
//~| NOTE this link resolves
|
||||
//~| HELP prefix with `variant@`
|
||||
pub fn f() {}
|
||||
|
@ -160,13 +160,13 @@ help: to link to the field, prefix with `field@`
|
||||
LL | /// Link to [field@X::y]
|
||||
| ~~~~~~
|
||||
|
||||
error: incompatible link kind for `S::A`
|
||||
error: unresolved link to `S::A`
|
||||
--> $DIR/disambiguator-mismatch.rs:93:14
|
||||
|
|
||||
LL | /// Link to [field@S::A]
|
||||
| ^^^^^^^^^^ this link resolved to a unit variant, which is not a field
|
||||
| ^^^^^^^^^^ this link resolves to the variant `A`, which is not in the value namespace
|
||||
|
|
||||
help: to link to the unit variant, prefix with `variant@`
|
||||
help: to link to the variant, prefix with `variant@`
|
||||
|
|
||||
LL | /// Link to [variant@S::A]
|
||||
| ~~~~~~~~
|
||||
|
35
tests/rustdoc-ui/intra-doc/value-ctor.rs
Normal file
35
tests/rustdoc-ui/intra-doc/value-ctor.rs
Normal file
@ -0,0 +1,35 @@
|
||||
// https://github.com/rust-lang/rust/issues/130591
|
||||
#![deny(rustdoc::broken_intra_doc_links)]
|
||||
#![crate_name = "foo"]
|
||||
|
||||
/// [value@Foo::X] //~ERROR broken
|
||||
pub enum Foo {
|
||||
X,
|
||||
}
|
||||
|
||||
/// [tst][value@MyStruct] //~ERROR broken
|
||||
pub struct MyStruct;
|
||||
|
||||
pub enum MyEnum {
|
||||
Internals,
|
||||
}
|
||||
|
||||
pub use MyEnum::*;
|
||||
|
||||
/// In this context, [a][type@Internals] is a struct,
|
||||
/// while [b][value@Internals] fails. //~ERROR broken
|
||||
/// Also, [c][struct@Internals] is a struct,
|
||||
/// while [d][variant@Internals] fails. //~ERROR broken
|
||||
pub struct Internals {
|
||||
foo: (),
|
||||
}
|
||||
|
||||
pub mod inside {
|
||||
pub struct Internals2;
|
||||
}
|
||||
|
||||
use inside::*;
|
||||
|
||||
/// In this context, [a][type@Internals2] is an enum,
|
||||
/// while [b][value@Internals2] fails. //~ERROR broken
|
||||
pub enum Internals2 {}
|
62
tests/rustdoc-ui/intra-doc/value-ctor.stderr
Normal file
62
tests/rustdoc-ui/intra-doc/value-ctor.stderr
Normal file
@ -0,0 +1,62 @@
|
||||
error: unresolved link to `Foo::X`
|
||||
--> $DIR/value-ctor.rs:5:6
|
||||
|
|
||||
LL | /// [value@Foo::X]
|
||||
| ^^^^^^^^^^^^ this link resolves to the variant `X`, which is not in the value namespace
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/value-ctor.rs:2:9
|
||||
|
|
||||
LL | #![deny(rustdoc::broken_intra_doc_links)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
help: to link to the variant, prefix with `variant@`
|
||||
|
|
||||
LL | /// [variant@Foo::X]
|
||||
| ~~~~~~~~
|
||||
|
||||
error: unresolved link to `MyStruct`
|
||||
--> $DIR/value-ctor.rs:10:11
|
||||
|
|
||||
LL | /// [tst][value@MyStruct]
|
||||
| ^^^^^^^^^^^^^^ this link resolves to the struct `MyStruct`, which is not in the value namespace
|
||||
|
|
||||
help: to link to the struct, prefix with `struct@`
|
||||
|
|
||||
LL | /// [tst][struct@MyStruct]
|
||||
| ~~~~~~~
|
||||
|
||||
error: unresolved link to `Internals`
|
||||
--> $DIR/value-ctor.rs:20:15
|
||||
|
|
||||
LL | /// while [b][value@Internals] fails.
|
||||
| ^^^^^^^^^^^^^^^ this link resolves to the struct `Internals`, which is not in the value namespace
|
||||
|
|
||||
help: to link to the struct, prefix with `struct@`
|
||||
|
|
||||
LL | /// while [b][struct@Internals] fails.
|
||||
| ~~~~~~~
|
||||
|
||||
error: incompatible link kind for `Internals`
|
||||
--> $DIR/value-ctor.rs:22:15
|
||||
|
|
||||
LL | /// while [d][variant@Internals] fails.
|
||||
| ^^^^^^^^^^^^^^^^^ this link resolved to a struct, which is not a variant
|
||||
|
|
||||
help: to link to the struct, prefix with `struct@`
|
||||
|
|
||||
LL | /// while [d][struct@Internals] fails.
|
||||
| ~~~~~~~
|
||||
|
||||
error: unresolved link to `Internals2`
|
||||
--> $DIR/value-ctor.rs:34:15
|
||||
|
|
||||
LL | /// while [b][value@Internals2] fails.
|
||||
| ^^^^^^^^^^^^^^^^ this link resolves to the enum `Internals2`, which is not in the value namespace
|
||||
|
|
||||
help: to link to the enum, prefix with `enum@`
|
||||
|
|
||||
LL | /// while [b][enum@Internals2] fails.
|
||||
| ~~~~~
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
Loading…
Reference in New Issue
Block a user