Skip to content
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

implement trait_now_doc_hidden lint #595

Merged
merged 2 commits into from
Dec 5, 2023
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
48 changes: 48 additions & 0 deletions src/lints/trait_now_doc_hidden.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
SemverQuery(
id: "trait_now_doc_hidden",
human_readable_name: "pub trait is now #[doc(hidden)]",
description: "A pub trait is now marked #[doc(hidden)] and is thus no longer part of the public API.",
required_update: Major,
reference_link: Some("https://doc.rust-lang.org/rustdoc/write-documentation/the-doc-attribute.html#hidden"),
query: r#"
{
CrateDiff {
baseline {
item {
... on Trait {
visibility_limit @filter(op: "=", value: ["$public"])

importable_path {
path @output @tag
public_api @filter(op: "=", value: ["$true"])
}
}
}
}
current {
item {
... on Trait {
visibility_limit @filter(op: "=", value: ["$public"])
trait_name: name @output

importable_path {
path @filter(op: "=", value: ["%path"])
public_api @filter(op: "!=", value: ["$true"])
}

span_: span @optional {
filename @output
begin_line @output
}
}
}
}
}
}"#,
arguments: {
"public": "public",
"true": true,
},
error_message: "A pub trait is now #[doc(hidden)], removing it from the crate's public API.",
per_result_error_template: Some("trait {{trait_name}} in file {{span_filename}}:{{span_begin_line}}"),
)
1 change: 1 addition & 0 deletions src/query.rs
Original file line number Diff line number Diff line change
Expand Up @@ -505,6 +505,7 @@ add_lints!(
trait_method_missing,
trait_missing,
trait_must_use_added,
trait_now_doc_hidden,
trait_unsafe_added,
trait_unsafe_removed,
tuple_struct_to_plain_struct,
Expand Down
4 changes: 2 additions & 2 deletions test_crates/enum_now_doc_hidden/new/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -63,15 +63,15 @@ pub enum Example {
pub enum PublicEnumHiddenVariant {
// shouldn't flag `enum_now_doc_hidden` rule
// as this is a field that's hidden,
// not the entire struct
// not the entire enum
#[doc(hidden)]
A,
B,
}

pub enum PublicEnumHiddenStructFieldOnVariant {
// shouldn't flag `enum_now_doc_hidden` rule
// as this is a field that's hidden on a struct variant,
// as this is a field that's hidden on a enum variant,
// not the entire enum
A {
#[doc(hidden)]
Expand Down
7 changes: 7 additions & 0 deletions test_crates/trait_now_doc_hidden/new/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[package]
publish = false
name = "trait_now_doc_hidden"
version = "0.1.0"
edition = "2021"

[dependencies]
62 changes: 62 additions & 0 deletions test_crates/trait_now_doc_hidden/new/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
mod MyNonPublicMod {
// despite adding #[doc(hidden)], this trait is in a
// private mod, so it isn't part of the crate's public
// api
#[doc(hidden)]
pub trait MyTrait {}
}

pub mod MyPublicMod {
// added #[doc(hidden)], however this trait is in a
// public mod, so it previously was part of the crate's public api
#[doc(hidden)]
pub trait MyTrait {}
}

#[doc(hidden)]
pub mod MyTopLevelDocHiddenMod {
#[doc(hidden)] // this shouldn't flag, as it's a top level mod
// was never part of the public api of the crate
pub trait MyTraitThatIsNowDocHidden {}
}

mod MyNestedNonPublicMod {
pub mod PublicInnerMod {
// despite adding #[doc(hidden)], this trait is in a
// private outer mod, so it isn't part of the crate's public
// api
#[doc(hidden)]
pub trait MyTrait {}
}
}

pub mod MyNestedPublicMod {
pub mod PublicInnerMod {
// added #[doc(hidden)], however this trait is in a
// public mod, so it previously was part of the crate's public api
#[doc(hidden)]
pub trait MyTrait {}
}
}

#[doc(alias = "hidden")] // shouldn't flag, this is just aliased as hidden,
// but it should be #[doc(hidden)]
pub trait AliasedAsDocHidden {}

#[doc(hidden)] // should flag, this is the simplest case of adding #[doc(hidden)] to a pub trait.
pub trait Example {}

pub trait PublicTraitHiddenVariant {
// shouldn't flag `trait_now_doc_hidden` rule
// as this is a trait-fn that's hidden,
// not the entire trait
#[doc(hidden)]
fn my_trait_fn(&self);
}

#[doc(hidden)]
trait PublicTraitThatGoesPrivate {}

#[doc = "hidden"] // shouldn't flag, this is just documented with the string "hidden",
// it's not actually #[doc(hidden)]
pub trait PublicTraitDocumentedWithStringHidden {}
7 changes: 7 additions & 0 deletions test_crates/trait_now_doc_hidden/old/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
[package]
publish = false
name = "trait_now_doc_hidden"
version = "0.1.0"
edition = "2021"

[dependencies]
36 changes: 36 additions & 0 deletions test_crates/trait_now_doc_hidden/old/src/lib.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
mod MyNonPublicMod {
pub trait MyTrait {}
}

pub mod MyPublicMod {
pub trait MyTrait {}
}

#[doc(hidden)]
pub mod MyTopLevelDocHiddenMod {
pub trait MyTraitThatIsNowDocHidden {}
}

mod MyNestedNonPublicMod {
pub mod PublicInnerMod {
pub trait MyTrait {}
}
}

pub mod MyNestedPublicMod {
pub mod PublicInnerMod {
pub trait MyTrait {}
}
}

pub trait AliasedAsDocHidden {}

pub trait Example {}

pub trait PublicTraitHiddenVariant {
fn my_trait_fn(&self);
}

trait PublicTraitThatGoesPrivate {}

pub trait PublicTraitDocumentedWithStringHidden {}
34 changes: 34 additions & 0 deletions test_outputs/trait_now_doc_hidden.output.ron
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
{
"./test_crates/trait_now_doc_hidden/": [
{
"path": List([
String("trait_now_doc_hidden"),
String("MyPublicMod"),
String("MyTrait"),
]),
"span_begin_line": Uint64(13),
"span_filename": String("src/lib.rs"),
"trait_name": String("MyTrait"),
},
{
"path": List([
String("trait_now_doc_hidden"),
String("MyNestedPublicMod"),
String("PublicInnerMod"),
String("MyTrait"),
]),
"span_begin_line": Uint64(38),
"span_filename": String("src/lib.rs"),
"trait_name": String("MyTrait"),
},
{
"path": List([
String("trait_now_doc_hidden"),
String("Example"),
]),
"span_begin_line": Uint64(47),
"span_filename": String("src/lib.rs"),
"trait_name": String("Example"),
},
],
}
Loading