]> git.lizzy.rs Git - rust.git/commitdiff
Support for nested traits
authorAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 20 Dec 2019 11:29:25 +0000 (12:29 +0100)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Fri, 20 Dec 2019 11:29:25 +0000 (12:29 +0100)
crates/ra_hir/src/code_model.rs
crates/ra_hir_def/src/body/lower.rs
crates/ra_hir_def/src/lib.rs
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_ty/src/traits/chalk.rs

index d20e9de632c45898480a0184db24b936aae21283..35e1f752be06d53312754e72d49be5789a345ea5 100644 (file)
@@ -553,7 +553,7 @@ pub struct Trait {
 
 impl Trait {
     pub fn module(self, db: &impl DefDatabase) -> Module {
-        Module { id: self.id.lookup(db).container }
+        Module { id: self.id.lookup(db).container.module(db) }
     }
 
     pub fn name(self, db: &impl DefDatabase) -> Name {
index b61f924b778b7250a086ca1131cffba3bcab7cff..853e17bae7f6ade304692b872a495f7b146bc997 100644 (file)
@@ -26,7 +26,7 @@
     path::Path,
     type_ref::{Mutability, TypeRef},
     ConstLoc, ContainerId, DefWithBodyId, EnumLoc, FunctionLoc, Intern, ModuleDefId, StaticLoc,
-    StructLoc, TypeAliasLoc, UnionLoc,
+    StructLoc, TraitLoc, TypeAliasLoc, UnionLoc,
 };
 
 pub(super) fn lower(
@@ -522,7 +522,14 @@ fn collect_block_items(&mut self, block: &ast::Block) {
                     let ast_id = self.expander.ast_id(&def);
                     UnionLoc { container, ast_id }.intern(self.db).into()
                 }
-                _ => continue,
+                ast::ModuleItem::TraitDef(def) => {
+                    let ast_id = self.expander.ast_id(&def);
+                    TraitLoc { container, ast_id }.intern(self.db).into()
+                }
+                ast::ModuleItem::ImplBlock(_)
+                | ast::ModuleItem::UseItem(_)
+                | ast::ModuleItem::ExternCrateItem(_)
+                | ast::ModuleItem::Module(_) => continue,
             };
             self.body.defs.push(def)
         }
index 9b192b597ac7d5deb4142f774ee9a10adab1d324..140eccf267c83edb64303fe1fcc56e2fd9109166 100644 (file)
@@ -235,7 +235,7 @@ fn lookup(&self, db: &impl db::DefDatabase) -> StaticLoc {
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
 pub struct TraitLoc {
-    pub container: ModuleId,
+    pub container: ContainerId,
     pub ast_id: AstId<ast::TraitDef>,
 }
 
@@ -499,7 +499,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
         match *self {
             AssocContainerId::ContainerId(it) => it.module(db),
             AssocContainerId::ImplId(it) => it.lookup(db).container,
-            AssocContainerId::TraitId(it) => it.lookup(db).container,
+            AssocContainerId::TraitId(it) => it.lookup(db).container.module(db),
         }
     }
 }
@@ -548,7 +548,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
         match self {
             GenericDefId::FunctionId(it) => it.lookup(db).module(db),
             GenericDefId::AdtId(it) => it.module(db),
-            GenericDefId::TraitId(it) => it.lookup(db).container,
+            GenericDefId::TraitId(it) => it.lookup(db).container.module(db),
             GenericDefId::TypeAliasId(it) => it.lookup(db).module(db),
             GenericDefId::ImplId(it) => it.lookup(db).container,
             GenericDefId::EnumVariantId(it) => it.parent.lookup(db).container.module(db),
index 74c3d4670d7fed2fe13b16511d289cec2b256bcc..a1ea130e0865ff6912568370b80c32d3fece3b79 100644 (file)
@@ -802,7 +802,7 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
                 PerNs::values(def.into())
             }
             raw::DefKind::Trait(ast_id) => {
-                let def = TraitLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) }
+                let def = TraitLoc { container, ast_id: AstId::new(self.file_id, ast_id) }
                     .intern(self.def_collector.db);
 
                 PerNs::types(def.into())
index 6a31014d8b86a752f824326258d12bcb5e570ac0..dd4fa9664a776b1c94939b40498d6b7f00e08a82 100644 (file)
@@ -9,7 +9,9 @@
 };
 use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum, TraitDatum};
 
-use hir_def::{AssocContainerId, AssocItemId, GenericDefId, ImplId, Lookup, TraitId, TypeAliasId};
+use hir_def::{
+    AssocContainerId, AssocItemId, GenericDefId, HasModule, ImplId, Lookup, TraitId, TypeAliasId,
+};
 use ra_db::{
     salsa::{InternId, InternKey},
     CrateId,
@@ -591,7 +593,7 @@ pub(crate) fn trait_datum_query(
     let bound_vars = Substs::bound_vars(&generic_params);
     let flags = chalk_rust_ir::TraitFlags {
         auto: trait_data.auto,
-        upstream: trait_.lookup(db).container.krate != krate,
+        upstream: trait_.lookup(db).container.module(db).krate != krate,
         non_enumerable: true,
         coinductive: false, // only relevant for Chalk testing
         // FIXME set these flags correctly