Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 0bde3fc

Browse files
committed
Intern use and extern crate items like other items
1 parent 00b9d9f commit 0bde3fc

File tree

3 files changed

+49
-30
lines changed

3 files changed

+49
-30
lines changed

crates/hir-def/src/db.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,17 +22,21 @@ use crate::{
2222
nameres::{diagnostics::DefDiagnostic, DefMap},
2323
visibility::{self, Visibility},
2424
AttrDefId, BlockId, BlockLoc, ConstBlockId, ConstBlockLoc, ConstId, ConstLoc, DefWithBodyId,
25-
EnumId, EnumLoc, ExternBlockId, ExternBlockLoc, FunctionId, FunctionLoc, GenericDefId, ImplId,
26-
ImplLoc, InTypeConstId, InTypeConstLoc, LocalEnumVariantId, LocalFieldId, Macro2Id, Macro2Loc,
27-
MacroRulesId, MacroRulesLoc, ProcMacroId, ProcMacroLoc, StaticId, StaticLoc, StructId,
28-
StructLoc, TraitAliasId, TraitAliasLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc, UnionId,
29-
UnionLoc, VariantId,
25+
EnumId, EnumLoc, ExternBlockId, ExternBlockLoc, ExternCrateId, ExternCrateLoc, FunctionId,
26+
FunctionLoc, GenericDefId, ImplId, ImplLoc, ImportId, ImportLoc, InTypeConstId, InTypeConstLoc,
27+
LocalEnumVariantId, LocalFieldId, Macro2Id, Macro2Loc, MacroRulesId, MacroRulesLoc,
28+
ProcMacroId, ProcMacroLoc, StaticId, StaticLoc, StructId, StructLoc, TraitAliasId,
29+
TraitAliasLoc, TraitId, TraitLoc, TypeAliasId, TypeAliasLoc, UnionId, UnionLoc, VariantId,
3030
};
3131

3232
#[salsa::query_group(InternDatabaseStorage)]
3333
pub trait InternDatabase: SourceDatabase {
3434
// region: items
3535
#[salsa::interned]
36+
fn intern_import(&self, loc: ImportLoc) -> ImportId;
37+
#[salsa::interned]
38+
fn intern_extern_crate(&self, loc: ExternCrateLoc) -> ExternCrateId;
39+
#[salsa::interned]
3640
fn intern_function(&self, loc: FunctionLoc) -> FunctionId;
3741
#[salsa::interned]
3842
fn intern_struct(&self, loc: StructLoc) -> StructId;

crates/hir-def/src/lib.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ use crate::{
8888
builtin_type::BuiltinType,
8989
data::adt::VariantData,
9090
item_tree::{
91-
Const, Enum, Function, Impl, ItemTreeId, ItemTreeNode, MacroDef, MacroRules, Static,
92-
Struct, Trait, TraitAlias, TypeAlias, Union,
91+
Const, Enum, ExternCrate, Function, Impl, Import, ItemTreeId, ItemTreeNode, MacroDef,
92+
MacroRules, Static, Struct, Trait, TraitAlias, TypeAlias, Union,
9393
},
9494
};
9595

@@ -313,6 +313,16 @@ pub struct ImplId(salsa::InternId);
313313
type ImplLoc = ItemLoc<Impl>;
314314
impl_intern!(ImplId, ImplLoc, intern_impl, lookup_intern_impl);
315315

316+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
317+
pub struct ImportId(salsa::InternId);
318+
type ImportLoc = ItemLoc<Import>;
319+
impl_intern!(ImportId, ImportLoc, intern_import, lookup_intern_import);
320+
321+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
322+
pub struct ExternCrateId(salsa::InternId);
323+
type ExternCrateLoc = ItemLoc<ExternCrate>;
324+
impl_intern!(ExternCrateId, ExternCrateLoc, intern_extern_crate, lookup_intern_extern_crate);
325+
316326
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Ord, PartialOrd)]
317327
pub struct ExternBlockId(salsa::InternId);
318328
type ExternBlockLoc = ItemLoc<ExternBlock>;

crates/hir-def/src/nameres/collector.rs

Lines changed: 28 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,10 @@ use crate::{
5252
tt,
5353
visibility::{RawVisibility, Visibility},
5454
AdtId, AstId, AstIdWithPath, ConstLoc, CrateRootModuleId, EnumLoc, EnumVariantId,
55-
ExternBlockLoc, FunctionId, FunctionLoc, ImplLoc, Intern, ItemContainerId, LocalModuleId,
56-
Macro2Id, Macro2Loc, MacroExpander, MacroId, MacroRulesId, MacroRulesLoc, ModuleDefId,
57-
ModuleId, ProcMacroId, ProcMacroLoc, StaticLoc, StructLoc, TraitAliasLoc, TraitLoc,
58-
TypeAliasLoc, UnionLoc, UnresolvedMacro,
55+
ExternBlockLoc, ExternCrateLoc, FunctionId, FunctionLoc, ImplLoc, ImportLoc, Intern,
56+
ItemContainerId, LocalModuleId, Macro2Id, Macro2Loc, MacroExpander, MacroId, MacroRulesId,
57+
MacroRulesLoc, ModuleDefId, ModuleId, ProcMacroId, ProcMacroLoc, StaticLoc, StructLoc,
58+
TraitAliasLoc, TraitLoc, TypeAliasLoc, UnionLoc, UnresolvedMacro,
5959
};
6060

