Skip to content

Commit ccd77a3

Browse files
committed
Make names implementation-agnostic
1 parent f026409 commit ccd77a3

File tree

6 files changed

+31
-31
lines changed

6 files changed

+31
-31
lines changed

src/cargo/core/package_id_spec.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@ use serde::{de, ser};
77
use url::Url;
88

99
use crate::core::PackageId;
10+
use crate::util::edit_distance;
1011
use crate::util::errors::CargoResult;
1112
use crate::util::interning::InternedString;
12-
use crate::util::lev_distance;
1313
use crate::util::{validate_package_name, IntoUrl, ToSemver};
1414

1515
/// Some or all of the data required to identify a package:
@@ -88,7 +88,7 @@ impl PackageIdSpec {
8888
{
8989
let i: Vec<_> = i.into_iter().collect();
9090
let spec = PackageIdSpec::parse(spec).with_context(|| {
91-
let suggestion = lev_distance::closest_msg(spec, i.iter(), |id| id.name().as_str());
91+
let suggestion = edit_distance::closest_msg(spec, i.iter(), |id| id.name().as_str());
9292
format!("invalid package ID specification: `{}`{}", spec, suggestion)
9393
})?;
9494
spec.query(i)
@@ -229,7 +229,7 @@ impl PackageIdSpec {
229229
);
230230
}
231231
if suggestion.is_empty() {
232-
suggestion.push_str(&lev_distance::closest_msg(
232+
suggestion.push_str(&edit_distance::closest_msg(
233233
&self.name,
234234
all_ids.iter(),
235235
|id| id.name().as_str(),

src/cargo/core/resolver/errors.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ use std::fmt;
22
use std::task::Poll;
33

44
use crate::core::{Dependency, PackageId, QueryKind, Registry, Summary};
5-
use crate::util::lev_distance::lev_distance;
5+
use crate::util::edit_distance::edit_distance;
66
use crate::util::{Config, VersionExt};
77
use anyhow::Error;
88

@@ -308,7 +308,7 @@ pub(super) fn activation_error(
308308
candidates.dedup_by(|a, b| a.name() == b.name());
309309
let mut candidates: Vec<_> = candidates
310310
.iter()
311-
.filter_map(|n| Some((lev_distance(&*new_dep.package_name(), &*n.name(), 3)?, n)))
311+
.filter_map(|n| Some((edit_distance(&*new_dep.package_name(), &*n.name(), 3)?, n)))
312312
.collect();
313313
candidates.sort_by_key(|o| o.0);
314314
let mut msg: String;

src/cargo/core/workspace.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ use crate::core::{Dependency, FeatureValue, PackageId, PackageIdSpec};
1919
use crate::core::{EitherManifest, Package, SourceId, VirtualManifest};
2020
use crate::ops;
2121
use crate::sources::{PathSource, CRATES_IO_INDEX, CRATES_IO_REGISTRY};
22+
use crate::util::edit_distance;
2223
use crate::util::errors::{CargoResult, ManifestError};
2324
use crate::util::interning::InternedString;
24-
use crate::util::lev_distance;
2525
use crate::util::toml::{read_manifest, InheritableFields, TomlDependency, TomlProfiles};
2626
use crate::util::{config::ConfigRelativePath, Config, Filesystem, IntoUrl};
2727
use cargo_util::paths;
@@ -1245,8 +1245,8 @@ impl<'cfg> Workspace<'cfg> {
12451245
optional_dependency_names_per_member.insert(member, optional_dependency_names_raw);
12461246
}
12471247

1248-
let levenshtein_test = |a: InternedString, b: InternedString| {
1249-
lev_distance(a.as_str(), b.as_str(), 3).is_some()
1248+
let edit_distance_test = |a: InternedString, b: InternedString| {
1249+
edit_distance(a.as_str(), b.as_str(), 3).is_some()
12501250
};
12511251

12521252
let suggestions: Vec<_> = cli_features
@@ -1258,12 +1258,12 @@ impl<'cfg> Workspace<'cfg> {
12581258
// Finds member features which are similar to the requested feature.
12591259
let summary_features = summary_features
12601260
.iter()
1261-
.filter(move |feature| levenshtein_test(**feature, *typo));
1261+
.filter(move |feature| edit_distance_test(**feature, *typo));
12621262

12631263
// Finds optional dependencies which name is similar to the feature
12641264
let optional_dependency_features = optional_dependency_names
12651265
.iter()
1266-
.filter(move |feature| levenshtein_test(**feature, *typo));
1266+
.filter(move |feature| edit_distance_test(**feature, *typo));
12671267

12681268
summary_features
12691269
.chain(optional_dependency_features)
@@ -1279,13 +1279,13 @@ impl<'cfg> Workspace<'cfg> {
12791279
// Finds set of `pkg/feat` that are very similar to current `pkg/feat`.
12801280
let pkg_feat_similar = dependencies_features
12811281
.iter()
1282-
.filter(|(name, _)| levenshtein_test(**name, *dep_name))
1282+
.filter(|(name, _)| edit_distance_test(**name, *dep_name))
12831283
.map(|(name, features)| {
12841284
(
12851285
name,
12861286
features
12871287
.iter()
1288-
.filter(|feature| levenshtein_test(**feature, *dep_feature))
1288+
.filter(|feature| edit_distance_test(**feature, *dep_feature))
12891289
.collect::<Vec<_>>(),
12901290
)
12911291
})
@@ -1299,12 +1299,12 @@ impl<'cfg> Workspace<'cfg> {
12991299
// Finds set of `member/optional_dep` features which name is similar to current `pkg/feat`.
13001300
let optional_dependency_features = optional_dependency_names_per_member
13011301
.iter()
1302-
.filter(|(package, _)| levenshtein_test(package.name(), *dep_name))
1302+
.filter(|(package, _)| edit_distance_test(package.name(), *dep_name))
13031303
.map(|(package, optional_dependencies)| {
13041304
optional_dependencies
13051305
.into_iter()
13061306
.filter(|optional_dependency| {
1307-
levenshtein_test(**optional_dependency, *dep_name)
1307+
edit_distance_test(**optional_dependency, *dep_name)
13081308
})
13091309
.map(move |optional_dependency| {
13101310
format!("{}/{}", package.name(), optional_dependency)
@@ -1315,12 +1315,12 @@ impl<'cfg> Workspace<'cfg> {
13151315
// Finds set of `member/feat` features which name is similar to current `pkg/feat`.
13161316
let summary_features = summary_features_per_member
13171317
.iter()
1318-
.filter(|(package, _)| levenshtein_test(package.name(), *dep_name))
1318+
.filter(|(package, _)| edit_distance_test(package.name(), *dep_name))
13191319
.map(|(package, summary_features)| {
13201320
summary_features
13211321
.into_iter()
13221322
.filter(|summary_feature| {
1323-
levenshtein_test(**summary_feature, *dep_feature)
1323+
edit_distance_test(**summary_feature, *dep_feature)
13241324
})
13251325
.map(move |summary_feature| {
13261326
format!("{}/{}", package.name(), summary_feature)

src/cargo/ops/cargo_clean.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ use crate::core::compiler::{CompileKind, CompileMode, Layout, RustcTargetData};
22
use crate::core::profiles::Profiles;
33
use crate::core::{PackageIdSpec, TargetKind, Workspace};
44
use crate::ops;
5+
use crate::util::edit_distance;
56
use crate::util::errors::CargoResult;
67
use crate::util::interning::InternedString;
7-
use crate::util::lev_distance;
88
use crate::util::{Config, Progress, ProgressStyle};
99

1010
use anyhow::Context as _;
@@ -118,7 +118,7 @@ pub fn clean(ws: &Workspace<'_>, opts: &CleanOptions<'_>) -> CargoResult<()> {
118118
let matches: Vec<_> = resolve.iter().filter(|id| spec.matches(*id)).collect();
119119
if matches.is_empty() {
120120
let mut suggestion = String::new();
121-
suggestion.push_str(&lev_distance::closest_msg(
121+
suggestion.push_str(&edit_distance::closest_msg(
122122
&spec.name(),
123123
resolve.iter(),
124124
|id| id.name().as_str(),

src/cargo/util/lev_distance.rs renamed to src/cargo/util/edit_distance.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use std::{cmp, mem};
55
/// Returns `None` if the distance exceeds the limit.
66
///
77
/// [edit distance]: https://en.wikipedia.org/wiki/Edit_distance
8-
pub fn lev_distance(a: &str, b: &str, limit: usize) -> Option<usize> {
8+
pub fn edit_distance(a: &str, b: &str, limit: usize) -> Option<usize> {
99
// Comparing the strings lowercased will result in a difference in capitalization being less distance away
1010
// than being a completely different letter. Otherwise `CHECK` is as far away from `check` as it
1111
// is from `build` (both with a distance of 5). For a single letter shortcut (e.g. `b` or `c`), they will
@@ -100,9 +100,9 @@ pub fn closest<'a, T>(
100100
iter: impl Iterator<Item = T>,
101101
key: impl Fn(&T) -> &'a str,
102102
) -> Option<T> {
103-
// Only consider candidates with a lev_distance of 3 or less so we don't
103+
// Only consider candidates with an edit distance of 3 or less so we don't
104104
// suggest out-of-the-blue options.
105-
iter.filter_map(|e| Some((lev_distance(choice, key(&e), 3)?, e)))
105+
iter.filter_map(|e| Some((edit_distance(choice, key(&e), 3)?, e)))
106106
.min_by_key(|t| t.0)
107107
.map(|t| t.1)
108108
}
@@ -121,23 +121,23 @@ pub fn closest_msg<'a, T>(
121121
}
122122

123123
#[test]
124-
fn test_lev_distance() {
124+
fn test_edit_distance() {
125125
use std::char::{from_u32, MAX};
126126
// Test bytelength agnosticity
127127
for c in (0u32..MAX as u32)
128128
.filter_map(from_u32)
129129
.map(|i| i.to_string())
130130
{
131-
assert_eq!(lev_distance(&c, &c, usize::MAX), Some(0));
131+
assert_eq!(edit_distance(&c, &c, usize::MAX), Some(0));
132132
}
133133

134134
let a = "\nMäry häd ä little lämb\n\nLittle lämb\n";
135135
let b = "\nMary häd ä little lämb\n\nLittle lämb\n";
136136
let c = "Mary häd ä little lämb\n\nLittle lämb\n";
137-
assert_eq!(lev_distance(a, b, usize::MAX), Some(1));
138-
assert_eq!(lev_distance(b, a, usize::MAX), Some(1));
139-
assert_eq!(lev_distance(a, c, usize::MAX), Some(2));
140-
assert_eq!(lev_distance(c, a, usize::MAX), Some(2));
141-
assert_eq!(lev_distance(b, c, usize::MAX), Some(1));
142-
assert_eq!(lev_distance(c, b, usize::MAX), Some(1));
137+
assert_eq!(edit_distance(a, b, usize::MAX), Some(1));
138+
assert_eq!(edit_distance(b, a, usize::MAX), Some(1));
139+
assert_eq!(edit_distance(a, c, usize::MAX), Some(2));
140+
assert_eq!(edit_distance(c, a, usize::MAX), Some(2));
141+
assert_eq!(edit_distance(b, c, usize::MAX), Some(1));
142+
assert_eq!(edit_distance(c, b, usize::MAX), Some(1));
143143
}

src/cargo/util/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub use self::config::{homedir, Config, ConfigValue};
77
pub(crate) use self::counter::MetricsCounter;
88
pub use self::dependency_queue::DependencyQueue;
99
pub use self::diagnostic_server::RustfixDiagnosticServer;
10+
pub use self::edit_distance::{closest, closest_msg, edit_distance};
1011
pub use self::errors::CliError;
1112
pub use self::errors::{internal, CargoResult, CliResult};
1213
pub use self::flock::{FileLock, Filesystem};
@@ -16,7 +17,6 @@ pub use self::hex::{hash_u64, short_hash, to_hex};
1617
pub use self::into_url::IntoUrl;
1718
pub use self::into_url_with_base::IntoUrlWithBase;
1819
pub(crate) use self::io::LimitErrorReader;
19-
pub use self::lev_distance::{closest, closest_msg, lev_distance};
2020
pub use self::lockserver::{LockServer, LockServerClient, LockServerStarted};
2121
pub use self::progress::{Progress, ProgressStyle};
2222
pub use self::queue::Queue;
@@ -38,6 +38,7 @@ mod counter;
3838
pub mod cpu;
3939
mod dependency_queue;
4040
pub mod diagnostic_server;
41+
pub mod edit_distance;
4142
pub mod errors;
4243
mod flock;
4344
pub mod graph;
@@ -49,7 +50,6 @@ pub mod into_url;
4950
mod into_url_with_base;
5051
mod io;
5152
pub mod job;
52-
pub mod lev_distance;
5353
mod lockserver;
5454
pub mod machine_message;
5555
pub mod network;

0 commit comments

Comments
 (0)