From 8b6f32d80101bcc82a60f54922500ec04066be80 Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Fri, 28 Feb 2025 16:26:37 +0530 Subject: [PATCH 01/11] new lint: pub_api_sealed_trait_became_unconditionally_sealed --- ...ed_trait_became_unconditionally_sealed.ron | 55 +++++++++++++++ src/query.rs | 1 + .../new/Cargo.toml | 7 ++ .../new/src/lib.rs | 23 +++++++ .../old/Cargo.toml | 7 ++ .../old/src/lib.rs | 24 +++++++ ...d_trait_became_unconditionally_sealed.snap | 69 +++++++++++++++++++ 7 files changed, 186 insertions(+) create mode 100644 src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron create mode 100644 test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/Cargo.toml create mode 100644 test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/src/lib.rs create mode 100644 test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/Cargo.toml create mode 100644 test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/src/lib.rs create mode 100644 test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron new file mode 100644 index 00000000..6dc2409b --- /dev/null +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -0,0 +1,55 @@ +SemverQuery( + id: "pub_api_sealed_trait_became_unconditionally_sealed", + human_readable_name: "Public API sealed trait became unconditionally sealed", + description: "A trait that was previously only sealed to public API consumers is now unconditionally sealed. + This change prevents all external implementations, including from related first-party crates + that might have relied on private API access", + required_update: Major, + lint_level: Deny, + reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), + query: r#" + { + CrateDiff { + baseline { + item { + ... on Trait { + visibility_limit @filter(op: "=", value: ["$public"]) @output + public_api_sealed @filter(op: "=", value: ["$true"]) + unconditionally_sealed @filter(op: "!=", value: ["$true"]) + importable_path { + path @output @tag + public_api @filter(op: "=", value: ["$true"]) + } + } + } + } + current { + item { + ... on Trait { + visibility_limit @filter(op: "=", value: ["$public"]) + unconditionally_sealed @filter(op: "=", value: ["$true"]) + name @output + importable_path { + path @filter(op: "=", value: ["%path"]) + public_api @filter(op: "=", value: ["$true"]) + } + span_: span @optional { + filename @output + begin_line @output + end_line @output + } + } + } + } + } + }"#, + arguments: { + "public": "public", + "true": true, + }, + error_message: "A public API sealed trait is now unconditionally sealed, preventing all external implementations. + This change impacts related first-party crates (e.g., derive macros or other internal tooling) + that previously could implement the trait using non-public API", + per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), + witness: None, +) diff --git a/src/query.rs b/src/query.rs index 4d2f7ec0..5fbfc73a 100644 --- a/src/query.rs +++ b/src/query.rs @@ -1285,6 +1285,7 @@ add_lints!( partial_ord_struct_fields_reordered, proc_macro_marked_deprecated, proc_macro_now_doc_hidden, + pub_api_sealed_trait_became_unconditionally_sealed, pub_module_level_const_missing, pub_module_level_const_now_doc_hidden, pub_static_missing, diff --git a/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/Cargo.toml b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/Cargo.toml new file mode 100644 index 00000000..f1dcd7f3 --- /dev/null +++ b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/Cargo.toml @@ -0,0 +1,7 @@ +[package] +publish = false +name = "pub_api_sealed_trait_became_unconditionally_sealed" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/src/lib.rs b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/src/lib.rs new file mode 100644 index 00000000..818e3004 --- /dev/null +++ b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/new/src/lib.rs @@ -0,0 +1,23 @@ +// Traits transitioning from Public API Sealed → Unconditionally Sealed (Lint should detect these) +pub mod public_api_sealed_to_unconditionally_sealed { + mod hidden { + pub trait Sealed {} + pub struct Token; + } + + pub trait TraitExtendsUnconditionallyHiddenTrait: hidden::Sealed {} + + pub trait MethodReturningUnconditionallyHiddenToken { + fn method(&self) -> hidden::Token; + } + + pub trait MethodTakingUnconditionallyHiddenToken { + fn method(&self, token: hidden::Token); + } + + pub trait HiddenSealedWithWhereSelfBound + where + Self: hidden::Sealed, + { + } +} diff --git a/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/Cargo.toml b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/Cargo.toml new file mode 100644 index 00000000..f1dcd7f3 --- /dev/null +++ b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/Cargo.toml @@ -0,0 +1,7 @@ +[package] +publish = false +name = "pub_api_sealed_trait_became_unconditionally_sealed" +version = "0.1.0" +edition = "2021" + +[dependencies] diff --git a/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/src/lib.rs b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/src/lib.rs new file mode 100644 index 00000000..6f4e07b9 --- /dev/null +++ b/test_crates/pub_api_sealed_trait_became_unconditionally_sealed/old/src/lib.rs @@ -0,0 +1,24 @@ +// Traits transitioning from Public API Sealed → Unconditionally Sealed (Lint should detect these) +pub mod public_api_sealed_to_unconditionally_sealed { + #[doc(hidden)] + pub mod hidden { + pub trait Sealed {} + pub struct Token; + } + + pub trait TraitExtendsUnconditionallyHiddenTrait: hidden::Sealed {} + + pub trait MethodReturningUnconditionallyHiddenToken { + fn method(&self) -> hidden::Token; + } + + pub trait MethodTakingUnconditionallyHiddenToken { + fn method(&self, token: hidden::Token); + } + + pub trait HiddenSealedWithWhereSelfBound + where + Self: hidden::Sealed, + { + } +} diff --git a/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap b/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap new file mode 100644 index 00000000..4e9f6c4c --- /dev/null +++ b/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap @@ -0,0 +1,69 @@ +--- +source: src/query.rs +expression: "&query_execution_results" +--- +{ + "./test_crates/pub_api_sealed_trait_became_unconditionally_sealed/": [ + { + "name": String("TraitExtendsUnconditionallyHiddenTrait"), + "path": List([ + String("pub_api_sealed_trait_became_unconditionally_sealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("TraitExtendsUnconditionallyHiddenTrait"), + ]), + "span_begin_line": Uint64(8), + "span_end_line": Uint64(8), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + { + "name": String("MethodReturningUnconditionallyHiddenToken"), + "path": List([ + String("pub_api_sealed_trait_became_unconditionally_sealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("MethodReturningUnconditionallyHiddenToken"), + ]), + "span_begin_line": Uint64(10), + "span_end_line": Uint64(12), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + { + "name": String("MethodTakingUnconditionallyHiddenToken"), + "path": List([ + String("pub_api_sealed_trait_became_unconditionally_sealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("MethodTakingUnconditionallyHiddenToken"), + ]), + "span_begin_line": Uint64(14), + "span_end_line": Uint64(16), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + { + "name": String("HiddenSealedWithWhereSelfBound"), + "path": List([ + String("pub_api_sealed_trait_became_unconditionally_sealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("HiddenSealedWithWhereSelfBound"), + ]), + "span_begin_line": Uint64(18), + "span_end_line": Uint64(22), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + ], + "./test_crates/trait_newly_sealed/": [ + { + "name": String("PublicAPISealed"), + "path": List([ + String("trait_newly_sealed"), + String("PublicAPISealed"), + ]), + "span_begin_line": Uint64(29), + "span_end_line": Uint64(32), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + ], +} From f4abdd0aeec8609aa1ffa958a676e75e51134c17 Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 08:35:08 +0530 Subject: [PATCH 02/11] formatted description and error messages --- ...i_sealed_trait_became_unconditionally_sealed.ron | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index 6dc2409b..51cc65f6 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,11 +1,9 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "Public API sealed trait became unconditionally sealed", - description: "A trait that was previously only sealed to public API consumers is now unconditionally sealed. - This change prevents all external implementations, including from related first-party crates - that might have relied on private API access", + description: "A public API sealed traitis now unconditionally sealed, blocking all external implementations, including first-party crates relying on non-public API access.", required_update: Major, - lint_level: Deny, + lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), query: r#" { @@ -16,6 +14,7 @@ SemverQuery( visibility_limit @filter(op: "=", value: ["$public"]) @output public_api_sealed @filter(op: "=", value: ["$true"]) unconditionally_sealed @filter(op: "!=", value: ["$true"]) + importable_path { path @output @tag public_api @filter(op: "=", value: ["$true"]) @@ -29,10 +28,12 @@ SemverQuery( visibility_limit @filter(op: "=", value: ["$public"]) unconditionally_sealed @filter(op: "=", value: ["$true"]) name @output + importable_path { path @filter(op: "=", value: ["%path"]) public_api @filter(op: "=", value: ["$true"]) } + span_: span @optional { filename @output begin_line @output @@ -47,9 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait is now unconditionally sealed, preventing all external implementations. - This change impacts related first-party crates (e.g., derive macros or other internal tooling) - that previously could implement the trait using non-public API", + error_message: "A public API sealed trait is now fully sealed, blocking all external implementations, including first-party crates relying on non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, ) From 02d1e751e21aa7da3a059a5fa7b70f5c515cebba Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 09:08:45 +0530 Subject: [PATCH 03/11] fix: lint-level --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index 51cc65f6..e2d6d521 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -2,7 +2,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "Public API sealed trait became unconditionally sealed", description: "A public API sealed traitis now unconditionally sealed, blocking all external implementations, including first-party crates relying on non-public API access.", - required_update: Major, + required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), query: r#" From adbfdf3e8c24f2c9436e51b3cc54ed14f0d8db99 Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 09:30:35 +0530 Subject: [PATCH 04/11] fix: typo at description --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index e2d6d521..72f427d6 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,7 +1,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "Public API sealed trait became unconditionally sealed", - description: "A public API sealed traitis now unconditionally sealed, blocking all external implementations, including first-party crates relying on non-public API access.", + description: "A public API sealed trait is now unconditionally sealed, blocking all external implementations, including first-party crates relying on non-public API access.", required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), From 3ed74559c3eba653d459ae290af7b42211a6995d Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 10:43:35 +0530 Subject: [PATCH 05/11] fix: rewrite text to match other lints --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index 72f427d6..399056d2 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,7 +1,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "Public API sealed trait became unconditionally sealed", - description: "A public API sealed trait is now unconditionally sealed, blocking all external implementations, including first-party crates relying on non-public API access.", + description: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates relying on non-public API access.", required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), @@ -48,7 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait is now fully sealed, blocking all external implementations, including first-party crates relying on non-public API.", + error_message: "A public API sealed trait has became unconditionally sealed, blocking external implementations, including those from first-party crates relying on non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, ) From be768e01d07d3ed9dfdb0e93a8b1fcfd3a08c2ed Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 10:45:22 +0530 Subject: [PATCH 06/11] fix: description --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index 399056d2..cdf74fc7 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,6 +1,6 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", - human_readable_name: "Public API sealed trait became unconditionally sealed", + human_readable_name: "public API sealed trait became unconditionally sealed", description: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates relying on non-public API access.", required_update: Minor, lint_level: Warn, From 6aeba395925223d4ef8a640040e5ba5e9f09b682 Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 11:01:16 +0530 Subject: [PATCH 07/11] rewritten description and error message --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index cdf74fc7..bf9ca68e 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,7 +1,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "public API sealed trait became unconditionally sealed", - description: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates relying on non-public API access.", + description: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), @@ -48,7 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait has became unconditionally sealed, blocking external implementations, including those from first-party crates relying on non-public API.", + error_message: "A public API sealed trait has became unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, ) From 4785f26423e4699c9d8b48d3bf0ad5313b0a025b Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 11:14:58 +0530 Subject: [PATCH 08/11] Typo fix at error --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index bf9ca68e..a83dd7cc 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -48,7 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait has became unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", + error_message: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, ) From dfd2f78c01cdb058ac5c9b5886aa41d7de73f9e4 Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Sat, 1 Mar 2025 09:18:28 -0500 Subject: [PATCH 09/11] Apply suggestions from code review --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index a83dd7cc..91a759e1 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,7 +1,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "public API sealed trait became unconditionally sealed", - description: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", + description: "A public API sealed trait has become unconditionally sealed, blocking all external implementations including those from first-party crates that rely on the non-public API.", required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), @@ -48,7 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait has become unconditionally sealed, blocking external implementations, including those from first-party crates that rely on the non-public API.", + error_message: "A public API sealed trait has become unconditionally sealed, blocking all external implementations including those from first-party crates that rely on the non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, ) From 1e6248beda9c612d99ffddcfd0eaaf2ac51f3910 Mon Sep 17 00:00:00 2001 From: Lovelin <100030865+lovelindhoni@users.noreply.github.com> Date: Sat, 1 Mar 2025 21:41:26 +0530 Subject: [PATCH 10/11] fix: snapshot assertion with `pub_api_sealed_trait_became_unsealed` --- ...d_trait_became_unconditionally_sealed.snap | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap b/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap index 4e9f6c4c..c6878108 100644 --- a/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap +++ b/test_outputs/query_execution/pub_api_sealed_trait_became_unconditionally_sealed.snap @@ -53,6 +53,44 @@ expression: "&query_execution_results" "visibility_limit": String("public"), }, ], + "./test_crates/pub_api_sealed_trait_became_unsealed/": [ + { + "name": String("TraitExtendsUnconditionallyHiddenTrait"), + "path": List([ + String("pub_api_sealed_trait_became_unsealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("TraitExtendsUnconditionallyHiddenTrait"), + ]), + "span_begin_line": Uint64(30), + "span_end_line": Uint64(30), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + { + "name": String("MethodReturningUnconditionallyHiddenToken"), + "path": List([ + String("pub_api_sealed_trait_became_unsealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("MethodReturningUnconditionallyHiddenToken"), + ]), + "span_begin_line": Uint64(32), + "span_end_line": Uint64(34), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + { + "name": String("MethodTakingUnconditionallyHiddenToken"), + "path": List([ + String("pub_api_sealed_trait_became_unsealed"), + String("public_api_sealed_to_unconditionally_sealed"), + String("MethodTakingUnconditionallyHiddenToken"), + ]), + "span_begin_line": Uint64(36), + "span_end_line": Uint64(38), + "span_filename": String("src/lib.rs"), + "visibility_limit": String("public"), + }, + ], "./test_crates/trait_newly_sealed/": [ { "name": String("PublicAPISealed"), From f313bc91091a31f3461d7e14b74731326790926d Mon Sep 17 00:00:00 2001 From: Predrag Gruevski <2348618+obi1kenobi@users.noreply.github.com> Date: Sat, 1 Mar 2025 15:42:38 -0500 Subject: [PATCH 11/11] Apply suggestions from code review --- .../pub_api_sealed_trait_became_unconditionally_sealed.ron | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron index 91a759e1..c975be3e 100644 --- a/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron +++ b/src/lints/pub_api_sealed_trait_became_unconditionally_sealed.ron @@ -1,7 +1,7 @@ SemverQuery( id: "pub_api_sealed_trait_became_unconditionally_sealed", human_readable_name: "public API sealed trait became unconditionally sealed", - description: "A public API sealed trait has become unconditionally sealed, blocking all external implementations including those from first-party crates that rely on the non-public API.", + description: "A public API sealed trait has become unconditionally sealed, blocking all downstream implementations including those from first-party crates that rely on the non-public API.", required_update: Minor, lint_level: Warn, reference_link: Some("https://rust-lang.github.io/api-guidelines/future-proofing.html#sealed-traits-protect-against-downstream-implementations-c-sealed"), @@ -48,7 +48,7 @@ SemverQuery( "public": "public", "true": true, }, - error_message: "A public API sealed trait has become unconditionally sealed, blocking all external implementations including those from first-party crates that rely on the non-public API.", + error_message: "A public API sealed trait has become unconditionally sealed, blocking all downstream implementations including those from first-party crates that rely on the non-public API.", per_result_error_template: Some("trait {{join \"::\" path}} in file {{span_filename}}:{{span_begin_line}}"), witness: None, )