validate doc(masked)

This commit is contained in:
Lukas Markeffsky 2023-07-21 22:31:43 +02:00
parent 237ed1630f
commit 637ea3f746
7 changed files with 136 additions and 117 deletions

View File

@ -211,6 +211,17 @@ passes_doc_keyword_not_mod =
passes_doc_keyword_only_impl = passes_doc_keyword_only_impl =
`#[doc(keyword = "...")]` should be used on impl blocks `#[doc(keyword = "...")]` should be used on impl blocks
passes_doc_masked_not_extern_crate_self =
this attribute cannot be applied to an `extern crate self` item
.label = not applicable on `extern crate self` items
.extern_crate_self_label = `extern crate self` defined here
passes_doc_masked_only_extern_crate =
this attribute can only be applied to an `extern crate` item
.label = only applicable on `extern crate` items
.not_an_extern_crate_label = not an `extern crate` item
.note = read <https://doc.rust-lang.org/unstable-book/language-features/doc-masked.html> for more information
passes_doc_test_literal = `#![doc(test(...)]` does not take a literal passes_doc_test_literal = `#![doc(test(...)]` does not take a literal
passes_doc_test_takes_list = passes_doc_test_takes_list =

View File

@ -878,6 +878,44 @@ fn check_doc_inline(
} }
} }
fn check_doc_masked(
&self,
attr: &Attribute,
meta: &NestedMetaItem,
hir_id: HirId,
target: Target,
) -> bool {
if target != Target::ExternCrate {
self.tcx.emit_spanned_lint(
INVALID_DOC_ATTRIBUTES,
hir_id,
meta.span(),
errors::DocMaskedOnlyExternCrate {
attr_span: meta.span(),
item_span: (attr.style == AttrStyle::Outer)
.then(|| self.tcx.hir().span(hir_id)),
},
);
return false;
}
if self.tcx.extern_mod_stmt_cnum(hir_id.owner).is_none() {
self.tcx.emit_spanned_lint(
INVALID_DOC_ATTRIBUTES,
hir_id,
meta.span(),
errors::DocMaskedNotExternCrateSelf {
attr_span: meta.span(),
item_span: (attr.style == AttrStyle::Outer)
.then(|| self.tcx.hir().span(hir_id)),
},
);
return false;
}
true
}
/// Checks that an attribute is *not* used at the crate level. Returns `true` if valid. /// Checks that an attribute is *not* used at the crate level. Returns `true` if valid.
fn check_attr_not_crate_level( fn check_attr_not_crate_level(
&self, &self,
@ -1048,6 +1086,17 @@ fn check_doc_attrs(
is_valid = false; is_valid = false;
} }
sym::masked
if !self.check_doc_masked(
attr,
meta,
hir_id,
target,
) =>
{
is_valid = false;
}
// no_default_passes: deprecated // no_default_passes: deprecated
// passes: deprecated // passes: deprecated
// plugins: removed, but rustdoc warns about it itself // plugins: removed, but rustdoc warns about it itself

View File

@ -267,6 +267,25 @@ pub struct DocInlineOnlyUse {
pub item_span: Option<Span>, pub item_span: Option<Span>,
} }
#[derive(LintDiagnostic)]
#[diag(passes_doc_masked_only_extern_crate)]
#[note]
pub struct DocMaskedOnlyExternCrate {
#[label]
pub attr_span: Span,
#[label(passes_not_an_extern_crate_label)]
pub item_span: Option<Span>,
}
#[derive(LintDiagnostic)]
#[diag(passes_doc_masked_not_extern_crate_self)]
pub struct DocMaskedNotExternCrateSelf {
#[label]
pub attr_span: Span,
#[label(passes_extern_crate_self_label)]
pub item_span: Option<Span>,
}
#[derive(Diagnostic)] #[derive(Diagnostic)]
#[diag(passes_doc_attr_not_crate_level)] #[diag(passes_doc_attr_not_crate_level)]
pub struct DocAttrNotCrateLevel<'a> { pub struct DocAttrNotCrateLevel<'a> {

View File

@ -1,5 +1,10 @@
#![crate_type = "lib"] #![crate_type = "lib"]
#![deny(warnings)] #![deny(warnings)]
#![feature(doc_masked)]
#![doc(masked)]
//~^ ERROR this attribute can only be applied to an `extern crate` item
//~| WARN is being phased out
#[doc(test(no_crate_inject))] #[doc(test(no_crate_inject))]
//~^ ERROR can only be applied at the crate level //~^ ERROR can only be applied at the crate level
@ -30,3 +35,13 @@ pub fn baz() {}
//~^^ ERROR conflicting doc inlining attributes //~^^ ERROR conflicting doc inlining attributes
//~| HELP remove one of the conflicting attributes //~| HELP remove one of the conflicting attributes
pub use bar::baz; pub use bar::baz;
#[doc(masked)]
//~^ ERROR this attribute can only be applied to an `extern crate` item
//~| WARN is being phased out
pub struct Masked;
#[doc(masked)]
//~^ ERROR this attribute cannot be applied to an `extern crate self` item
//~| WARN is being phased out
pub extern crate self as reexport;

View File

@ -1,5 +1,5 @@
error: this attribute can only be applied at the crate level error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:4:7 --> $DIR/invalid-doc-attr.rs:9:7
| |
LL | #[doc(test(no_crate_inject))] LL | #[doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
@ -19,7 +19,7 @@ LL | #![doc(test(no_crate_inject))]
| + | +
error: this attribute can only be applied to a `use` item error: this attribute can only be applied to a `use` item
--> $DIR/invalid-doc-attr.rs:9:7 --> $DIR/invalid-doc-attr.rs:14:7
| |
LL | #[doc(inline)] LL | #[doc(inline)]
| ^^^^^^ only applicable on `use` items | ^^^^^^ only applicable on `use` items
@ -32,7 +32,7 @@ LL | pub fn foo() {}
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information = note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information
error: this attribute can only be applied at the crate level error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:15:12 --> $DIR/invalid-doc-attr.rs:20:12
| |
LL | #![doc(test(no_crate_inject))] LL | #![doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
@ -42,7 +42,7 @@ LL | #![doc(test(no_crate_inject))]
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information = note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information
error: conflicting doc inlining attributes error: conflicting doc inlining attributes
--> $DIR/invalid-doc-attr.rs:28:7 --> $DIR/invalid-doc-attr.rs:33:7
| |
LL | #[doc(inline)] LL | #[doc(inline)]
| ^^^^^^ this attribute... | ^^^^^^ this attribute...
@ -51,8 +51,43 @@ LL | #[doc(no_inline)]
| |
= help: remove one of the conflicting attributes = help: remove one of the conflicting attributes
error: this attribute can only be applied to an `extern crate` item
--> $DIR/invalid-doc-attr.rs:39:7
|
LL | #[doc(masked)]
| ^^^^^^ only applicable on `extern crate` items
...
LL | pub struct Masked;
| ----------------- not an `extern crate` item
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/unstable-book/language-features/doc-masked.html> for more information
error: this attribute cannot be applied to an `extern crate self` item
--> $DIR/invalid-doc-attr.rs:44:7
|
LL | #[doc(masked)]
| ^^^^^^ not applicable on `extern crate self` items
...
LL | pub extern crate self as reexport;
| --------------------------------- `extern crate self` defined here
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
error: this attribute can only be applied to an `extern crate` item
--> $DIR/invalid-doc-attr.rs:5:8
|
LL | #![doc(masked)]
| ^^^^^^ only applicable on `extern crate` items
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/unstable-book/language-features/doc-masked.html> for more information
error: this attribute can only be applied at the crate level error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:19:11 --> $DIR/invalid-doc-attr.rs:24:11
| |
LL | #[doc(test(no_crate_inject))] LL | #[doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^ | ^^^^^^^^^^^^^^^^^^^^^
@ -62,7 +97,7 @@ LL | #[doc(test(no_crate_inject))]
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information = note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information
error: this attribute can only be applied to a `use` item error: this attribute can only be applied to a `use` item
--> $DIR/invalid-doc-attr.rs:22:11 --> $DIR/invalid-doc-attr.rs:27:11
| |
LL | #[doc(inline)] LL | #[doc(inline)]
| ^^^^^^ only applicable on `use` items | ^^^^^^ only applicable on `use` items
@ -74,5 +109,5 @@ LL | pub fn baz() {}
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730> = note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information = note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information
error: aborting due to 6 previous errors error: aborting due to 9 previous errors

View File

@ -1,32 +0,0 @@
#![crate_type = "lib"]
#![deny(warnings)]
#[doc(test(no_crate_inject))]
//~^ ERROR can only be applied at the crate level
//~| WARN is being phased out
//~| HELP to apply to the crate, use an inner attribute
//~| SUGGESTION !
#[doc(inline)]
//~^ ERROR can only be applied to a `use` item
//~| WARN is being phased out
pub fn foo() {}
pub mod bar {
#![doc(test(no_crate_inject))]
//~^ ERROR can only be applied at the crate level
//~| WARN is being phased out
#[doc(test(no_crate_inject))]
//~^ ERROR can only be applied at the crate level
//~| WARN is being phased out
#[doc(inline)]
//~^ ERROR can only be applied to a `use` item
//~| WARN is being phased out
pub fn baz() {}
}
#[doc(inline)]
#[doc(no_inline)]
//~^^ ERROR conflicting doc inlining attributes
//~| HELP remove one of the conflicting attributes
pub use bar::baz;

View File

@ -1,78 +0,0 @@
error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:4:7
|
LL | #[doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information
note: the lint level is defined here
--> $DIR/invalid-doc-attr.rs:2:9
|
LL | #![deny(warnings)]
| ^^^^^^^^
= note: `#[deny(invalid_doc_attributes)]` implied by `#[deny(warnings)]`
help: to apply to the crate, use an inner attribute
|
LL | #![doc(test(no_crate_inject))]
| +
error: this attribute can only be applied to a `use` item
--> $DIR/invalid-doc-attr.rs:9:7
|
LL | #[doc(inline)]
| ^^^^^^ only applicable on `use` items
...
LL | pub fn foo() {}
| ------------ not a `use` item
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information
error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:15:12
|
LL | #![doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information
error: conflicting doc inlining attributes
--> $DIR/invalid-doc-attr.rs:28:7
|
LL | #[doc(inline)]
| ^^^^^^ this attribute...
LL | #[doc(no_inline)]
| ^^^^^^^^^ ...conflicts with this attribute
|
= help: remove one of the conflicting attributes
error: this attribute can only be applied at the crate level
--> $DIR/invalid-doc-attr.rs:19:11
|
LL | #[doc(test(no_crate_inject))]
| ^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#at-the-crate-level> for more information
error: this attribute can only be applied to a `use` item
--> $DIR/invalid-doc-attr.rs:22:11
|
LL | #[doc(inline)]
| ^^^^^^ only applicable on `use` items
...
LL | pub fn baz() {}
| ------------ not a `use` item
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= note: for more information, see issue #82730 <https://github.com/rust-lang/rust/issues/82730>
= note: read <https://doc.rust-lang.org/nightly/rustdoc/the-doc-attribute.html#inline-and-no_inline> for more information
error: aborting due to 6 previous errors