6161
static GLOB_RECURSION_LIMIT: Limit = Limit::new(100);
@@ -156,10 +156,9 @@ struct Import {
156156
alias: Option<ImportAlias>,
157157
visibility: RawVisibility,
158158
kind: ImportKind,
159+
source: ImportSource,
159160
is_prelude: bool,
160-
is_extern_crate: bool,
161161
is_macro_use: bool,
162-
source: ImportSource,
163162
}
164163

165164
impl Import {
@@ -168,26 +167,23 @@ impl Import {
168167
krate: CrateId,
169168
tree: &ItemTree,
170169
id: ItemTreeId<item_tree::Import>,
171-
) -> Vec<Self> {
170+
mut cb: impl FnMut(Self),
171+
) {
172172
let it = &tree[id.value];
173173
let attrs = &tree.attrs(db, krate, ModItem::from(id.value).into());
174174
let visibility = &tree[it.visibility];
175175
let is_prelude = attrs.by_key("prelude_import").exists();
176-
177-
let mut res = Vec::new();
178176
it.use_tree.expand(|idx, path, kind, alias| {
179-
res.push(Self {
177+
cb(Self {
180178
path,
181179
alias,
182180
visibility: visibility.clone(),
183181
kind,
184182
is_prelude,
185-
is_extern_crate: false,
186183
is_macro_use: false,
187184
source: ImportSource::Import { id, use_tree: idx },
188185
});
189186
});
190-
res
191187
}
192188

193189
fn from_extern_crate(
@@ -205,7 +201,6 @@ impl Import {
205201
visibility: visibility.clone(),
206202
kind: ImportKind::Plain,
207203
is_prelude: false,
208-
is_extern_crate: true,
209204
is_macro_use: attrs.by_key("macro_use").exists(),
210205
source: ImportSource::ExternCrate(id),
211206
}
@@ -776,7 +771,7 @@ impl DefCollector<'_> {
776771
let _p = profile::span("resolve_import")
777772
.detail(|| format!("{}", import.path.display(self.db.upcast())));
778773
tracing::debug!("resolving import: {:?} ({:?})", import, self.def_map.data.edition);
779-
if import.is_extern_crate {
774+
if matches!(import.source, ImportSource::ExternCrate { .. }) {
780775
let name = import
781776
.path
782777
.as_ident()
@@ -867,7 +862,7 @@ impl DefCollector<'_> {
867862
tracing::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def);
868863

869864
// extern crates in the crate root are special-cased to insert entries into the extern prelude: rust-lang/rust#54658
870-
if import.is_extern_crate
865+
if matches!(import.source, ImportSource::ExternCrate { .. })
871866
&& self.def_map.block.is_none()
872867
&& module_id == DefMap::ROOT
873868
{
@@ -1585,21 +1580,31 @@ impl ModCollector<'_, '_> {
15851580
match item {
15861581
ModItem::Mod(m) => self.collect_module(m, &attrs),
15871582
ModItem::Import(import_id) => {
1588-
let imports = Import::from_use(
1583+
let _import_id = ImportLoc {
1584+
container: module,
1585+
id: ItemTreeId::new(self.tree_id, import_id),
1586+
}
1587+
.intern(db);
1588+
Import::from_use(
15891589
db,
15901590
krate,
15911591
self.item_tree,
15921592
ItemTreeId::new(self.tree_id, import_id),
1593-
);
1594-
self.def_collector.unresolved_imports.extend(imports.into_iter().map(
1595-
|import| ImportDirective {
1596-
module_id: self.module_id,
1597-
import,
1598-
status: PartialResolvedImport::Unresolved,
1593+
|import| {
1594+
self.def_collector.unresolved_imports.push(ImportDirective {
1595+
module_id: self.module_id,
1596+
import,
1597+
status: PartialResolvedImport::Unresolved,
1598+
});
15991599
},
1600-
));
1600+
)
16011601
}
16021602
ModItem::ExternCrate(import_id) => {
1603+
let _import_id = ExternCrateLoc {
1604+
container: module,
1605+
id: ItemTreeId::new(self.tree_id, import_id),
1606+
}
1607+
.intern(db);
16031608
self.def_collector.unresolved_imports.push(ImportDirective {
16041609
module_id: self.module_id,
16051610
import: Import::from_extern_crate(

0 commit comments

Comments
 (0)