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

Commit 9476fda

Browse files
committed
HIR ExternCrateDecl
1 parent 0bde3fc commit 9476fda

File tree

10 files changed

+75
-16
lines changed

10 files changed

+75
-16
lines changed

crates/hir-def/src/attr.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,7 @@ impl AttrsWithOwner {
462462
}
463463
},
464464
AttrDefId::ExternBlockId(it) => attrs_from_item_tree_loc(db, it),
465+
AttrDefId::ExternCrateId(it) => attrs_from_item_tree_loc(db, it),
465466
};
466467

467468
let attrs = raw_attrs.filter(db.upcast(), def.krate(db));
@@ -546,6 +547,7 @@ impl AttrsWithOwner {
546547
.map(|source| ast::AnyHasAttrs::new(source[id.local_id].clone())),
547548
},
548549
AttrDefId::ExternBlockId(id) => any_has_attrs(db, id),
550+
AttrDefId::ExternCrateId(id) => any_has_attrs(db, id),
549551
};
550552

551553
AttrSourceMap::new(owner.as_ref().map(|node| node as &dyn HasAttrs))

crates/hir-def/src/data.rs

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,12 @@ use crate::{
2424
proc_macro::{parse_macro_name_and_helper_attrs, ProcMacroKind},
2525
DefMap, MacroSubNs,
2626
},
27+
path::ImportAlias,
2728
type_ref::{TraitRef, TypeBound, TypeRef},
2829
visibility::RawVisibility,
29-
AssocItemId, AstIdWithPath, ConstId, ConstLoc, FunctionId, FunctionLoc, HasModule, ImplId,
30-
Intern, ItemContainerId, ItemLoc, Lookup, Macro2Id, MacroRulesId, ModuleId, ProcMacroId,
31-
StaticId, TraitAliasId, TraitId, TypeAliasId, TypeAliasLoc,
30+
AssocItemId, AstIdWithPath, ConstId, ConstLoc, ExternCrateId, FunctionId, FunctionLoc,
31+
HasModule, ImplId, Intern, ItemContainerId, ItemLoc, Lookup, Macro2Id, MacroRulesId, ModuleId,
32+
ProcMacroId, StaticId, TraitAliasId, TraitId, TypeAliasId, TypeAliasLoc,
3233
};
3334

3435
#[derive(Debug, Clone, PartialEq, Eq)]
@@ -424,6 +425,7 @@ impl MacroRulesData {
424425
Arc::new(MacroRulesData { name: makro.name.clone(), macro_export })
425426
}
426427
}
428+
427429
#[derive(Debug, Clone, PartialEq, Eq)]
428430
pub struct ProcMacroData {
429431
pub name: Name,
@@ -460,6 +462,30 @@ impl ProcMacroData {
460462
}
461463
}
462464

