Skip to content

Commit 87cb840

Browse files
Merge #6124
6124: Better normalized crate name usage r=jonas-schievink a=SomeoneToIgnore Closes #5343 Closes #5932 Uses normalized name for code snippets (to be able to test the fix), hover messages and documentation rewrite links (are there any tests for those?). Also renamed the field to better resemble the semantics. Co-authored-by: Kirill Bulatov <mail4score@gmail.com>
2 parents af0e54a + 9d19e5b commit 87cb840

File tree

10 files changed

+64
-31
lines changed

10 files changed

+64
-31
lines changed

crates/base_db/src/fixture.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -154,19 +154,19 @@ impl ChangeFixture {
154154
assert!(meta.path.starts_with(&source_root_prefix));
155155

156156
if let Some(krate) = meta.krate {
157+
let crate_name = CrateName::normalize_dashes(&krate);
157158
let crate_id = crate_graph.add_crate_root(
158159
file_id,
159160
meta.edition,
160-
Some(krate.clone()),
161+
Some(crate_name.clone()),
161162
meta.cfg,
162163
meta.env,
163164
Default::default(),
164165
);
165-
let crate_name = CrateName::new(&krate).unwrap();
166166
let prev = crates.insert(crate_name.clone(), crate_id);
167167
assert!(prev.is_none());
168168
for dep in meta.deps {
169-
let dep = CrateName::new(&dep).unwrap();
169+
let dep = CrateName::normalize_dashes(&dep);
170170
crate_deps.push((crate_name.clone(), dep))
171171
}
172172
} else if meta.path == "/main.rs" || meta.path == "/lib.rs" {
@@ -187,7 +187,7 @@ impl ChangeFixture {
187187
crate_graph.add_crate_root(
188188
crate_root,
189189
Edition::Edition2018,
190-
Some("test".to_string()),
190+
Some(CrateName::new("test").unwrap()),
191191
default_cfg,
192192
Env::default(),
193193
Default::default(),

crates/base_db/src/input.rs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -127,10 +127,11 @@ impl PartialEq for ProcMacro {
127127
pub struct CrateData {
128128
pub root_file_id: FileId,
129129
pub edition: Edition,
130-
/// The name to display to the end user.
131-
/// This actual crate name can be different in a particular dependent crate
132-
/// or may even be missing for some cases, such as a dummy crate for the code snippet.
133-
pub display_name: Option<String>,
130+
/// A name used in the package's project declaration: for Cargo projects, it's [package].name,
131+
/// can be different for other project types or even absent (a dummy crate for the code snippet, for example).
132+
/// NOTE: The crate can be referenced as a dependency under a different name,
133+
/// this one should be used when working with crate hierarchies.
134+
pub declaration_name: Option<CrateName>,
134135
pub cfg_options: CfgOptions,
135136
pub env: Env,
136137
pub dependencies: Vec<Dependency>,
@@ -159,7 +160,7 @@ impl CrateGraph {
159160
&mut self,
160161
file_id: FileId,
161162
edition: Edition,
162-
display_name: Option<String>,
163+
declaration_name: Option<CrateName>,
163164
cfg_options: CfgOptions,
164165
env: Env,
165166
proc_macro: Vec<(SmolStr, Arc<dyn tt::TokenExpander>)>,
@@ -170,7 +171,7 @@ impl CrateGraph {
170171
let data = CrateData {
171172
root_file_id: file_id,
172173
edition,
173-
display_name,
174+
declaration_name,
174175
cfg_options,
175176
env,
176177
proc_macro,

crates/hir/src/code_model.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
use std::{iter, sync::Arc};
33

44
use arrayvec::ArrayVec;
5-
use base_db::{CrateId, Edition, FileId};
5+
use base_db::{CrateId, CrateName, Edition, FileId};
66
use either::Either;
77
use hir_def::find_path::PrefixKind;
88
use hir_def::{
@@ -99,8 +99,8 @@ impl Crate {
9999
db.crate_graph()[self.id].edition
100100
}
101101

102-
pub fn display_name(self, db: &dyn HirDatabase) -> Option<String> {
103-
db.crate_graph()[self.id].display_name.clone()
102+
pub fn declaration_name(self, db: &dyn HirDatabase) -> Option<CrateName> {
103+
db.crate_graph()[self.id].declaration_name.clone()
104104
}
105105

106106
pub fn query_external_importables(

crates/hir_def/src/import_map.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -334,14 +334,14 @@ mod tests {
334334

335335
use super::*;
336336

337-
fn check_search(ra_fixture: &str, krate_name: &str, query: Query, expect: Expect) {
337+
fn check_search(ra_fixture: &str, crate_name: &str, query: Query, expect: Expect) {
338338
let db = TestDB::with_files(ra_fixture);
339339
let crate_graph = db.crate_graph();
340340
let krate = crate_graph
341341
.iter()
342342
.find(|krate| {
343-
crate_graph[*krate].display_name.as_ref().map(|n| n.to_string())
344-
== Some(krate_name.to_string())
343+
crate_graph[*krate].declaration_name.as_ref().map(|n| n.to_string())
344+
== Some(crate_name.to_string())
345345
})
346346
.unwrap();
347347

@@ -359,7 +359,7 @@ mod tests {
359359
let path = map.path_of(item).unwrap();
360360
format!(
361361
"{}::{} ({})\n",
362-
crate_graph[krate].display_name.as_ref().unwrap(),
362+
crate_graph[krate].declaration_name.as_ref().unwrap(),
363363
path,
364364
mark
365365
)
@@ -400,7 +400,7 @@ mod tests {
400400
.iter()
401401
.filter_map(|krate| {
402402
let cdata = &crate_graph[krate];
403-
let name = cdata.display_name.as_ref()?;
403+
let name = cdata.declaration_name.as_ref()?;
404404

405405
let map = db.import_map(krate);
406406

crates/hir_def/src/nameres.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ impl CrateDefMap {
173173
pub(crate) fn crate_def_map_query(db: &dyn DefDatabase, krate: CrateId) -> Arc<CrateDefMap> {
174174
let _p = profile::span("crate_def_map_query").detail(|| {
175175
db.crate_graph()[krate]
176-
.display_name
176+
.declaration_name
177177
.as_ref()
178178
.map(ToString::to_string)
179179
.unwrap_or_default()

crates/ide/src/hover.rs

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ fn definition_owner_name(db: &RootDatabase, def: &Definition) -> Option<String>
289289

290290
fn render_path(db: &RootDatabase, module: Module, item_name: Option<String>) -> String {
291291
let crate_name =
292-
db.crate_graph()[module.krate().into()].display_name.as_ref().map(ToString::to_string);
292+
db.crate_graph()[module.krate().into()].declaration_name.as_ref().map(ToString::to_string);
293293
let module_path = module
294294
.path_to_root(db)
295295
.into_iter()
@@ -3163,4 +3163,34 @@ fn main() { let s<|>t = test().get(); }
31633163
"#]],
31643164
);
31653165
}
3166+
3167+
#[test]
3168+
fn hover_displays_normalized_crate_names() {
3169+
check(
3170+
r#"
3171+
//- /lib.rs crate:name-with-dashes
3172+
pub mod wrapper {
3173+
pub struct Thing { x: u32 }
3174+
3175+
impl Thing {
3176+
pub fn new() -> Thing { Thing { x: 0 } }
3177+
}
3178+
}
3179+
3180+
//- /main.rs crate:main deps:name-with-dashes
3181+
fn main() { let foo_test = name_with_dashes::wrapper::Thing::new<|>(); }
3182+
"#,
3183+
expect![[r#"
3184+
*new*
3185+
3186+
```rust
3187+
name_with_dashes::wrapper::Thing
3188+
```
3189+
3190+
```rust
3191+
pub fn new() -> Thing
3192+
```
3193+
"#]],
3194+
)
3195+
}
31663196
}

crates/ide/src/link_rewrite.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ fn rewrite_intra_doc_link(
107107
let krate = resolved.module(db)?.krate();
108108
let canonical_path = resolved.canonical_path(db)?;
109109
let new_target = get_doc_url(db, &krate)?
110-
.join(&format!("{}/", krate.display_name(db)?))
110+
.join(&format!("{}/", krate.declaration_name(db)?))
111111
.ok()?
112112
.join(&canonical_path.replace("::", "/"))
113113
.ok()?
@@ -127,7 +127,7 @@ fn rewrite_url_link(db: &RootDatabase, def: ModuleDef, target: &str) -> Option<S
127127
let module = def.module(db)?;
128128
let krate = module.krate();
129129
let canonical_path = def.canonical_path(db)?;
130-
let base = format!("{}/{}", krate.display_name(db)?, canonical_path.replace("::", "/"));
130+
let base = format!("{}/{}", krate.declaration_name(db)?, canonical_path.replace("::", "/"));
131131

132132
get_doc_url(db, &krate)
133133
.and_then(|url| url.join(&base).ok())
@@ -248,7 +248,7 @@ fn get_doc_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
248248
//
249249
// FIXME: clicking on the link should just open the file in the editor,
250250
// instead of falling back to external urls.
251-
Some(format!("https://docs.rs/{}/*/", krate.display_name(db)?))
251+
Some(format!("https://docs.rs/{}/*/", krate.declaration_name(db)?))
252252
})
253253
.and_then(|s| Url::parse(&s).ok())
254254
}

crates/ide/src/status.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub(crate) fn status(db: &RootDatabase, file_id: Option<FileId>) -> String {
4545
match krate {
4646
Some(krate) => {
4747
let crate_graph = db.crate_graph();
48-
let display_crate = |krate: CrateId| match &crate_graph[krate].display_name {
48+
let display_crate = |krate: CrateId| match &crate_graph[krate].declaration_name {
4949
Some(it) => format!("{}({:?})", it, krate),
5050
None => format!("{:?}", krate),
5151
};

crates/project_model/src/lib.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -411,7 +411,7 @@ impl ProjectWorkspace {
411411
let crate_id = crate_graph.add_crate_root(
412412
file_id,
413413
edition,
414-
Some(cargo[pkg].name.clone()),
414+
Some(CrateName::normalize_dashes(&cargo[pkg].name)),
415415
cfg_options,
416416
env,
417417
proc_macro.clone(),
@@ -546,7 +546,8 @@ fn sysroot_to_crate_graph(
546546

547547
let env = Env::default();
548548
let proc_macro = vec![];
549-
let name = sysroot[krate].name.clone();
549+
let name = CrateName::new(&sysroot[krate].name)
550+
.expect("Sysroot crates' names do not contain dashes");
550551
let crate_id = crate_graph.add_crate_root(
551552
file_id,
552553
Edition::Edition2018,

crates/rust-analyzer/src/cli/diagnostics.rs

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,12 @@ pub fn diagnostics(path: &Path, load_output_dirs: bool, with_proc_macro: bool) -
3636
for module in work {
3737
let file_id = module.definition_source(db).file_id.original_file(db);
3838
if !visited_files.contains(&file_id) {
39-
let crate_name = if let Some(name) = module.krate().display_name(db) {
40-
format!("{}", name)
41-
} else {
42-
String::from("unknown")
43-
};
39+
let crate_name = module
40+
.krate()
41+
.declaration_name(db)
42+
.as_ref()
43+
.map(ToString::to_string)
44+
.unwrap_or_else(|| "unknown".to_string());
4445
println!("processing crate: {}, module: {}", crate_name, _vfs.file_path(file_id));
4546
for diagnostic in analysis.diagnostics(&DiagnosticsConfig::default(), file_id).unwrap()
4647
{

0 commit comments

Comments
 (0)