From 5769c21f2312b0df30a57ccc81334308427dcb83 Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sat, 13 Jan 2024 17:27:43 -0700 Subject: [PATCH 1/6] chore: negative test for multiple crate versions not working when name contains dashes --- .../12145_with_dashes/Cargo.stderr | 6 ++++++ .../12145_with_dashes/Cargo.toml | 13 +++++++++++++ .../12145_with_dashes/src/main.rs | 3 +++ 3 files changed, 22 insertions(+) create mode 100644 tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr create mode 100644 tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml create mode 100644 tests/ui-cargo/multiple_crate_versions/12145_with_dashes/src/main.rs diff --git a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr new file mode 100644 index 000000000000..24a5402f5429 --- /dev/null +++ b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr @@ -0,0 +1,6 @@ +error: multiple versions for dependency `winapi`: 0.2.8, 0.3.9 + | + = note: `-D clippy::multiple-crate-versions` implied by `-D warnings` + = help: to override `-D warnings` add `#[allow(clippy::multiple_crate_versions)]` + +error: could not compile `multiple-crate-versions-with-dashes` (bin "multiple-crate-versions-with-dashes") due to 1 previous error diff --git a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml new file mode 100644 index 000000000000..8ce6b0d5e5d1 --- /dev/null +++ b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml @@ -0,0 +1,13 @@ +# Should not lint for dev or build dependencies. See issue 5041. + +[package] +name = "multiple-crate-versions-with-dashes" +version = "0.1.0" +publish = false + +[workspace] + +# One of the versions of winapi is only a dev dependency: allowed +[dependencies] +winapi = "0.2" +ansi_term = "=0.11.0" diff --git a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/src/main.rs b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/src/main.rs new file mode 100644 index 000000000000..4bc61dd62992 --- /dev/null +++ b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/src/main.rs @@ -0,0 +1,3 @@ +#![warn(clippy::multiple_crate_versions)] + +fn main() {} From d975e267b951475647c54fa3905f5ff83cb64ae7 Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sat, 13 Jan 2024 17:44:27 -0700 Subject: [PATCH 2/6] fix: add fix for bug, fix test name --- clippy_lints/src/cargo/multiple_crate_versions.rs | 2 +- .../multiple_crate_versions/12145_with_dashes/Cargo.stderr | 2 +- .../multiple_crate_versions/12145_with_dashes/Cargo.toml | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/clippy_lints/src/cargo/multiple_crate_versions.rs b/clippy_lints/src/cargo/multiple_crate_versions.rs index ec681adb7aef..a28934266cbc 100644 --- a/clippy_lints/src/cargo/multiple_crate_versions.rs +++ b/clippy_lints/src/cargo/multiple_crate_versions.rs @@ -16,7 +16,7 @@ pub(super) fn check(cx: &LateContext<'_>, metadata: &Metadata) { if let Some(resolve) = &metadata.resolve && let Some(local_id) = packages.iter().find_map(|p| { - if p.name == local_name.as_str() { + if p.name.replace('-', "_") == local_name.as_str() { Some(&p.id) } else { None diff --git a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr index 24a5402f5429..8f0ca7649249 100644 --- a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr +++ b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.stderr @@ -3,4 +3,4 @@ error: multiple versions for dependency `winapi`: 0.2.8, 0.3.9 = note: `-D clippy::multiple-crate-versions` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::multiple_crate_versions)]` -error: could not compile `multiple-crate-versions-with-dashes` (bin "multiple-crate-versions-with-dashes") due to 1 previous error +error: could not compile `multiple-crate-versions` (bin "multiple-crate-versions") due to 1 previous error diff --git a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml index 8ce6b0d5e5d1..d39ad6c909a8 100644 --- a/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml +++ b/tests/ui-cargo/multiple_crate_versions/12145_with_dashes/Cargo.toml @@ -1,7 +1,8 @@ # Should not lint for dev or build dependencies. See issue 5041. [package] -name = "multiple-crate-versions-with-dashes" +# purposefully separated by - instead of _ +name = "multiple-crate-versions" version = "0.1.0" publish = false From 5d06fbb46d2434c50d3c50695e4a0f0bb187fdb5 Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sun, 14 Jan 2024 09:25:31 -0700 Subject: [PATCH 3/6] fix: don't allocate new string when not needed --- clippy_lints/src/cargo/multiple_crate_versions.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/clippy_lints/src/cargo/multiple_crate_versions.rs b/clippy_lints/src/cargo/multiple_crate_versions.rs index a28934266cbc..8e86c0017e1d 100644 --- a/clippy_lints/src/cargo/multiple_crate_versions.rs +++ b/clippy_lints/src/cargo/multiple_crate_versions.rs @@ -16,7 +16,12 @@ pub(super) fn check(cx: &LateContext<'_>, metadata: &Metadata) { if let Some(resolve) = &metadata.resolve && let Some(local_id) = packages.iter().find_map(|p| { - if p.name.replace('-', "_") == local_name.as_str() { + if p.name + .chars() + .into_iter() + .map(|c| if c == '-' { '_' } else { c }) + .eq(local_name.as_str().chars()) + { Some(&p.id) } else { None From b1c52d502d6c0441c944225287281c70282c1c9b Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sun, 14 Jan 2024 09:32:36 -0700 Subject: [PATCH 4/6] chore: add comments to explain reasoning --- clippy_lints/src/cargo/multiple_crate_versions.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/clippy_lints/src/cargo/multiple_crate_versions.rs b/clippy_lints/src/cargo/multiple_crate_versions.rs index 8e86c0017e1d..c487ffb1c822 100644 --- a/clippy_lints/src/cargo/multiple_crate_versions.rs +++ b/clippy_lints/src/cargo/multiple_crate_versions.rs @@ -16,6 +16,9 @@ pub(super) fn check(cx: &LateContext<'_>, metadata: &Metadata) { if let Some(resolve) = &metadata.resolve && let Some(local_id) = packages.iter().find_map(|p| { + // p.name contains the original crate names with dashes intact + // local_name contains the crate name as a namespace, with the dashes converted to underscores + // the code below temporarily rectifies this discrepancy if p.name .chars() .into_iter() From ea585ef321b6ba63635984772fe576e6a4e461fc Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sun, 14 Jan 2024 09:40:14 -0700 Subject: [PATCH 5/6] chore: remove unneeded into_iter --- clippy_lints/src/cargo/multiple_crate_versions.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/clippy_lints/src/cargo/multiple_crate_versions.rs b/clippy_lints/src/cargo/multiple_crate_versions.rs index c487ffb1c822..6b4af6753c3e 100644 --- a/clippy_lints/src/cargo/multiple_crate_versions.rs +++ b/clippy_lints/src/cargo/multiple_crate_versions.rs @@ -21,7 +21,6 @@ pub(super) fn check(cx: &LateContext<'_>, metadata: &Metadata) { // the code below temporarily rectifies this discrepancy if p.name .chars() - .into_iter() .map(|c| if c == '-' { '_' } else { c }) .eq(local_name.as_str().chars()) { From e8ec99811b80372012d3ece0e0f31f5722785eec Mon Sep 17 00:00:00 2001 From: Kristof Mattei <864376+Kristof-Mattei@users.noreply.github.com> Date: Sun, 14 Jan 2024 14:00:13 -0700 Subject: [PATCH 6/6] fix: crates are limited to ASCII values --- clippy_lints/src/cargo/multiple_crate_versions.rs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/clippy_lints/src/cargo/multiple_crate_versions.rs b/clippy_lints/src/cargo/multiple_crate_versions.rs index 6b4af6753c3e..57b7b7497fe2 100644 --- a/clippy_lints/src/cargo/multiple_crate_versions.rs +++ b/clippy_lints/src/cargo/multiple_crate_versions.rs @@ -20,9 +20,10 @@ pub(super) fn check(cx: &LateContext<'_>, metadata: &Metadata) { // local_name contains the crate name as a namespace, with the dashes converted to underscores // the code below temporarily rectifies this discrepancy if p.name - .chars() - .map(|c| if c == '-' { '_' } else { c }) - .eq(local_name.as_str().chars()) + .as_bytes() + .iter() + .map(|b| if b == &b'-' { &b'_' } else { b }) + .eq(local_name.as_str().as_bytes()) { Some(&p.id) } else {