465+
#[derive(Debug, Clone, PartialEq, Eq)]
466+
pub struct ExternCrateDeclData {
467+
pub name: Name,
468+
pub alias: Option<ImportAlias>,
469+
pub visibility: RawVisibility,
470+
}
471+
472+
impl ExternCrateDeclData {
473+
pub(crate) fn extern_crate_decl_data_query(
474+
db: &dyn DefDatabase,
475+
extern_crate: ExternCrateId,
476+
) -> Arc<ExternCrateDeclData> {
477+
let loc = extern_crate.lookup(db);
478+
let item_tree = loc.id.item_tree(db);
479+
let extern_crate = &item_tree[loc.id.value];
480+
481+
Arc::new(Self {
482+
name: extern_crate.name.clone(),
483+
visibility: item_tree[extern_crate.visibility].clone(),
484+
alias: extern_crate.alias.clone(),
485+
})
486+
}
487+
}
488+
463489
#[derive(Debug, Clone, PartialEq, Eq)]
464490
pub struct ConstData {
465491
/// `None` for `const _: () = ();`

crates/hir-def/src/db.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use crate::{
1212
body::{scope::ExprScopes, Body, BodySourceMap},
1313
data::{
1414
adt::{EnumData, StructData},
15-
ConstData, FunctionData, ImplData, Macro2Data, MacroRulesData, ProcMacroData, StaticData,
16-
TraitAliasData, TraitData, TypeAliasData,
15+
ConstData, ExternCrateDeclData, FunctionData, ImplData, Macro2Data, MacroRulesData,
16+
ProcMacroData, StaticData, TraitAliasData, TraitData, TypeAliasData,
1717
},
1818
generics::GenericParams,
1919
import_map::ImportMap,
@@ -164,6 +164,9 @@ pub trait DefDatabase: InternDatabase + ExpandDatabase + Upcast<dyn ExpandDataba
164164
#[salsa::invoke(ProcMacroData::proc_macro_data_query)]
165165
fn proc_macro_data(&self, makro: ProcMacroId) -> Arc<ProcMacroData>;
166166

167+
#[salsa::invoke(ExternCrateDeclData::extern_crate_decl_data_query)]
168+
fn extern_crate_decl_data(&self, extern_crate: ExternCrateId) -> Arc<ExternCrateDeclData>;
169+
167170
// endregion:data
168171

169172
#[salsa::invoke(Body::body_with_source_map_query)]

crates/hir-def/src/dyn_map/keys.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use syntax::{ast, AstNode, AstPtr};
88

99
use crate::{
1010
dyn_map::{DynMap, Policy},
11-
ConstId, EnumId, EnumVariantId, FieldId, FunctionId, ImplId, LifetimeParamId, Macro2Id,
12-
MacroRulesId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId,
11+
ConstId, EnumId, EnumVariantId, ExternCrateId, FieldId, FunctionId, ImplId, LifetimeParamId,
12+
Macro2Id, MacroRulesId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId,
1313
TypeOrConstParamId, UnionId,
1414
};
1515

@@ -25,6 +25,7 @@ pub const TRAIT_ALIAS: Key<ast::TraitAlias, TraitAliasId> = Key::new();
2525
pub const STRUCT: Key<ast::Struct, StructId> = Key::new();
2626
pub const UNION: Key<ast::Union, UnionId> = Key::new();
2727
pub const ENUM: Key<ast::Enum, EnumId> = Key::new();
28+
pub const EXTERN_CRATE: Key<ast::ExternCrate, ExternCrateId> = Key::new();
2829

2930
pub const VARIANT: Key<ast::Variant, EnumVariantId> = Key::new();
3031
pub const TUPLE_FIELD: Key<ast::TupleField, FieldId> = Key::new();

crates/hir-def/src/item_scope.rs

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ use stdx::format_to;
1414
use syntax::ast;
1515

1616
use crate::{
17-
db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, ConstId, HasModule,
18-
ImplId, LocalModuleId, MacroId, ModuleDefId, ModuleId, TraitId,
17+
db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, ConstId,
18+
ExternCrateId, HasModule, ImplId, LocalModuleId, MacroId, ModuleDefId, ModuleId, TraitId,
1919
};
2020

2121
#[derive(Copy, Clone, Debug)]
@@ -50,6 +50,7 @@ pub struct ItemScope {
5050
unnamed_consts: Vec<ConstId>,
5151
/// Traits imported via `use Trait as _;`.
5252
unnamed_trait_imports: FxHashMap<TraitId, Visibility>,
53+
extern_crate_decls: Vec<ExternCrateId>,
5354
/// Macros visible in current module in legacy textual scope
5455
///
5556
/// For macros invoked by an unqualified identifier like `bar!()`, `legacy_macros` will be searched in first.
@@ -188,7 +189,11 @@ impl ItemScope {
188189
}
189190

190191
pub(crate) fn define_impl(&mut self, imp: ImplId) {
191-
self.impls.push(imp)
192+
self.impls.push(imp);
193+
}
194+
195+
pub(crate) fn define_extern_crate_decl(&mut self, extern_crate: ExternCrateId) {
196+
self.extern_crate_decls.push(extern_crate);
192197
}
193198

194199
pub(crate) fn define_unnamed_const(&mut self, konst: ConstId) {
@@ -397,6 +402,7 @@ impl ItemScope {
397402
legacy_macros,
398403
attr_macros,
399404
derive_macros,
405+
extern_crate_decls,
400406
} = self;
401407
types.shrink_to_fit();
402408
values.shrink_to_fit();
@@ -409,6 +415,7 @@ impl ItemScope {
409415
legacy_macros.shrink_to_fit();
410416
attr_macros.shrink_to_fit();
411417
derive_macros.shrink_to_fit();
418+
extern_crate_decls.shrink_to_fit();
412419
}
413420
}
414421

crates/hir-def/src/lib.rs

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -831,6 +831,7 @@ pub enum AttrDefId {
831831
ImplId(ImplId),
832832
GenericParamId(GenericParamId),
833833
ExternBlockId(ExternBlockId),
834+
ExternCrateId(ExternCrateId),
834835
}
835836

836837
impl_from!(
@@ -845,7 +846,8 @@ impl_from!(
845846
TypeAliasId,
846847
MacroId(Macro2Id, MacroRulesId, ProcMacroId),
847848
ImplId,
848-
GenericParamId
849+
GenericParamId,
850+
ExternCrateId
849851
for AttrDefId
850852
);
851853

@@ -937,6 +939,12 @@ impl HasModule for AdtId {
937939
}
938940
}
939941

942+
impl HasModule for ExternCrateId {
943+
fn module(&self, db: &dyn db::DefDatabase) -> ModuleId {
944+
self.lookup(db).container
945+
}
946+
}
947+
940948
impl HasModule for VariantId {
941949
fn module(&self, db: &dyn db::DefDatabase) -> ModuleId {
942950
match self {
@@ -1060,6 +1068,7 @@ impl AttrDefId {
10601068
.krate
10611069
}
10621070
AttrDefId::MacroId(it) => it.module(db).krate,
1071+
AttrDefId::ExternCrateId(it) => it.lookup(db).container.krate,
10631072
}
10641073
}
10651074
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1600,11 +1600,14 @@ impl ModCollector<'_, '_> {
16001600
)
16011601
}
16021602
ModItem::ExternCrate(import_id) => {
1603-
let _import_id = ExternCrateLoc {
1603+
let extern_crate_id = ExternCrateLoc {
16041604
container: module,
16051605
id: ItemTreeId::new(self.tree_id, import_id),
16061606
}
16071607
.intern(db);
1608+
self.def_collector.def_map.modules[self.module_id]
1609+
.scope
1610+
.define_extern_crate_decl(extern_crate_id);
16081611
self.def_collector.unresolved_imports.push(ImportDirective {
16091612
module_id: self.module_id,
16101613
import: Import::from_extern_crate(

crates/hir-def/src/resolver.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,10 @@ use crate::{
2222
per_ns::PerNs,
2323
visibility::{RawVisibility, Visibility},
2424
AdtId, AssocItemId, ConstId, ConstParamId, CrateRootModuleId, DefWithBodyId, EnumId,
25-
EnumVariantId, ExternBlockId, FunctionId, GenericDefId, GenericParamId, HasModule, ImplId,
26-
ItemContainerId, LifetimeParamId, LocalModuleId, Lookup, Macro2Id, MacroId, MacroRulesId,
27-
ModuleDefId, ModuleId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId,
28-
TypeOrConstParamId, TypeOwnerId, TypeParamId, VariantId,
25+
EnumVariantId, ExternBlockId, ExternCrateId, FunctionId, GenericDefId, GenericParamId,
26+
HasModule, ImplId, ItemContainerId, LifetimeParamId, LocalModuleId, Lookup, Macro2Id, MacroId,
27+
MacroRulesId, ModuleDefId, ModuleId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId,
28+
TypeAliasId, TypeOrConstParamId, TypeOwnerId, TypeParamId, VariantId,
2929
};
3030

3131
#[derive(Debug, Clone)]
@@ -1018,6 +1018,12 @@ impl HasResolver for ExternBlockId {
10181018
}
10191019
}
10201020

1021+
impl HasResolver for ExternCrateId {
1022+
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1023+
self.lookup(db).container.resolver(db)
1024+
}
1025+
}
1026+
10211027
impl HasResolver for TypeOwnerId {
10221028
fn resolver(self, db: &dyn DefDatabase) -> Resolver {
10231029
match self {

crates/hir-ty/src/diagnostics/decl_check.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ impl<'a> DeclValidator<'a> {
181181
AttrDefId::TraitAliasId(taid) => Some(taid.lookup(self.db.upcast()).container.into()),
182182
AttrDefId::ImplId(iid) => Some(iid.lookup(self.db.upcast()).container.into()),
183183
AttrDefId::ExternBlockId(id) => Some(id.lookup(self.db.upcast()).container.into()),
184+
AttrDefId::ExternCrateId(id) => Some(id.lookup(self.db.upcast()).container.into()),
184185
// These warnings should not explore macro definitions at all
185186
AttrDefId::MacroId(_) => None,
186187
AttrDefId::AdtId(aid) => match aid {

crates/hir/src/attrs.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,7 @@ fn resolve_doc_path(
141141
AttrDefId::ImplId(it) => it.resolver(db.upcast()),
142142
AttrDefId::ExternBlockId(it) => it.resolver(db.upcast()),
143143
AttrDefId::MacroId(it) => it.resolver(db.upcast()),
144+
AttrDefId::ExternCrateId(it) => it.resolver(db.upcast()),
144145
AttrDefId::GenericParamId(it) => match it {
145146
GenericParamId::TypeParamId(it) => it.parent(),
146147
GenericParamId::ConstParamId(it) => it.parent(),

0 commit comments

Comments
 (0)