Skip to content

Commit 74eb3ec

Browse files
committed
Move ChildbySource and HasSource impls to their corresponding modules
1 parent 1ef7a23 commit 74eb3ec

File tree

7 files changed

+229
-218
lines changed

7 files changed

+229
-218
lines changed

crates/hir-def/src/child_by_source.rs

Lines changed: 53 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
77
use either::Either;
88
use hir_expand::{attrs::collect_attrs, HirFileId};
9+
use syntax::ast;
910

1011
use crate::{
1112
db::DefDatabase,
@@ -17,8 +18,9 @@ use crate::{
1718
item_tree::ItemTreeNode,
1819
nameres::DefMap,
1920
src::{HasChildSource, HasSource},
20-
AdtId, AssocItemId, DefWithBodyId, EnumId, FieldId, ImplId, ItemTreeLoc, Lookup, MacroId,
21-
ModuleDefId, ModuleId, TraitId, VariantId,
21+
AdtId, AssocItemId, DefWithBodyId, EnumId, FieldId, GenericDefId, ImplId, ItemTreeLoc,
22+
LifetimeParamId, Lookup, MacroId, ModuleDefId, ModuleId, TraitId, TypeOrConstParamId,
23+
VariantId,
2224
};
2325

2426
pub trait ChildBySource {
@@ -59,14 +61,6 @@ impl ChildBySource for ImplId {
5961
}
6062
}
6163

62-
fn add_assoc_item(db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId, item: AssocItemId) {
63-
match item {
64-
AssocItemId::FunctionId(func) => insert_item_loc(db, res, file_id, func, keys::FUNCTION),
65-
AssocItemId::ConstId(konst) => insert_item_loc(db, res, file_id, konst, keys::CONST),
66-
AssocItemId::TypeAliasId(ty) => insert_item_loc(db, res, file_id, ty, keys::TYPE_ALIAS),
67-
}
68-
}
69-
7064
impl ChildBySource for ModuleId {
7165
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) {
7266
let def_map = self.def_map(db);
@@ -118,14 +112,6 @@ impl ChildBySource for ItemScope {
118112
file_id: HirFileId,
119113
item: ModuleDefId,
120114
) {
121-
macro_rules! insert {
122-
($map:ident[$key:path].$insert:ident($id:ident)) => {{
123-
let loc = $id.lookup(db);
124-
if loc.id.file_id() == file_id {
125-
$map[$key].$insert(loc.source(db).value, $id)
126-
}
127-
}};
128-
}
129115
match item {
130116
ModuleDefId::FunctionId(id) => {
131117
insert_item_loc(db, map, file_id, id, keys::FUNCTION)
@@ -145,9 +131,13 @@ impl ChildBySource for ItemScope {
145131
AdtId::EnumId(id) => insert_item_loc(db, map, file_id, id, keys::ENUM),
146132
},
147133
ModuleDefId::MacroId(id) => match id {
148-
MacroId::Macro2Id(id) => insert!(map[keys::MACRO2].insert(id)),
149-
MacroId::MacroRulesId(id) => insert!(map[keys::MACRO_RULES].insert(id)),
150-
MacroId::ProcMacroId(id) => insert!(map[keys::PROC_MACRO].insert(id)),
134+
MacroId::Macro2Id(id) => insert_item_loc(db, map, file_id, id, keys::MACRO2),
135+
MacroId::MacroRulesId(id) => {
136+
insert_item_loc(db, map, file_id, id, keys::MACRO_RULES)
137+
}
138+
MacroId::ProcMacroId(id) => {
139+
insert_item_loc(db, map, file_id, id, keys::PROC_MACRO)
140+
}
151141
},
152142
ModuleDefId::ModuleId(_)
153143
| ModuleDefId::EnumVariantId(_)
@@ -207,6 +197,40 @@ impl ChildBySource for DefWithBodyId {
207197
}
208198
}
209199

200+
impl ChildBySource for GenericDefId {
201+
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) {
202+
let (gfile_id, generic_params_list) = self.file_id_and_params_of(db);
203+
if gfile_id != file_id {
204+
return;
205+
}
206+
207+
let generic_params = db.generic_params(*self);
208+
let mut toc_idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
209+
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
210+
211+
// For traits the first type index is `Self`, skip it.
212+
if let GenericDefId::TraitId(_) = *self {
213+
toc_idx_iter.next().unwrap(); // advance_by(1);
214+
}
215+
216+
if let Some(generic_params_list) = generic_params_list {
217+
for (local_id, ast_param) in
218+
toc_idx_iter.zip(generic_params_list.type_or_const_params())
219+
{
220+
let id = TypeOrConstParamId { parent: *self, local_id };
221+
match ast_param {
222+
ast::TypeOrConstParam::Type(a) => res[keys::TYPE_PARAM].insert(a, id),
223+
ast::TypeOrConstParam::Const(a) => res[keys::CONST_PARAM].insert(a, id),
224+
}
225+
}
226+
for (local_id, ast_param) in lts_idx_iter.zip(generic_params_list.lifetime_params()) {
227+
let id = LifetimeParamId { parent: *self, local_id };
228+
res[keys::LIFETIME_PARAM].insert(ast_param, id);
229+
}
230+
}
231+
}
232+
}
233+
210234
fn insert_item_loc<ID, N, Data>(
211235
db: &dyn DefDatabase,
212236
res: &mut DynMap,
@@ -224,3 +248,11 @@ fn insert_item_loc<ID, N, Data>(
224248
res[key].insert(loc.source(db).value, id)
225249
}
226250
}
251+
252+
fn add_assoc_item(db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId, item: AssocItemId) {
253+
match item {
254+
AssocItemId::FunctionId(func) => insert_item_loc(db, res, file_id, func, keys::FUNCTION),
255+
AssocItemId::ConstId(konst) => insert_item_loc(db, res, file_id, konst, keys::CONST),
256+
AssocItemId::TypeAliasId(ty) => insert_item_loc(db, res, file_id, ty, keys::TYPE_ALIAS),
257+
}
258+
}

crates/hir-def/src/data/adt.rs

Lines changed: 3 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use hir_expand::{
1010
HirFileId, InFile,
1111
};
1212
use intern::Interned;
13-
use la_arena::{Arena, ArenaMap};
13+
use la_arena::Arena;
1414
use rustc_abi::{Align, Integer, IntegerType, ReprFlags, ReprOptions};
1515
use syntax::ast::{self, HasName, HasVisibility};
1616
use triomphe::Arc;
@@ -22,13 +22,11 @@ use crate::{
2222
lang_item::LangItem,
2323
lower::LowerCtx,
2424
nameres::diagnostics::{DefDiagnostic, DefDiagnostics},
25-
src::HasChildSource,
26-
src::HasSource,
2725
trace::Trace,
2826
tt::{Delimiter, DelimiterKind, Leaf, Subtree, TokenTree},
2927
type_ref::TypeRef,
3028
visibility::RawVisibility,
31-
EnumId, EnumVariantId, LocalFieldId, LocalModuleId, Lookup, StructId, UnionId, VariantId,
29+
EnumId, EnumVariantId, LocalFieldId, LocalModuleId, Lookup, StructId, UnionId,
3230
};
3331

3432
/// Note that we use `StructData` for unions as well!
@@ -387,54 +385,14 @@ impl VariantData {
387385
}
388386
}
389387

390-
impl HasChildSource<LocalFieldId> for VariantId {
391-
type Value = Either<ast::TupleField, ast::RecordField>;
392-
393-
fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<LocalFieldId, Self::Value>> {
394-
let item_tree;
395-
let (src, fields, container) = match *self {
396-
VariantId::EnumVariantId(it) => {
397-
let lookup = it.lookup(db);
398-
item_tree = lookup.id.item_tree(db);
399-
(
400-
lookup.source(db).map(|it| it.kind()),
401-
&item_tree[lookup.id.value].fields,
402-
lookup.parent.lookup(db).container,
403-
)
404-
}
405-
VariantId::StructId(it) => {
406-
let lookup = it.lookup(db);
407-
item_tree = lookup.id.item_tree(db);
408-
(
409-
lookup.source(db).map(|it| it.kind()),
410-
&item_tree[lookup.id.value].fields,
411-
lookup.container,
412-
)
413-
}
414-
VariantId::UnionId(it) => {
415-
let lookup = it.lookup(db);
416-
item_tree = lookup.id.item_tree(db);
417-
(
418-
lookup.source(db).map(|it| it.kind()),
419-
&item_tree[lookup.id.value].fields,
420-
lookup.container,
421-
)
422-
}
423-
};
424-
let mut trace = Trace::new_for_map();
425-
lower_struct(db, &mut trace, &src, container.krate, &item_tree, fields);
426-
src.with_value(trace.into_map())
427-
}
428-
}
429-
430388
#[derive(Debug, Copy, Clone, PartialEq, Eq)]
431389
pub enum StructKind {
432390
Tuple,
433391
Record,
434392
Unit,
435393
}
436394

437-
fn lower_struct(
395+
pub(crate) fn lower_struct(
438396
db: &dyn DefDatabase,
439397
trace: &mut Trace<FieldData, Either<ast::TupleField, ast::RecordField>>,
440398
ast: &InFile<ast::StructKind>,

crates/hir-def/src/generics.rs

Lines changed: 4 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -3,31 +3,27 @@
33
//! generic parameters. See also the `Generics` type and the `generics_of` query
44
//! in rustc.
55
6-
use base_db::FileId;
76
use either::Either;
87
use hir_expand::{
98
name::{AsName, Name},
10-
ExpandResult, HirFileId, InFile,
9+
ExpandResult,
1110
};
1211
use intern::Interned;
13-
use la_arena::{Arena, ArenaMap, Idx};
12+
use la_arena::{Arena, Idx};
1413
use once_cell::unsync::Lazy;
1514
use stdx::impl_from;
1615
use syntax::ast::{self, HasGenericParams, HasName, HasTypeBounds};
1716
use triomphe::Arc;
1817

1918
use crate::{
20-
child_by_source::ChildBySource,
2119
db::DefDatabase,
22-
dyn_map::{keys, DynMap},
2320
expander::Expander,
2421
item_tree::ItemTree,
2522
lower::LowerCtx,
2623
nameres::{DefMap, MacroSubNs},
27-
src::{HasChildSource, HasSource},
2824
type_ref::{ConstRef, LifetimeRef, TypeBound, TypeRef},
29-
AdtId, ConstParamId, GenericDefId, HasModule, LifetimeParamId, LocalLifetimeParamId,
30-
LocalTypeOrConstParamId, Lookup, TypeOrConstParamId, TypeParamId,
25+
AdtId, ConstParamId, GenericDefId, HasModule, LocalTypeOrConstParamId, Lookup,
26+
TypeOrConstParamId, TypeParamId,
3127
};
3228

3329
/// Data about a generic type parameter (to a function, struct, impl, ...).
@@ -507,130 +503,3 @@ impl GenericParams {
507503
})
508504
}
509505
}
510-
511-
fn file_id_and_params_of(
512-
db: &dyn DefDatabase,
513-
def: GenericDefId,
514-
) -> (HirFileId, Option<ast::GenericParamList>) {
515-
match def {
516-
GenericDefId::FunctionId(it) => file_id_and_params_of_item_loc(db, it),
517-
GenericDefId::TypeAliasId(it) => file_id_and_params_of_item_loc(db, it),
518-
GenericDefId::ConstId(_) => (FileId::BOGUS.into(), None),
519-
GenericDefId::AdtId(AdtId::StructId(it)) => file_id_and_params_of_item_loc(db, it),
520-
GenericDefId::AdtId(AdtId::UnionId(it)) => file_id_and_params_of_item_loc(db, it),
521-
GenericDefId::AdtId(AdtId::EnumId(it)) => file_id_and_params_of_item_loc(db, it),
522-
GenericDefId::TraitId(it) => file_id_and_params_of_item_loc(db, it),
523-
GenericDefId::TraitAliasId(it) => file_id_and_params_of_item_loc(db, it),
524-
GenericDefId::ImplId(it) => file_id_and_params_of_item_loc(db, it),
525-
// We won't be using this ID anyway
526-
GenericDefId::EnumVariantId(_) => (FileId::BOGUS.into(), None),
527-
}
528-
}
529-
530-
fn file_id_and_params_of_item_loc<Loc>(
531-
db: &dyn DefDatabase,
532-
def: impl for<'db> Lookup<Database<'db> = dyn DefDatabase + 'db, Data = Loc>,
533-
) -> (HirFileId, Option<ast::GenericParamList>)
534-
where
535-
Loc: HasSource,
536-
Loc::Value: HasGenericParams,
537-
{
538-
let src = def.lookup(db).source(db);
539-
(src.file_id, src.value.generic_param_list())
540-
}
541-
542-
impl HasChildSource<LocalTypeOrConstParamId> for GenericDefId {
543-
type Value = Either<ast::TypeOrConstParam, ast::TraitOrAlias>;
544-
fn child_source(
545-
&self,
546-
db: &dyn DefDatabase,
547-
) -> InFile<ArenaMap<LocalTypeOrConstParamId, Self::Value>> {
548-
let generic_params = db.generic_params(*self);
549-
let mut idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
550-
551-
let (file_id, generic_params_list) = file_id_and_params_of(db, *self);
552-
553-
let mut params = ArenaMap::default();
554-
555-
// For traits and trait aliases the first type index is `Self`, we need to add it before
556-
// the other params.
557-
match *self {
558-
GenericDefId::TraitId(id) => {
559-
let trait_ref = id.lookup(db).source(db).value;
560-
let idx = idx_iter.next().unwrap();
561-
params.insert(idx, Either::Right(ast::TraitOrAlias::Trait(trait_ref)));
562-
}
563-
GenericDefId::TraitAliasId(id) => {
564-
let alias = id.lookup(db).source(db).value;
565-
let idx = idx_iter.next().unwrap();
566-
params.insert(idx, Either::Right(ast::TraitOrAlias::TraitAlias(alias)));
567-
}
568-
_ => {}
569-
}
570-
571-
if let Some(generic_params_list) = generic_params_list {
572-
for (idx, ast_param) in idx_iter.zip(generic_params_list.type_or_const_params()) {
573-
params.insert(idx, Either::Left(ast_param));
574-
}
575-
}
576-
577-
InFile::new(file_id, params)
578-
}
579-
}
580-
581-
impl HasChildSource<LocalLifetimeParamId> for GenericDefId {
582-
type Value = ast::LifetimeParam;
583-
fn child_source(
584-
&self,
585-
db: &dyn DefDatabase,
586-
) -> InFile<ArenaMap<LocalLifetimeParamId, Self::Value>> {
587-
let generic_params = db.generic_params(*self);
588-
let idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
589-
590-
let (file_id, generic_params_list) = file_id_and_params_of(db, *self);
591-
592-
let mut params = ArenaMap::default();
593-
594-
if let Some(generic_params_list) = generic_params_list {
595-
for (idx, ast_param) in idx_iter.zip(generic_params_list.lifetime_params()) {
596-
params.insert(idx, ast_param);
597-
}
598-
}
599-
600-
InFile::new(file_id, params)
601-
}
602-
}
603-
604-
impl ChildBySource for GenericDefId {
605-
fn child_by_source_to(&self, db: &dyn DefDatabase, res: &mut DynMap, file_id: HirFileId) {
606-
let (gfile_id, generic_params_list) = file_id_and_params_of(db, *self);
607-
if gfile_id != file_id {
608-
return;
609-
}
610-
611-
let generic_params = db.generic_params(*self);
612-
let mut toc_idx_iter = generic_params.type_or_consts.iter().map(|(idx, _)| idx);
613-
let lts_idx_iter = generic_params.lifetimes.iter().map(|(idx, _)| idx);
614-
615-
// For traits the first type index is `Self`, skip it.
616-
if let GenericDefId::TraitId(_) = *self {
617-
toc_idx_iter.next().unwrap(); // advance_by(1);
618-
}
619-
620-
if let Some(generic_params_list) = generic_params_list {
621-
for (local_id, ast_param) in
622-
toc_idx_iter.zip(generic_params_list.type_or_const_params())
623-
{
624-
let id = TypeOrConstParamId { parent: *self, local_id };
625-
match ast_param {
626-
ast::TypeOrConstParam::Type(a) => res[keys::TYPE_PARAM].insert(a, id),
627-
ast::TypeOrConstParam::Const(a) => res[keys::CONST_PARAM].insert(a, id),
628-
}
629-
}
630-
for (local_id, ast_param) in lts_idx_iter.zip(generic_params_list.lifetime_params()) {
631-
let id = LifetimeParamId { parent: *self, local_id };
632-
res[keys::LIFETIME_PARAM].insert(ast_param, id);
633-
}
634-
}
635-
}
636-
}

0 commit comments

Comments
 (0)