-
-
Notifications
You must be signed in to change notification settings - Fork 78
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add
function_requires_different_const_generic_params
lint. (#1056)
It catches top-level functions that now use more or fewer const generic parameters. Functions cannot have defaults on their const generics, so we only have one lint here, not two.
- Loading branch information
1 parent
e2159f8
commit a638630
Showing
8 changed files
with
175 additions
and
0 deletions.
There are no files selected for viewing
77 changes: 77 additions & 0 deletions
77
src/lints/function_requires_different_const_generic_params.ron
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
SemverQuery( | ||
id: "function_requires_different_const_generic_params", | ||
human_readable_name: "function now requires a different number of const generic parameters", | ||
// Currently, const generics in functions and methods cannot have defaults set. | ||
// This is why we have only one lint ("requires different number") instead of | ||
// two separate lints ("requires" / "allows") like for structs/traits etc. | ||
description: "A function now requires a different number of const generic parameters than before.", | ||
required_update: Major, | ||
lint_level: Deny, | ||
reference_link: Some("https://doc.rust-lang.org/reference/items/generics.html#const-generics"), | ||
query: r#" | ||
{ | ||
CrateDiff { | ||
baseline { | ||
item { | ||
... on Function { | ||
visibility_limit @filter(op: "=", value: ["$public"]) | ||
name @output | ||
importable_path { | ||
path @tag @output | ||
public_api @filter(op: "=", value: ["$true"]) | ||
} | ||
generic_parameter @fold | ||
@transform(op: "count") | ||
@tag(name: "old_required_const_count") | ||
@output(name: "old_required_const_count") { | ||
... on GenericConstParameter { | ||
old_required_consts: name @output | ||
} | ||
} | ||
} | ||
} | ||
} | ||
current { | ||
item { | ||
... on Function { | ||
visibility_limit @filter(op: "=", value: ["$public"]) @output | ||
importable_path { | ||
path @filter(op: "=", value: ["%path"]) | ||
public_api @filter(op: "=", value: ["$true"]) | ||
} | ||
generic_parameter @fold | ||
@transform(op: "count") | ||
@filter(op: "!=", value: ["%old_required_const_count"]) | ||
@output(name: "new_required_const_count") { | ||
... on GenericConstParameter { | ||
new_required_consts: name @output | ||
} | ||
} | ||
span_: span @optional { | ||
filename @output | ||
begin_line @output | ||
} | ||
} | ||
} | ||
} | ||
} | ||
}"#, | ||
arguments: { | ||
"public": "public", | ||
"true": true, | ||
}, | ||
error_message: "A function now requires a different number of const generic parameters than it used to. Uses of this function that supplied the previous number of const generics will be broken.", | ||
per_result_error_template: Some("function {{name}} ({{old_required_const_count}} -> {{new_required_const_count}} const generics) in {{span_filename}}:{{span_begin_line}}"), | ||
// TODO: see https://github.com/obi1kenobi/cargo-semver-checks/blob/main/CONTRIBUTING.md#adding-a-witness | ||
// for information about this field. | ||
// | ||
// The witness would be a function invocation with the old number | ||
// of const generics, which is insufficient for the new definition. | ||
witness: None, | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
test_crates/function_requires_different_const_generic_params/new/Cargo.toml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
[package] | ||
publish = false | ||
name = "function_requires_different_const_generic_params" | ||
version = "0.1.0" | ||
edition = "2021" | ||
|
||
[dependencies] |
9 changes: 9 additions & 0 deletions
9
test_crates/function_requires_different_const_generic_params/new/src/lib.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
pub fn previously_not_generic<const N: usize>() -> [i64; N] { | ||
todo!() | ||
} | ||
|
||
pub fn add_const_generic<const N: usize, const M: usize>(data: [i64; N]) -> [i64; M] { | ||
todo!() | ||
} | ||
|
||
pub fn remove_const_generic(data: [i64; 8]) {} |
7 changes: 7 additions & 0 deletions
7
test_crates/function_requires_different_const_generic_params/old/Cargo.toml
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
[package] | ||
publish = false | ||
name = "function_requires_different_const_generic_params" | ||
version = "0.1.0" | ||
edition = "2021" | ||
|
||
[dependencies] |
5 changes: 5 additions & 0 deletions
5
test_crates/function_requires_different_const_generic_params/old/src/lib.rs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
pub fn previously_not_generic() {} | ||
|
||
pub fn add_const_generic<const N: usize>(data: [i64; N]) {} | ||
|
||
pub fn remove_const_generic<const M: usize>(data: [i64; M]) {} |
60 changes: 60 additions & 0 deletions
60
test_outputs/query_execution/function_requires_different_const_generic_params.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
--- | ||
source: src/query.rs | ||
expression: "&query_execution_results" | ||
snapshot_kind: text | ||
--- | ||
{ | ||
"./test_crates/function_requires_different_const_generic_params/": [ | ||
{ | ||
"name": String("previously_not_generic"), | ||
"new_required_const_count": Uint64(1), | ||
"new_required_consts": List([ | ||
String("N"), | ||
]), | ||
"old_required_const_count": Uint64(0), | ||
"old_required_consts": List([]), | ||
"path": List([ | ||
String("function_requires_different_const_generic_params"), | ||
String("previously_not_generic"), | ||
]), | ||
"span_begin_line": Uint64(1), | ||
"span_filename": String("src/lib.rs"), | ||
"visibility_limit": String("public"), | ||
}, | ||
{ | ||
"name": String("add_const_generic"), | ||
"new_required_const_count": Uint64(2), | ||
"new_required_consts": List([ | ||
String("N"), | ||
String("M"), | ||
]), | ||
"old_required_const_count": Uint64(1), | ||
"old_required_consts": List([ | ||
String("N"), | ||
]), | ||
"path": List([ | ||
String("function_requires_different_const_generic_params"), | ||
String("add_const_generic"), | ||
]), | ||
"span_begin_line": Uint64(5), | ||
"span_filename": String("src/lib.rs"), | ||
"visibility_limit": String("public"), | ||
}, | ||
{ | ||
"name": String("remove_const_generic"), | ||
"new_required_const_count": Uint64(0), | ||
"new_required_consts": List([]), | ||
"old_required_const_count": Uint64(1), | ||
"old_required_consts": List([ | ||
String("M"), | ||
]), | ||
"path": List([ | ||
String("function_requires_different_const_generic_params"), | ||
String("remove_const_generic"), | ||
]), | ||
"span_begin_line": Uint64(9), | ||
"span_filename": String("src/lib.rs"), | ||
"visibility_limit": String("public"), | ||
}, | ||
], | ||
} |
9 changes: 9 additions & 0 deletions
9
test_outputs/query_execution/function_requires_more_const_generic_params.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
--- | ||
source: src/query.rs | ||
expression: "&query_execution_results" | ||
--- | ||
{ | ||
"./test_crates/function_requires_more_const_generic_params/": [ | ||
// TODO | ||
] | ||
} |