Skip to content

Commit ef92453

Browse files
committed
internal: Refactor FamousDefs builtin crate search
1 parent 259182b commit ef92453

File tree

16 files changed

+146
-105
lines changed

16 files changed

+146
-105
lines changed

crates/base_db/src/fixture.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use tt::Subtree;
1010
use vfs::{file_set::FileSet, VfsPath};
1111

1212
use crate::{
13-
input::{CrateName, CrateOrigin},
13+
input::{CrateName, CrateOrigin, LangCrateOrigin},
1414
Change, CrateDisplayName, CrateGraph, CrateId, Dependency, Edition, Env, FileId, FilePosition,
1515
FileRange, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, SourceDatabaseExt,
1616
SourceRoot, SourceRootId,
@@ -196,7 +196,7 @@ impl ChangeFixture {
196196
Env::default(),
197197
Default::default(),
198198
false,
199-
Default::default(),
199+
CrateOrigin::CratesIo { repo: None },
200200
);
201201
} else {
202202
for (from, to, prelude) in crate_deps {
@@ -233,7 +233,7 @@ impl ChangeFixture {
233233
Env::default(),
234234
Vec::new(),
235235
false,
236-
CrateOrigin::Lang,
236+
CrateOrigin::Lang(LangCrateOrigin::Core),
237237
);
238238

239239
for krate in all_crates {
@@ -270,7 +270,7 @@ impl ChangeFixture {
270270
Env::default(),
271271
proc_macro,
272272
true,
273-
CrateOrigin::Lang,
273+
CrateOrigin::CratesIo { repo: None },
274274
);
275275

276276
for krate in all_crates {
@@ -406,7 +406,11 @@ fn parse_crate(crate_str: String) -> (String, CrateOrigin, Option<String>) {
406406
};
407407
(a.to_owned(), origin, Some(version.to_string()))
408408
} else {
409-
(crate_str, CrateOrigin::Unknown, None)
409+
let crate_origin = match &*crate_str {
410+
"std" => CrateOrigin::Lang(LangCrateOrigin::Std),
411+
_ => CrateOrigin::CratesIo { repo: None },
412+
};
413+
(crate_str, crate_origin, None)
410414
}
411415
}
412416

crates/base_db/src/input.rs

Lines changed: 22 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -117,21 +117,22 @@ impl ops::Deref for CrateName {
117117
}
118118

119119
/// Origin of the crates. It is used in emitting monikers.
120-
#[derive(Debug, Clone)]
120+
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
121121
pub enum CrateOrigin {
122122
/// Crates that are from crates.io official registry,
123123
CratesIo { repo: Option<String> },
124124
/// Crates that are provided by the language, like std, core, proc-macro, ...
125-
Lang,
126-
/// Crates that we don't know their origin.
127-
// Ideally this enum should cover all cases, and then we remove this variant.
128-
Unknown,
125+
Lang(LangCrateOrigin),
129126
}
130127

131-
impl Default for CrateOrigin {
132-
fn default() -> Self {
133-
Self::Unknown
134-
}
128+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
129+
pub enum LangCrateOrigin {
130+
Alloc,
131+
Core,
132+
ProcMacro,
133+
Std,
134+
Test,
135+
Other,
135136
}
136137

137138
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -585,6 +586,8 @@ impl fmt::Display for CyclicDependenciesError {
585586

586587
#[cfg(test)]
587588
mod tests {
589+
use crate::CrateOrigin;
590+
588591
use super::{CfgOptions, CrateGraph, CrateName, Dependency, Edition::Edition2018, Env, FileId};
589592

590593
#[test]
@@ -600,7 +603,7 @@ mod tests {
600603
Env::default(),
601604
Default::default(),
602605
false,
603-
Default::default(),
606+
CrateOrigin::CratesIo { repo: None },
604607
);
605608
let crate2 = graph.add_crate_root(
606609
FileId(2u32),
@@ -612,7 +615,7 @@ mod tests {
612615
Env::default(),
613616
Default::default(),
614617
false,
615-
Default::default(),
618+
CrateOrigin::CratesIo { repo: None },
616619
);
617620
let crate3 = graph.add_crate_root(
618621
FileId(3u32),
@@ -624,7 +627,7 @@ mod tests {
624627
Env::default(),
625628
Default::default(),
626629
false,
627-
Default::default(),
630+
CrateOrigin::CratesIo { repo: None },
628631
);
629632
assert!(graph
630633
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -650,7 +653,7 @@ mod tests {
650653
Env::default(),
651654
Default::default(),
652655
false,
653-
Default::default(),
656+
CrateOrigin::CratesIo { repo: None },
654657
);
655658
let crate2 = graph.add_crate_root(
656659
FileId(2u32),
@@ -662,7 +665,7 @@ mod tests {
662665
Env::default(),
663666
Default::default(),
664667
false,
665-
Default::default(),
668+
CrateOrigin::CratesIo { repo: None },
666669
);
667670
assert!(graph
668671
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -685,7 +688,7 @@ mod tests {
685688
Env::default(),
686689
Default::default(),
687690
false,
688-
Default::default(),
691+
CrateOrigin::CratesIo { repo: None },
689692
);
690693
let crate2 = graph.add_crate_root(
691694
FileId(2u32),
@@ -697,7 +700,7 @@ mod tests {
697700
Env::default(),
698701
Default::default(),
699702
false,
700-
Default::default(),
703+
CrateOrigin::CratesIo { repo: None },
701704
);
702705
let crate3 = graph.add_crate_root(
703706
FileId(3u32),
@@ -709,7 +712,7 @@ mod tests {
709712
Env::default(),
710713
Default::default(),
711714
false,
712-
Default::default(),
715+
CrateOrigin::CratesIo { repo: None },
713716
);
714717
assert!(graph
715718
.add_dep(crate1, Dependency::new(CrateName::new("crate2").unwrap(), crate2))
@@ -732,7 +735,7 @@ mod tests {
732735
Env::default(),
733736
Default::default(),
734737
false,
735-
Default::default(),
738+
CrateOrigin::CratesIo { repo: None },
736739
);
737740
let crate2 = graph.add_crate_root(
738741
FileId(2u32),
@@ -744,7 +747,7 @@ mod tests {
744747
Env::default(),
745748
Default::default(),
746749
false,
747-
Default::default(),
750+
CrateOrigin::CratesIo { repo: None },
748751
);
749752
assert!(graph
750753
.add_dep(

crates/base_db/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ pub use crate::{
1212
change::Change,
1313
input::{
1414
CrateData, CrateDisplayName, CrateGraph, CrateId, CrateName, CrateOrigin, Dependency,
15-
Edition, Env, ProcMacro, ProcMacroExpander, ProcMacroExpansionError, ProcMacroId,
16-
ProcMacroKind, SourceRoot, SourceRootId,
15+
Edition, Env, LangCrateOrigin, ProcMacro, ProcMacroExpander, ProcMacroExpansionError,
16+
ProcMacroId, ProcMacroKind, SourceRoot, SourceRootId,
1717
},
1818
};
1919
pub use salsa::{self, Cancelled};

crates/hir/src/lib.rs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -148,14 +148,18 @@ impl Crate {
148148
db.crate_graph()[self.id].origin.clone()
149149
}
150150

151+
pub fn is_builtin(self, db: &dyn HirDatabase) -> bool {
152+
matches!(self.origin(db), CrateOrigin::Lang(_))
153+
}
154+
151155
pub fn dependencies(self, db: &dyn HirDatabase) -> Vec<CrateDependency> {
152156
db.crate_graph()[self.id]
153157
.dependencies
154158
.iter()
155159
.map(|dep| {
156160
let krate = Crate { id: dep.crate_id };
157161
let name = dep.as_name();
158-
CrateDependency { krate, name }
162+
CrateDependency { krate, name, }
159163
})
160164
.collect()
161165
}
@@ -1741,10 +1745,8 @@ impl BuiltinType {
17411745
BuiltinType { inner: hir_def::builtin_type::BuiltinType::Str }
17421746
}
17431747

1744-
pub fn ty(self, db: &dyn HirDatabase, module: Module) -> Type {
1745-
let resolver = module.id.resolver(db.upcast());
1746-
Type::new_with_resolver(db, &resolver, TyBuilder::builtin(self.inner))
1747-
.expect("crate not present in resolver")
1748+
pub fn ty(self, db: &dyn HirDatabase) -> Type {
1749+
Type::new_for_crate(db.crate_graph().iter().next().unwrap(), TyBuilder::builtin(self.inner))
17481750
}
17491751

17501752
pub fn name(self) -> Name {
@@ -2619,6 +2621,7 @@ impl Type {
26192621
let krate = resolver.krate()?;
26202622
Some(Type::new_with_resolver_inner(db, krate, resolver, ty))
26212623
}
2624+
26222625
pub(crate) fn new_with_resolver_inner(
26232626
db: &dyn HirDatabase,
26242627
krate: CrateId,
@@ -2631,6 +2634,10 @@ impl Type {
26312634
Type { krate, env: environment, ty }
26322635
}
26332636

2637+
pub(crate) fn new_for_crate(krate: CrateId, ty: Ty) -> Type {
2638+
Type { krate, env: Arc::new(TraitEnvironment::empty(krate)), ty }
2639+
}
2640+
26342641
pub fn reference(inner: &Type, m: Mutability) -> Type {
26352642
inner.derived(
26362643
TyKind::Ref(

crates/ide/src/goto_implementation.rs

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,7 @@ pub(crate) fn goto_implementation(
6363
Definition::Trait(trait_) => impls_for_trait(&sema, trait_),
6464
Definition::Adt(adt) => impls_for_ty(&sema, adt.ty(sema.db)),
6565
Definition::TypeAlias(alias) => impls_for_ty(&sema, alias.ty(sema.db)),
66-
Definition::BuiltinType(builtin) => {
67-
let module = sema.to_module_def(position.file_id)?;
68-
impls_for_ty(&sema, builtin.ty(sema.db, module))
69-
}
66+
Definition::BuiltinType(builtin) => impls_for_ty(&sema, builtin.ty(sema.db)),
7067
Definition::Function(f) => {
7168
let assoc = f.as_assoc_item(sema.db)?;
7269
let name = assoc.name(sema.db)?;

crates/ide/src/lib.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ use cfg::CfgOptions;
6464
use ide_db::{
6565
base_db::{
6666
salsa::{self, ParallelDatabase},
67-
Env, FileLoader, FileSet, SourceDatabase, VfsPath,
67+
CrateOrigin, Env, FileLoader, FileSet, SourceDatabase, VfsPath,
6868
},
6969
symbol_index, LineIndexDatabase,
7070
};
@@ -232,7 +232,7 @@ impl Analysis {
232232
Env::default(),
233233
Default::default(),
234234
false,
235-
Default::default(),
235+
CrateOrigin::CratesIo { repo: None },
236236
);
237237
change.change_file(file_id, Some(Arc::new(text)));
238238
change.set_crate_graph(crate_graph);

crates/ide/src/moniker.rs

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
use hir::{db::DefDatabase, AsAssocItem, AssocItemContainer, Crate, Name, Semantics};
55
use ide_db::{
6-
base_db::{CrateOrigin, FileId, FileLoader, FilePosition},
6+
base_db::{CrateOrigin, FileId, FileLoader, FilePosition, LangCrateOrigin},
77
defs::{Definition, IdentClass},
88
helpers::pick_best_token,
99
RootDatabase,
@@ -151,11 +151,20 @@ pub(crate) fn def_to_moniker(
151151
let name = krate.display_name(db)?.to_string();
152152
let (repo, version) = match krate.origin(db) {
153153
CrateOrigin::CratesIo { repo } => (repo?, krate.version(db)?),
154-
CrateOrigin::Lang => (
154+
CrateOrigin::Lang(lang) => (
155155
"https://github.com/rust-lang/rust/".to_string(),
156-
"compiler_version".to_string(),
156+
format!(
157+
"https://github.com/rust-lang/rust/library/{}",
158+
match lang {
159+
LangCrateOrigin::Alloc => "alloc",
160+
LangCrateOrigin::Core => "core",
161+
LangCrateOrigin::ProcMacro => "proc_macro",
162+
LangCrateOrigin::Std => "std",
163+
LangCrateOrigin::Test => "test",
164+
LangCrateOrigin::Other => "",
165+
}
166+
),
157167
),
158-
CrateOrigin::Unknown => return None,
159168
};
160169
PackageInformation { name, repo, version }
161170
},

crates/ide/src/syntax_highlighting/highlight.rs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
use hir::{AsAssocItem, HasVisibility, Semantics};
44
use ide_db::{
55
defs::{Definition, IdentClass, NameClass, NameRefClass},
6-
famous_defs::FamousDefs,
76
RootDatabase, SymbolKind,
87
};
98
use rustc_hash::FxHashMap;
@@ -472,14 +471,12 @@ fn highlight_def(
472471
Definition::ToolModule(_) => Highlight::new(HlTag::Symbol(SymbolKind::ToolModule)),
473472
};
474473

475-
let famous_defs = FamousDefs(sema, krate);
476474
let def_crate = def.module(db).map(hir::Module::krate).or_else(|| match def {
477475
Definition::Module(module) => Some(module.krate()),
478476
_ => None,
479477
});
480478
let is_from_other_crate = def_crate != krate;
481-
let is_from_builtin_crate =
482-
def_crate.map_or(false, |def_crate| famous_defs.builtin_crates().any(|it| def_crate == it));
479+
let is_from_builtin_crate = def_crate.map_or(false, |def_crate| def_crate.is_builtin(db));
483480
let is_builtin_type = matches!(def, Definition::BuiltinType(_));
484481
let is_public = def.visibility(db) == Some(hir::Visibility::Public);
485482

@@ -525,10 +522,9 @@ fn highlight_method_call(
525522
h |= HlMod::Trait;
526523
}
527524

528-
let famous_defs = FamousDefs(sema, krate);
529525
let def_crate = func.module(sema.db).krate();
530526
let is_from_other_crate = Some(def_crate) != krate;
531-
let is_from_builtin_crate = famous_defs.builtin_crates().any(|it| def_crate == it);
527+
let is_from_builtin_crate = def_crate.is_builtin(sema.db);
532528
let is_public = func.visibility(sema.db) == hir::Visibility::Public;
533529

534530
if is_from_other_crate {

crates/ide/src/syntax_highlighting/test_data/highlight_extern_crate.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@
4343
.unresolved_reference { color: #FC5555; text-decoration: wavy underline; }
4444
</style>
4545
<pre><code><span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root default_library library">std</span><span class="semicolon">;</span>
46-
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root default_library library">alloc</span> <span class="keyword">as</span> <span class="module crate_root default_library declaration library">abc</span><span class="semicolon">;</span>
46+
<span class="keyword">extern</span> <span class="keyword">crate</span> <span class="module crate_root library">alloc</span> <span class="keyword">as</span> <span class="module crate_root declaration library">abc</span><span class="semicolon">;</span>
4747
</code></pre>

crates/ide_assists/src/utils.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -600,8 +600,7 @@ fn handle_as_ref_str(
600600
db: &dyn HirDatabase,
601601
famous_defs: &FamousDefs,
602602
) -> Option<ReferenceConversionType> {
603-
let module = famous_defs.1?.root_module(db);
604-
let str_type = hir::BuiltinType::str().ty(db, module);
603+
let str_type = hir::BuiltinType::str().ty(db);
605604

606605
ty.impls_trait(db, famous_defs.core_convert_AsRef()?, &[str_type])
607606
.then(|| ReferenceConversionType::AsRefStr)

0 commit comments

Comments
 (0)