Skip to content

Commit 1c24f57

Browse files
bors[bot]matklad
andauthored
Merge #6295
6295: More type safety around names r=matklad a=matklad bors r+ 🤖 Co-authored-by: Aleksey Kladov <[email protected]>
2 parents be762cc + 3b1a648 commit 1c24f57

File tree

14 files changed

+76
-47
lines changed

14 files changed

+76
-47
lines changed

crates/assists/src/utils.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ pub use prelude::*;
406406
let std_crate = path.next()?;
407407
let std_crate = if self
408408
.1
409-
.declaration_name(db)
409+
.display_name(db)
410410
.map(|name| name.to_string() == std_crate)
411411
.unwrap_or(false)
412412
{

crates/base_db/src/fixture.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ impl ChangeFixture {
158158
let crate_id = crate_graph.add_crate_root(
159159
file_id,
160160
meta.edition,
161-
Some(crate_name.clone()),
161+
Some(crate_name.clone().into()),
162162
meta.cfg,
163163
meta.env,
164164
Default::default(),
@@ -187,7 +187,7 @@ impl ChangeFixture {
187187
crate_graph.add_crate_root(
188188
crate_root,
189189
Edition::Edition2018,
190-
Some(CrateName::new("test").unwrap()),
190+
Some(CrateName::new("test").unwrap().into()),
191191
default_cfg,
192192
Env::default(),
193193
Default::default(),

crates/base_db/src/input.rs

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -102,11 +102,46 @@ impl fmt::Display for CrateName {
102102

103103
impl ops::Deref for CrateName {
104104
type Target = str;
105-
fn deref(&self) -> &Self::Target {
105+
fn deref(&self) -> &str {
106106
&*self.0
107107
}
108108
}
109109

110+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
111+
pub struct CrateDisplayName {
112+
// The name we use to display various paths (with `_`).
113+
crate_name: CrateName,
114+
// The name as specified in Cargo.toml (with `-`).
115+
canonical_name: String,
116+
}
117+
118+
impl From<CrateName> for CrateDisplayName {
119+
fn from(crate_name: CrateName) -> CrateDisplayName {
120+
let canonical_name = crate_name.to_string();
121+
CrateDisplayName { crate_name, canonical_name }
122+
}
123+
}
124+
125+
impl fmt::Display for CrateDisplayName {
126+
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
127+
write!(f, "{}", self.crate_name)
128+
}
129+
}
130+
131+
impl ops::Deref for CrateDisplayName {
132+
type Target = str;
133+
fn deref(&self) -> &str {
134+
&*self.crate_name
135+
}
136+
}
137+
138+
impl CrateDisplayName {
139+
pub fn from_canonical_name(canonical_name: String) -> CrateDisplayName {
140+
let crate_name = CrateName::normalize_dashes(&canonical_name);
141+
CrateDisplayName { crate_name, canonical_name }
142+
}
143+
}
144+
110145
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
111146
pub struct ProcMacroId(pub u32);
112147

@@ -127,11 +162,13 @@ impl PartialEq for ProcMacro {
127162
pub struct CrateData {
128163
pub root_file_id: FileId,
129164
pub edition: Edition,
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>,
165+
/// A name used in the package's project declaration: for Cargo projects,
166+
/// it's [package].name, can be different for other project types or even
167+
/// absent (a dummy crate for the code snippet, for example).
168+
///
169+
/// For purposes of analysis, crates are anonymous (only names in
170+
/// `Dependency` matters), this name should only be used for UI.
171+
pub display_name: Option<CrateDisplayName>,
135172
pub cfg_options: CfgOptions,
136173
pub env: Env,
137174
pub dependencies: Vec<Dependency>,
@@ -160,7 +197,7 @@ impl CrateGraph {
160197
&mut self,
161198
file_id: FileId,
162199
edition: Edition,
163-
declaration_name: Option<CrateName>,
200+
display_name: Option<CrateDisplayName>,
164201
cfg_options: CfgOptions,
165202
env: Env,
166203
proc_macro: Vec<(SmolStr, Arc<dyn tt::TokenExpander>)>,
@@ -171,7 +208,7 @@ impl CrateGraph {
171208
let data = CrateData {
172209
root_file_id: file_id,
173210
edition,
174-
declaration_name,
211+
display_name,
175212
cfg_options,
176213
env,
177214
proc_macro,
@@ -310,8 +347,8 @@ impl CrateGraph {
310347
}
311348
}
312349

313-
fn hacky_find_crate(&self, declaration_name: &str) -> Option<CrateId> {
314-
self.iter().find(|it| self[*it].declaration_name.as_deref() == Some(declaration_name))
350+
fn hacky_find_crate(&self, display_name: &str) -> Option<CrateId> {
351+
self.iter().find(|it| self[*it].display_name.as_deref() == Some(display_name))
315352
}
316353
}
317354

crates/base_db/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ pub use crate::{
1313
cancellation::Canceled,
1414
change::Change,
1515
input::{
16-
CrateData, CrateGraph, CrateId, CrateName, Dependency, Edition, Env, FileId, ProcMacroId,
17-
SourceRoot, SourceRootId,
16+
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, Dependency, Edition, Env,
17+
FileId, ProcMacroId, SourceRoot, SourceRootId,
1818
},
1919
};
2020
pub use salsa;

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, CrateName, Edition, FileId};
5+
use base_db::{CrateDisplayName, CrateId, Edition, FileId};
66
use either::Either;
77
use hir_def::find_path::PrefixKind;
88
use hir_def::{
@@ -103,8 +103,8 @@ impl Crate {
103103
db.crate_graph()[self.id].edition
104104
}
105105

106-
pub fn declaration_name(self, db: &dyn HirDatabase) -> Option<CrateName> {
107-
db.crate_graph()[self.id].declaration_name.clone()
106+
pub fn display_name(self, db: &dyn HirDatabase) -> Option<CrateDisplayName> {
107+
db.crate_graph()[self.id].display_name.clone()
108108
}
109109

110110
pub fn query_external_importables(

crates/hir_def/src/import_map.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ mod tests {
356356
let krate = crate_graph
357357
.iter()
358358
.find(|krate| {
359-
crate_graph[*krate].declaration_name.as_ref().map(|n| n.to_string())
359+
crate_graph[*krate].display_name.as_ref().map(|n| n.to_string())
360360
== Some(crate_name.to_string())
361361
})
362362
.unwrap();
@@ -375,7 +375,7 @@ mod tests {
375375
let path = map.path_of(item).unwrap();
376376
format!(
377377
"{}::{} ({})\n",
378-
crate_graph[krate].declaration_name.as_ref().unwrap(),
378+
crate_graph[krate].display_name.as_ref().unwrap(),
379379
path,
380380
mark
381381
)
@@ -416,7 +416,7 @@ mod tests {
416416
.iter()
417417
.filter_map(|krate| {
418418
let cdata = &crate_graph[krate];
419-
let name = cdata.declaration_name.as_ref()?;
419+
let name = cdata.display_name.as_ref()?;
420420

421421
let map = db.import_map(krate);
422422

crates/hir_def/src/nameres.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -172,11 +172,7 @@ pub struct ModuleData {
172172
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(|| {
175-
db.crate_graph()[krate]
176-
.declaration_name
177-
.as_ref()
178-
.map(ToString::to_string)
179-
.unwrap_or_default()
175+
db.crate_graph()[krate].display_name.as_deref().unwrap_or_default().to_string()
180176
});
181177
let def_map = {
182178
let edition = db.crate_graph()[krate].edition;

crates/ide/src/doc_links.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,7 @@ fn get_doc_link(db: &RootDatabase, definition: Definition) -> Option<String> {
130130
let module = definition.module(db)?;
131131
let krate = module.krate();
132132
let import_map = db.import_map(krate.into());
133-
let base = once(krate.declaration_name(db)?.to_string())
133+
let base = once(krate.display_name(db)?.to_string())
134134
.chain(import_map.path_of(ns)?.segments.iter().map(|name| name.to_string()))
135135
.join("/");
136136

@@ -188,7 +188,7 @@ fn rewrite_intra_doc_link(
188188
let krate = resolved.module(db)?.krate();
189189
let canonical_path = resolved.canonical_path(db)?;
190190
let new_target = get_doc_url(db, &krate)?
191-
.join(&format!("{}/", krate.declaration_name(db)?))
191+
.join(&format!("{}/", krate.display_name(db)?))
192192
.ok()?
193193
.join(&canonical_path.replace("::", "/"))
194194
.ok()?
@@ -208,7 +208,7 @@ fn rewrite_url_link(db: &RootDatabase, def: ModuleDef, target: &str) -> Option<S
208208
let module = def.module(db)?;
209209
let krate = module.krate();
210210
let canonical_path = def.canonical_path(db)?;
211-
let base = format!("{}/{}", krate.declaration_name(db)?, canonical_path.replace("::", "/"));
211+
let base = format!("{}/{}", krate.display_name(db)?, canonical_path.replace("::", "/"));
212212

213213
get_doc_url(db, &krate)
214214
.and_then(|url| url.join(&base).ok())
@@ -357,7 +357,7 @@ fn get_doc_url(db: &RootDatabase, krate: &Crate) -> Option<Url> {
357357
//
358358
// FIXME: clicking on the link should just open the file in the editor,
359359
// instead of falling back to external urls.
360-
Some(format!("https://docs.rs/{}/*/", krate.declaration_name(db)?))
360+
Some(format!("https://docs.rs/{}/*/", krate.display_name(db)?))
361361
})
362362
.and_then(|s| Url::parse(&s).ok())
363363
}

crates/ide/src/hover.rs

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

301301
fn render_path(db: &RootDatabase, module: Module, item_name: Option<String>) -> String {
302302
let crate_name =
303-
db.crate_graph()[module.krate().into()].declaration_name.as_ref().map(ToString::to_string);
303+
db.crate_graph()[module.krate().into()].display_name.as_ref().map(|it| it.to_string());
304304
let module_path = module
305305
.path_to_root(db)
306306
.into_iter()

crates/ide/src/inlay_hints.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,14 @@
11
use assists::utils::FamousDefs;
2+
use either::Either;
23
use hir::{known, HirDisplay, Semantics};
34
use ide_db::RootDatabase;
45
use stdx::to_lower_snake_case;
56
use syntax::{
6-
ast::{self, ArgListOwner, AstNode},
7+
ast::{self, ArgListOwner, AstNode, NameOwner},
78
match_ast, Direction, NodeOrToken, SmolStr, SyntaxKind, TextRange, T,
89
};
910

1011
use crate::FileId;
11-
use ast::NameOwner;
12-
use either::Either;
1312

1413
#[derive(Clone, Debug, PartialEq, Eq)]
1514
pub struct InlayHintsConfig {
@@ -215,7 +214,7 @@ fn hint_iterator(
215214
.last()
216215
.and_then(|strukt| strukt.as_adt())?;
217216
let krate = strukt.krate(db)?;
218-
if krate.declaration_name(db).as_deref() != Some("core") {
217+
if krate.display_name(db).as_deref() != Some("core") {
219218
return None;
220219
}
221220
let iter_trait = FamousDefs(sema, krate).core_iter_Iterator()?;

0 commit comments

Comments
 (0)