Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions crates/hir/src/has_source.rs
Original file line number Diff line number Diff line change
Expand Up @@ -129,14 +129,14 @@ impl HasSource for TypeParam {
type Ast = Either<ast::Trait, ast::TypeParam>;
fn source(self, db: &dyn HirDatabase) -> InFile<Self::Ast> {
let child_source = self.id.parent.child_source(db.upcast());
child_source.map(|it| it.type_params[self.id.local_id].clone())
child_source.map(|it| it[self.id.local_id].clone())
}
}

impl HasSource for LifetimeParam {
type Ast = ast::LifetimeParam;
fn source(self, db: &dyn HirDatabase) -> InFile<Self::Ast> {
let child_source = self.id.parent.child_source(db.upcast());
child_source.map(|it| it.lifetime_params[self.id.local_id].clone())
child_source.map(|it| it[self.id.local_id].clone())
}
}
13 changes: 7 additions & 6 deletions crates/hir_def/src/adt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -145,10 +145,12 @@ impl EnumData {
}
}

impl HasChildSource for EnumId {
type ChildId = LocalEnumVariantId;
impl HasChildSource<LocalEnumVariantId> for EnumId {
type Value = ast::Variant;
fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> {
fn child_source(
&self,
db: &dyn DefDatabase,
) -> InFile<ArenaMap<LocalEnumVariantId, Self::Value>> {
let src = self.lookup(db).source(db);
let mut trace = Trace::new_for_map();
lower_enum(db, &mut trace, &src, self.lookup(db).container.module(db));
Expand Down Expand Up @@ -212,11 +214,10 @@ impl VariantData {
}
}

impl HasChildSource for VariantId {
type ChildId = LocalFieldId;
impl HasChildSource<LocalFieldId> for VariantId {
type Value = Either<ast::TupleField, ast::RecordField>;

fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>> {
fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<LocalFieldId, Self::Value>> {
let (src, module_id) = match self {
VariantId::EnumVariantId(it) => {
// I don't really like the fact that we call into parent source
Expand Down
38 changes: 26 additions & 12 deletions crates/hir_def/src/generics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ use crate::{
db::DefDatabase,
dyn_map::DynMap,
keys,
src::HasSource,
src::{HasChildSource, HasSource},
type_ref::{LifetimeRef, TypeBound, TypeRef},
AdtId, GenericDefId, LifetimeParamId, LocalLifetimeParamId, LocalTypeParamId, Lookup,
TypeParamId,
Expand Down Expand Up @@ -73,9 +73,9 @@ pub enum WherePredicateTypeTarget {
}

#[derive(Default)]
pub struct SourceMaps {
pub type_params: ArenaMap<LocalTypeParamId, Either<ast::Trait, ast::TypeParam>>,
pub lifetime_params: ArenaMap<LocalLifetimeParamId, ast::LifetimeParam>,
pub(crate) struct SourceMap {
pub(crate) type_params: ArenaMap<LocalTypeParamId, Either<ast::Trait, ast::TypeParam>>,
lifetime_params: ArenaMap<LocalLifetimeParamId, ast::LifetimeParam>,
}

impl GenericParams {
Expand Down Expand Up @@ -133,9 +133,9 @@ impl GenericParams {
Arc::new(generics)
}

fn new(db: &dyn DefDatabase, def: GenericDefId) -> (GenericParams, InFile<SourceMaps>) {
fn new(db: &dyn DefDatabase, def: GenericDefId) -> (GenericParams, InFile<SourceMap>) {
let mut generics = GenericParams::default();
let mut sm = SourceMaps::default();
let mut sm = SourceMap::default();

// FIXME: add `: Sized` bound for everything except for `Self` in traits
let file_id = match def {
Expand Down Expand Up @@ -214,7 +214,7 @@ impl GenericParams {
pub(crate) fn fill(
&mut self,
lower_ctx: &LowerCtx,
sm: &mut SourceMaps,
sm: &mut SourceMap,
node: &dyn GenericParamsOwner,
) {
if let Some(params) = node.generic_param_list() {
Expand All @@ -241,7 +241,7 @@ impl GenericParams {
fn fill_params(
&mut self,
lower_ctx: &LowerCtx,
sm: &mut SourceMaps,
sm: &mut SourceMap,
params: ast::GenericParamList,
) {
for type_param in params.type_params() {
Expand Down Expand Up @@ -345,10 +345,24 @@ impl GenericParams {
})
}
}
impl GenericDefId {
// FIXME: Change HasChildSource's ChildId AssocItem to be a generic parameter instead
pub fn child_source(&self, db: &dyn DefDatabase) -> InFile<SourceMaps> {
GenericParams::new(db, *self).1

impl HasChildSource<LocalTypeParamId> for GenericDefId {
type Value = Either<ast::Trait, ast::TypeParam>;
fn child_source(
&self,
db: &dyn DefDatabase,
) -> InFile<ArenaMap<LocalTypeParamId, Self::Value>> {
GenericParams::new(db, *self).1.map(|source_maps| source_maps.type_params)
}
}

impl HasChildSource<LocalLifetimeParamId> for GenericDefId {
type Value = ast::LifetimeParam;
fn child_source(
&self,
db: &dyn DefDatabase,
) -> InFile<ArenaMap<LocalLifetimeParamId, Self::Value>> {
GenericParams::new(db, *self).1.map(|source_maps| source_maps.lifetime_params)
}
}

Expand Down
5 changes: 2 additions & 3 deletions crates/hir_def/src/src.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,7 @@ impl<N: ItemTreeNode> HasSource for ItemLoc<N> {
}
}

pub trait HasChildSource {
type ChildId;
pub trait HasChildSource<ChildId> {
type Value;
fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<Self::ChildId, Self::Value>>;
fn child_source(&self, db: &dyn DefDatabase) -> InFile<ArenaMap<ChildId, Self::Value>>;
}