Skip to content

Commit 2b99526

Browse files
Normalize dashes in crate names
1 parent c9e1aab commit 2b99526

File tree

1 file changed

+33
-8
lines changed

1 file changed

+33
-8
lines changed

crates/ra_db/src/input.rs

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,17 @@ pub struct CrateGraph {
8383
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
8484
pub struct CrateId(pub u32);
8585

86+
pub struct CrateName(SmolStr);
87+
88+
impl<T: AsRef<str>> From<T> for CrateName {
89+
fn from(name: T) -> Self {
90+
// For root projects with dashes in their name,
91+
// cargo metadata does not do any normalization
92+
// so we do it ourselves
93+
Self(SmolStr::new(name.as_ref().replace('-', "_")))
94+
}
95+
}
96+
8697
#[derive(Debug, Clone, PartialEq, Eq)]
8798
struct CrateData {
8899
file_id: FileId,
@@ -131,13 +142,13 @@ impl CrateGraph {
131142
pub fn add_dep(
132143
&mut self,
133144
from: CrateId,
134-
name: SmolStr,
145+
name: CrateName,
135146
to: CrateId,
136147
) -> Result<(), CyclicDependenciesError> {
137148
if self.dfs_find(from, to, &mut FxHashSet::default()) {
138149
return Err(CyclicDependenciesError);
139150
}
140-
self.arena.get_mut(&from).unwrap().add_dep(name, to);
151+
self.arena.get_mut(&from).unwrap().add_dep(name.0, to);
141152
Ok(())
142153
}
143154

@@ -268,7 +279,7 @@ pub struct CyclicDependenciesError;
268279

269280
#[cfg(test)]
270281
mod tests {
271-
use super::{CfgOptions, CrateGraph, Edition::Edition2018, Env, FileId, SmolStr};
282+
use super::{CfgOptions, CrateGraph, Dependency, Edition::Edition2018, Env, FileId};
272283

273284
#[test]
274285
fn it_should_panic_because_of_cycle_dependencies() {
@@ -279,9 +290,9 @@ mod tests {
279290
graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), Env::default());
280291
let crate3 =
281292
graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), Env::default());
282-
assert!(graph.add_dep(crate1, SmolStr::new("crate2"), crate2).is_ok());
283-
assert!(graph.add_dep(crate2, SmolStr::new("crate3"), crate3).is_ok());
284-
assert!(graph.add_dep(crate3, SmolStr::new("crate1"), crate1).is_err());
293+
assert!(graph.add_dep(crate1, "crate2".into(), crate2).is_ok());
294+
assert!(graph.add_dep(crate2, "crate3".into(), crate3).is_ok());
295+
assert!(graph.add_dep(crate3, "crate1".into(), crate1).is_err());
285296
}
286297

287298
#[test]
@@ -293,7 +304,21 @@ mod tests {
293304
graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), Env::default());
294305
let crate3 =
295306
graph.add_crate_root(FileId(3u32), Edition2018, CfgOptions::default(), Env::default());
296-
assert!(graph.add_dep(crate1, SmolStr::new("crate2"), crate2).is_ok());
297-
assert!(graph.add_dep(crate2, SmolStr::new("crate3"), crate3).is_ok());
307+
assert!(graph.add_dep(crate1, "crate2".into(), crate2).is_ok());
308+
assert!(graph.add_dep(crate2, "crate3".into(), crate3).is_ok());
309+
}
310+
311+
#[test]
312+
fn dashes_are_normalized() {
313+
let mut graph = CrateGraph::default();
314+
let crate1 =
315+
graph.add_crate_root(FileId(1u32), Edition2018, CfgOptions::default(), Env::default());
316+
let crate2 =
317+
graph.add_crate_root(FileId(2u32), Edition2018, CfgOptions::default(), Env::default());
318+
assert!(graph.add_dep(crate1, "crate-name-with-dashes".into(), crate2).is_ok());
319+
assert_eq!(
320+
graph.dependencies(crate1).collect::<Vec<_>>(),
321+
vec![&Dependency { crate_id: crate2, name: "crate_name_with_dashes".into() }]
322+
);
298323
}
299324
}

0 commit comments

Comments
 (0)