]> git.lizzy.rs Git - rust.git/commitdiff
Change HasChildSource::ChildId assoc item to generic param
authorLukas Wirth <lukastw97@gmail.com>
Mon, 14 Dec 2020 16:11:27 +0000 (17:11 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Tue, 15 Dec 2020 17:21:01 +0000 (18:21 +0100)
crates/hir/src/has_source.rs
crates/hir_def/src/adt.rs
crates/hir_def/src/generics.rs
crates/hir_def/src/src.rs

index 1e64a1614b3dc96228e1cfa7b45826a68a33dfe8..552c8e433e5e1e54b4e7c29cb79fc2256cffb491 100644 (file)
@@ -129,7 +129,7 @@ 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())
     }
 }
 
@@ -137,6 +137,6 @@ 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())
     }
 }
index 6539959c3c3bec11b2768e3037aa1f278017859b..eafa3abb6ab599e85791e9854c3755269f06330e 100644 (file)
@@ -145,10 +145,12 @@ pub fn variant(&self, name: &Name) -> Option<LocalEnumVariantId> {
     }
 }
 
-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));
@@ -212,11 +214,10 @@ pub fn kind(&self) -> StructKind {
     }
 }
 
-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
index 81912a4546f82f648d479b2610f563c049c82405..924046435b8a7e72c005241f3aad0aa6a270311b 100644 (file)
@@ -19,7 +19,7 @@
     db::DefDatabase,
     dyn_map::DynMap,
     keys,
-    src::HasSource,
+    src::{HasChildSource, HasSource},
     type_ref::{LifetimeRef, TypeBound, TypeRef},
     AdtId, GenericDefId, LifetimeParamId, LocalLifetimeParamId, LocalTypeParamId, Lookup,
     TypeParamId,
@@ -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 {
@@ -133,9 +133,9 @@ pub(crate) fn generic_params_query(
         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 {
@@ -214,7 +214,7 @@ fn new(db: &dyn DefDatabase, def: GenericDefId) -> (GenericParams, InFile<Source
     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() {
@@ -241,7 +241,7 @@ pub(crate) fn fill_bounds(
     fn fill_params(
         &mut self,
         lower_ctx: &LowerCtx,
-        sm: &mut SourceMaps,
+        sm: &mut SourceMap,
         params: ast::GenericParamList,
     ) {
         for type_param in params.type_params() {
@@ -345,10 +345,24 @@ pub fn find_trait_self_param(&self) -> Option<LocalTypeParamId> {
         })
     }
 }
-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)
     }
 }
 
index 7a79b0314993d22a7d37b1a82f9c391beb29c07a..f67244b464701bc0b44a7937da3bd6cedfab5388 100644 (file)
@@ -36,8 +36,7 @@ fn source(&self, db: &dyn DefDatabase) -> InFile<N::Source> {
     }
 }
 
-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>>;
 }