Skip to content

Commit e62a9a9

Browse files
authored
new lint: enum_variant_marked_deprecated (#1179)
part of: #57 would finish the last one too
2 parents 13d3b3e + a6baba6 commit e62a9a9

File tree

8 files changed

+325
-1
lines changed

8 files changed

+325
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
SemverQuery(
2+
id: "enum_variant_marked_deprecated",
3+
human_readable_name: "enum variant #[deprecated] added",
4+
description: "An enum variant has been newly marked with #[deprecated].",
5+
required_update: Minor,
6+
lint_level: Deny,
7+
reference_link: Some("https://doc.rust-lang.org/reference/attributes/diagnostics.html#the-deprecated-attribute"),
8+
query: r#"
9+
{
10+
CrateDiff {
11+
current {
12+
item {
13+
... on Enum {
14+
visibility_limit @filter(op: "=", value: ["$public"])
15+
name @output
16+
# Filter out deprecated enums since rustdoc automatically marks their variants as deprecated.
17+
# This ensures we only detect variants that are explicitly marked with #[deprecated].
18+
deprecated @filter(op: "!=", value: ["$true"])
19+
20+
importable_path {
21+
path @tag @output
22+
public_api @filter(op: "=", value: ["$true"])
23+
}
24+
25+
variant {
26+
variant_name: name @output @tag
27+
public_api_eligible @filter(op: "=", value: ["$true"])
28+
deprecated @filter(op: "=", value: ["$true"])
29+
30+
span_: span @optional {
31+
filename @output
32+
begin_line @output
33+
end_line @output
34+
}
35+
}
36+
}
37+
}
38+
}
39+
baseline {
40+
item {
41+
... on Enum {
42+
visibility_limit @filter(op: "=", value: ["$public"]) @output
43+
deprecated @filter(op: "!=", value: ["$true"])
44+
45+
importable_path {
46+
path @filter(op: "=", value: ["%path"])
47+
public_api @filter(op: "=", value: ["$true"])
48+
}
49+
50+
variant {
51+
name @filter(op: "=", value: ["%variant_name"])
52+
public_api_eligible @filter(op: "=", value: ["$true"])
53+
deprecated @filter(op: "!=", value: ["$true"])
54+
}
55+
}
56+
}
57+
}
58+
}
59+
}"#,
60+
arguments: {
61+
"public": "public",
62+
"true": true,
63+
},
64+
error_message: "An enum variant is now #[deprecated]. Downstream crates will get a compiler warning when using this variant.",
65+
per_result_error_template: Some("variant {{join \"::\" path}}::{{variant_name}} in {{span_filename}}:{{span_begin_line}}"),
66+
)

src/query.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1247,6 +1247,7 @@ add_lints!(
12471247
enum_tuple_variant_field_now_doc_hidden,
12481248
enum_unit_variant_changed_kind,
12491249
enum_variant_added,
1250+
enum_variant_marked_deprecated,
12501251
enum_variant_marked_non_exhaustive,
12511252
enum_variant_missing,
12521253
exported_function_changed_abi,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
publish = false
3+
name = "enum_variant_marked_deprecated"
4+
version = "0.1.0"
5+
edition = "2021"
6+
7+
[dependencies]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
#![no_std]
2+
3+
// These enum variants are now marked as deprecated
4+
pub enum NormalEnum {
5+
// Now deprecated
6+
#[deprecated]
7+
VariantToBeDeprecated,
8+
// Now deprecated with a message
9+
#[deprecated = "Use NormalVariant instead"]
10+
VariantToBeDeprecatedWithMessage,
11+
// Still normal
12+
NormalVariant,
13+
}
14+
15+
// This enum is now deprecated
16+
// Its variants should not trigger the lint since the enum itself is deprecated
17+
#[deprecated = "Use NormalEnum instead"]
18+
pub enum EnumToBeDeprecated {
19+
VariantInDeprecatedEnum,
20+
AnotherVariantInDeprecatedEnum,
21+
}
22+
23+
// This enum was already deprecated
24+
// Changes to its variants should not trigger the lint
25+
#[deprecated]
26+
pub enum AlreadyDeprecatedEnum {
27+
// This should not trigger the lint since the enum is already deprecated
28+
#[deprecated]
29+
VariantInAlreadyDeprecatedEnum,
30+
AnotherVariantInAlreadyDeprecatedEnum,
31+
}
32+
33+
// This enum has a mix of variant types to test different variant kinds
34+
pub enum MixedVariantKinds {
35+
// Unit variant now deprecated
36+
#[deprecated]
37+
UnitVariant,
38+
// Tuple variant now deprecated
39+
#[deprecated = "Use NormalTuple instead"]
40+
TupleVariant(i32, i64),
41+
// Struct variant now deprecated
42+
#[deprecated]
43+
StructVariant {
44+
field1: bool,
45+
field2: u32,
46+
},
47+
// These remain normal
48+
NormalUnit,
49+
NormalTuple(f64),
50+
NormalStruct {
51+
value: i32,
52+
},
53+
}
54+
55+
// This enum is private and should not trigger the lint
56+
enum PrivateEnum {
57+
#[deprecated]
58+
PrivateVariantToBeDeprecated,
59+
AnotherPrivateVariant,
60+
}
61+
62+
// This enum has a hidden variant that should not trigger the lint
63+
pub enum EnumWithHiddenVariant {
64+
NormalVariant,
65+
#[doc(hidden)]
66+
#[deprecated]
67+
HiddenVariantToBeDeprecated,
68+
}
69+
70+
// This variant was already deprecated and should not trigger the lint
71+
pub enum EnumWithAlreadyDeprecatedVariant {
72+
NormalVariant,
73+
#[deprecated]
74+
AlreadyDeprecatedVariant,
75+
#[deprecated = "New message"]
76+
VariantWithMessageToBeChanged,
77+
}
78+
79+
// This is a new enum with deprecated variants
80+
// It should not trigger the lint since it's a new enum
81+
pub enum NewEnumWithDeprecatedVariants {
82+
NormalVariant,
83+
#[deprecated]
84+
DeprecatedVariant,
85+
}
86+
87+
// This enum is hidden with #[doc(hidden)] and should not trigger the lint
88+
#[doc(hidden)]
89+
pub enum HiddenEnum {
90+
#[deprecated]
91+
VariantToBeDeprecated,
92+
AnotherVariant,
93+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
[package]
2+
publish = false
3+
name = "enum_variant_marked_deprecated"
4+
version = "0.1.0"
5+
edition = "2021"
6+
7+
[dependencies]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#![no_std]
2+
3+
// These enum variants will be marked as deprecated in the new version
4+
pub enum NormalEnum {
5+
// Will be marked as deprecated
6+
VariantToBeDeprecated,
7+
// Will be marked as deprecated with a message
8+
VariantToBeDeprecatedWithMessage,
9+
// Will remain normal
10+
NormalVariant,
11+
}
12+
13+
// This enum will be marked as deprecated in the new version
14+
// Its variants should not trigger the lint since the enum itself is deprecated
15+
pub enum EnumToBeDeprecated {
16+
VariantInDeprecatedEnum,
17+
AnotherVariantInDeprecatedEnum,
18+
}
19+
20+
// This enum is already deprecated
21+
// Changes to its variants should not trigger the lint
22+
#[deprecated]
23+
pub enum AlreadyDeprecatedEnum {
24+
VariantInAlreadyDeprecatedEnum,
25+
AnotherVariantInAlreadyDeprecatedEnum,
26+
}
27+
28+
// This enum has a mix of variant types to test different variant kinds
29+
pub enum MixedVariantKinds {
30+
// Unit variant to be deprecated
31+
UnitVariant,
32+
// Tuple variant to be deprecated
33+
TupleVariant(i32, i64),
34+
// Struct variant to be deprecated
35+
StructVariant { field1: bool, field2: u32 },
36+
// These will remain normal
37+
NormalUnit,
38+
NormalTuple(f64),
39+
NormalStruct { value: i32 },
40+
}
41+
42+
// This enum is private and should not trigger the lint
43+
enum PrivateEnum {
44+
PrivateVariantToBeDeprecated,
45+
AnotherPrivateVariant,
46+
}
47+
48+
// This enum has a hidden variant that should not trigger the lint
49+
pub enum EnumWithHiddenVariant {
50+
NormalVariant,
51+
#[doc(hidden)]
52+
HiddenVariantToBeDeprecated,
53+
}
54+
55+
// This variant is already deprecated and should not trigger the lint
56+
pub enum EnumWithAlreadyDeprecatedVariant {
57+
NormalVariant,
58+
#[deprecated]
59+
AlreadyDeprecatedVariant,
60+
#[deprecated = "Old message"]
61+
VariantWithMessageToBeChanged,
62+
}
63+
64+
// This enum is hidden with #[doc(hidden)] and should not trigger the lint
65+
#[doc(hidden)]
66+
pub enum HiddenEnum {
67+
VariantToBeDeprecated,
68+
AnotherVariant,
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
---
2+
source: src/query.rs
3+
expression: "&query_execution_results"
4+
---
5+
{
6+
"./test_crates/enum_variant_marked_deprecated/": [
7+
{
8+
"name": String("NormalEnum"),
9+
"path": List([
10+
String("enum_variant_marked_deprecated"),
11+
String("NormalEnum"),
12+
]),
13+
"span_begin_line": Uint64(7),
14+
"span_end_line": Uint64(7),
15+
"span_filename": String("src/lib.rs"),
16+
"variant_name": String("VariantToBeDeprecated"),
17+
"visibility_limit": String("public"),
18+
},
19+
{
20+
"name": String("NormalEnum"),
21+
"path": List([
22+
String("enum_variant_marked_deprecated"),
23+
String("NormalEnum"),
24+
]),
25+
"span_begin_line": Uint64(10),
26+
"span_end_line": Uint64(10),
27+
"span_filename": String("src/lib.rs"),
28+
"variant_name": String("VariantToBeDeprecatedWithMessage"),
29+
"visibility_limit": String("public"),
30+
},
31+
{
32+
"name": String("MixedVariantKinds"),
33+
"path": List([
34+
String("enum_variant_marked_deprecated"),
35+
String("MixedVariantKinds"),
36+
]),
37+
"span_begin_line": Uint64(37),
38+
"span_end_line": Uint64(37),
39+
"span_filename": String("src/lib.rs"),
40+
"variant_name": String("UnitVariant"),
41+
"visibility_limit": String("public"),
42+
},
43+
{
44+
"name": String("MixedVariantKinds"),
45+
"path": List([
46+
String("enum_variant_marked_deprecated"),
47+
String("MixedVariantKinds"),
48+
]),
49+
"span_begin_line": Uint64(40),
50+
"span_end_line": Uint64(40),
51+
"span_filename": String("src/lib.rs"),
52+
"variant_name": String("TupleVariant"),
53+
"visibility_limit": String("public"),
54+
},
55+
{
56+
"name": String("MixedVariantKinds"),
57+
"path": List([
58+
String("enum_variant_marked_deprecated"),
59+
String("MixedVariantKinds"),
60+
]),
61+
"span_begin_line": Uint64(43),
62+
"span_end_line": Uint64(46),
63+
"span_filename": String("src/lib.rs"),
64+
"variant_name": String("StructVariant"),
65+
"visibility_limit": String("public"),
66+
},
67+
],
68+
}

test_outputs/query_execution/type_marked_deprecated.snap

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
---
22
source: src/query.rs
33
expression: "&query_execution_results"
4-
snapshot_kind: text
54
---
65
{
6+
"./test_crates/enum_variant_marked_deprecated/": [
7+
{
8+
"name": String("EnumToBeDeprecated"),
9+
"owner_type": String("Enum"),
10+
"path": List([
11+
String("enum_variant_marked_deprecated"),
12+
String("EnumToBeDeprecated"),
13+
]),
14+
"span_begin_line": Uint64(18),
15+
"span_end_line": Uint64(21),
16+
"span_filename": String("src/lib.rs"),
17+
"visibility_limit": String("public"),
18+
},
19+
],
720
"./test_crates/struct_field_marked_deprecated/": [
821
{
922
"name": String("BothBecomeDeprecated"),

0 commit comments

Comments
 (0)