Skip to content

Commit e1aa96f

Browse files
Less abstract CrateData api
1 parent 5cffef5 commit e1aa96f

File tree

9 files changed

+48
-51
lines changed

9 files changed

+48
-51
lines changed

crates/ra_db/src/input.rs

Lines changed: 27 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,16 @@ impl CrateName {
104104
}
105105

106106
#[derive(Debug, Clone, PartialEq, Eq)]
107-
struct CrateData {
108-
file_id: FileId,
109-
edition: Edition,
110-
declaration_name: Option<String>,
107+
pub struct CrateData {
108+
pub root_file_id: FileId,
109+
pub edition: Edition,
110+
/// The name to display to the end user.
111+
/// This actual crate name can be different in a particular dependent crate
112+
/// or may even be missing for some cases, such as a dummy crate for the code snippet.
113+
pub display_name: Option<String>,
111114
cfg_options: CfgOptions,
112115
env: Env,
113-
dependencies: Vec<Dependency>,
116+
pub dependencies: Vec<Dependency>,
114117
}
115118

116119
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -135,11 +138,11 @@ impl CrateGraph {
135138
&mut self,
136139
file_id: FileId,
137140
edition: Edition,
138-
declaration_name: Option<String>,
141+
display_name: Option<String>,
139142
cfg_options: CfgOptions,
140143
env: Env,
141144
) -> CrateId {
142-
let data = CrateData::new(file_id, edition, declaration_name, cfg_options, env);
145+
let data = CrateData::new(file_id, edition, display_name, cfg_options, env);
143146
let crate_id = CrateId(self.arena.len() as u32);
144147
let prev = self.arena.insert(crate_id, data);
145148
assert!(prev.is_none());
@@ -171,33 +174,17 @@ impl CrateGraph {
171174
self.arena.keys().copied()
172175
}
173176

174-
pub fn crate_root(&self, crate_id: CrateId) -> FileId {
175-
self.arena[&crate_id].file_id
176-
}
177-
178-
pub fn edition(&self, crate_id: CrateId) -> Edition {
179-
self.arena[&crate_id].edition
180-
}
181-
182-
/// Returns a name of a crate, declared in the root project.
183-
/// May be missing for some cases, such as when the crate definition was created for a code snippet.
184-
///
185-
/// This should not be considered as a normal crate name, since the actual name can be different in
186-
/// a particular dependent crate, where it is specified.
187-
pub fn declaration_name(&self, crate_id: &CrateId) -> Option<&String> {
188-
self.arena[crate_id].declaration_name.as_ref()
177+
pub fn crate_data(&self, crate_id: &CrateId) -> &CrateData {
178+
&self.arena[crate_id]
189179
}
190180

191181
// FIXME: this only finds one crate with the given root; we could have multiple
192182
pub fn crate_id_for_crate_root(&self, file_id: FileId) -> Option<CrateId> {
193-
let (&crate_id, _) = self.arena.iter().find(|(_crate_id, data)| data.file_id == file_id)?;
183+
let (&crate_id, _) =
184+
self.arena.iter().find(|(_crate_id, data)| data.root_file_id == file_id)?;
194185
Some(crate_id)
195186
}
196187

197-
pub fn dependencies(&self, crate_id: CrateId) -> impl Iterator<Item = &Dependency> {
198-
self.arena[&crate_id].dependencies.iter()
199-
}
200-
201188
/// Extends this crate graph by adding a complete disjoint second crate
202189
/// graph.
203190
///
@@ -220,7 +207,7 @@ impl CrateGraph {
220207
return false;
221208
}
222209

223-
for dep in self.dependencies(from) {
210+
for dep in &self.crate_data(&from).dependencies {
224211
let crate_id = dep.crate_id();
225212
if crate_id == target {
226213
return true;
@@ -242,13 +229,20 @@ impl CrateId {
242229

243230
impl CrateData {
244231
fn new(
245-
file_id: FileId,
232+
root_file_id: FileId,
246233
edition: Edition,
247-
declaration_name: Option<String>,
234+
display_name: Option<String>,
248235
cfg_options: CfgOptions,
249236
env: Env,
250237
) -> CrateData {
251-
CrateData { file_id, edition, declaration_name, dependencies: Vec::new(), cfg_options, env }
238+
CrateData {
239+
root_file_id,
240+
edition,
241+
display_name,
242+
dependencies: Vec::new(),
243+
cfg_options,
244+
env,
245+
}
252246
}
253247

254248
fn add_dep(&mut self, name: SmolStr, crate_id: CrateId) {
@@ -382,8 +376,8 @@ mod tests {
382376
.add_dep(crate1, CrateName::normalize_dashes("crate-name-with-dashes"), crate2)
383377
.is_ok());
384378
assert_eq!(
385-
graph.dependencies(crate1).collect::<Vec<_>>(),
386-
vec![&Dependency { crate_id: crate2, name: "crate_name_with_dashes".into() }]
379+
graph.crate_data(&crate1).dependencies,
380+
vec![Dependency { crate_id: crate2, name: "crate_name_with_dashes".into() }]
387381
);
388382
}
389383
}

crates/ra_hir/src/code_model.rs

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,9 @@ pub struct CrateDependency {
5555
impl Crate {
5656
pub fn dependencies(self, db: &impl DefDatabase) -> Vec<CrateDependency> {
5757
db.crate_graph()
58-
.dependencies(self.id)
58+
.crate_data(&self.id)
59+
.dependencies
60+
.iter()
5961
.map(|dep| {
6062
let krate = Crate { id: dep.crate_id() };
6163
let name = dep.as_name();
@@ -69,7 +71,9 @@ impl Crate {
6971
let crate_graph = db.crate_graph();
7072
crate_graph
7173
.iter()
72-
.filter(|&krate| crate_graph.dependencies(krate).any(|it| it.crate_id == self.id))
74+
.filter(|&krate| {
75+
crate_graph.crate_data(&krate).dependencies.iter().any(|it| it.crate_id == self.id)
76+
})
7377
.map(|id| Crate { id })
7478
.collect()
7579
}
@@ -80,12 +84,11 @@ impl Crate {
8084
}
8185

8286
pub fn root_file(self, db: &impl DefDatabase) -> FileId {
83-
db.crate_graph().crate_root(self.id)
87+
db.crate_graph().crate_data(&self.id).root_file_id
8488
}
8589

8690
pub fn edition(self, db: &impl DefDatabase) -> Edition {
87-
let crate_graph = db.crate_graph();
88-
crate_graph.edition(self.id)
91+
db.crate_graph().crate_data(&self.id).edition
8992
}
9093

9194
pub fn all(db: &impl DefDatabase) -> Vec<Crate> {

crates/ra_hir_def/src/find_path.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ fn find_importable_locations(
176176
// directly (only through reexports in direct dependencies).
177177
for krate in Some(from.krate)
178178
.into_iter()
179-
.chain(crate_graph.dependencies(from.krate).map(|dep| dep.crate_id))
179+
.chain(crate_graph.crate_data(&from.krate).dependencies.iter().map(|dep| dep.crate_id))
180180
{
181181
result.extend(
182182
importable_locations_in_crate(db, item, krate)

crates/ra_hir_def/src/lang_item.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,9 @@ impl LangItems {
117117
return Some(*target);
118118
}
119119
db.crate_graph()
120-
.dependencies(start_crate)
120+
.crate_data(&start_crate)
121+
.dependencies
122+
.iter()
121123
.find_map(|dep| db.lang_item(dep.crate_id, item.clone()))
122124
}
123125

crates/ra_hir_def/src/nameres.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -179,8 +179,7 @@ impl CrateDefMap {
179179
pub(crate) fn crate_def_map_query(db: &impl DefDatabase, krate: CrateId) -> Arc<CrateDefMap> {
180180
let _p = profile("crate_def_map_query");
181181
let def_map = {
182-
let crate_graph = db.crate_graph();
183-
let edition = crate_graph.edition(krate);
182+
let edition = db.crate_graph().crate_data(&krate).edition;
184183
let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default();
185184
let root = modules.alloc(ModuleData::default());
186185
CrateDefMap {

crates/ra_hir_def/src/nameres/collector.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> C
3434
let crate_graph = db.crate_graph();
3535

3636
// populate external prelude
37-
for dep in crate_graph.dependencies(def_map.krate) {
37+
for dep in &crate_graph.crate_data(&def_map.krate).dependencies {
3838
let dep_def_map = db.crate_def_map(dep.crate_id);
3939
log::debug!("crate dep {:?} -> {:?}", dep.name, dep.crate_id);
4040
def_map.extern_prelude.insert(
@@ -128,8 +128,7 @@ where
128128
DB: DefDatabase,
129129
{
130130
fn collect(&mut self) {
131-
let crate_graph = self.db.crate_graph();
132-
let file_id = crate_graph.crate_root(self.def_map.krate);
131+
let file_id = self.db.crate_graph().crate_data(&self.def_map.krate).root_file_id;
133132
let raw_items = self.db.raw_items(file_id.into());
134133
let module_id = self.def_map.root;
135134
self.def_map.modules[module_id].origin = ModuleOrigin::CrateRoot { definition: file_id };
@@ -955,7 +954,7 @@ mod tests {
955954
let krate = db.test_crate();
956955

957956
let def_map = {
958-
let edition = db.crate_graph().edition(krate);
957+
let edition = db.crate_graph().crate_data(&krate).edition;
959958
let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default();
960959
let root = modules.alloc(ModuleData::default());
961960
CrateDefMap {

crates/ra_hir_ty/src/traits.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ pub(crate) fn impls_for_trait_query(
4747
// will only ever get called for a few crates near the root of the tree (the
4848
// ones the user is editing), so this may actually be a waste of memory. I'm
4949
// doing it like this mainly for simplicity for now.
50-
for dep in db.crate_graph().dependencies(krate) {
50+
for dep in &db.crate_graph().crate_data(&krate).dependencies {
5151
impls.extend(db.impls_for_trait(dep.crate_id, trait_).iter());
5252
}
5353
let crate_impl_defs = db.impls_in_crate(krate);

crates/ra_ide/src/hover.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ fn definition_owner_name(db: &RootDatabase, def: &Definition) -> Option<String>
121121

122122
fn determine_mod_path(db: &RootDatabase, def: &Definition) -> Option<String> {
123123
let mod_path = def.module(db).map(|module| {
124-
once(db.crate_graph().declaration_name(&module.krate().into()).cloned())
124+
once(db.crate_graph().crate_data(&module.krate().into()).display_name.clone())
125125
.chain(
126126
module
127127
.path_to_root(db)
@@ -130,7 +130,7 @@ fn determine_mod_path(db: &RootDatabase, def: &Definition) -> Option<String> {
130130
.map(|it| it.name(db).map(|name| name.to_string())),
131131
)
132132
.chain(once(definition_owner_name(db, def)))
133-
.filter_map(std::convert::identity)
133+
.flatten()
134134
.join("::")
135135
});
136136
mod_path

crates/ra_ide/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -421,12 +421,12 @@ impl Analysis {
421421

422422
/// Returns the edition of the given crate.
423423
pub fn crate_edition(&self, crate_id: CrateId) -> Cancelable<Edition> {
424-
self.with_db(|db| db.crate_graph().edition(crate_id))
424+
self.with_db(|db| db.crate_graph().crate_data(&crate_id).edition)
425425
}
426426

427427
/// Returns the root file of the given crate.
428428
pub fn crate_root(&self, crate_id: CrateId) -> Cancelable<FileId> {
429-
self.with_db(|db| db.crate_graph().crate_root(crate_id))
429+
self.with_db(|db| db.crate_graph().crate_data(&crate_id).root_file_id)
430430
}
431431

432432
/// Returns the set of possible targets to run for the current file.

0 commit comments

Comments
 (0)