]> git.lizzy.rs Git - rust.git/commitdiff
Move traits to the new loc
authorAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 12 Dec 2019 13:34:03 +0000 (14:34 +0100)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 12 Dec 2019 13:36:14 +0000 (14:36 +0100)
16 files changed:
crates/ra_hir/src/code_model.rs
crates/ra_hir/src/from_source.rs
crates/ra_hir/src/has_source.rs
crates/ra_hir_def/src/attr.rs
crates/ra_hir_def/src/child_by_source.rs
crates/ra_hir_def/src/data.rs
crates/ra_hir_def/src/db.rs
crates/ra_hir_def/src/docs.rs
crates/ra_hir_def/src/generics.rs
crates/ra_hir_def/src/keys.rs
crates/ra_hir_def/src/lib.rs
crates/ra_hir_def/src/nameres/collector.rs
crates/ra_hir_def/src/resolver.rs
crates/ra_hir_def/src/src.rs
crates/ra_hir_expand/src/builtin_macro.rs
crates/ra_hir_ty/src/traits/chalk.rs

index 117ca2fe32d6382aba6ee0cc6e5f198c08b95835..78c7792bf3e8afc23196cd4b6ed609fb118260dd 100644 (file)
@@ -577,7 +577,7 @@ pub struct Trait {
 
 impl Trait {
     pub fn module(self, db: &impl DefDatabase) -> Module {
-        Module { id: self.id.module(db) }
+        Module { id: self.id.lookup(db).container }
     }
 
     pub fn name(self, db: &impl DefDatabase) -> Name {
index b35188a21c9654fb6742f17cd5621d419a5b4544..0cf4bcae15b8b87b40d84c36b0c0418dd070bf11 100644 (file)
@@ -44,8 +44,10 @@ fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) ->
 impl FromSource for Trait {
     type Ast = ast::TraitDef;
     fn from_source(db: &(impl DefDatabase + AstDatabase), src: InFile<Self::Ast>) -> Option<Self> {
-        let id = from_source(db, src)?;
-        Some(Trait { id })
+        // XXX: use `.parent()` to avoid finding ourselves
+        let parent = src.value.syntax().parent()?;
+        let container = Container::find(db, src.with_value(parent).as_ref())?;
+        container.child_by_source(db)[keys::TRAIT].get(&src).copied().map(Trait::from)
     }
 }
 impl FromSource for Function {
index a888fe995ca7fc823c1c2a955fd1589a61faae21..c4c6d66b7568e2c19d4a8ecb96dcaf264f96c42e 100644 (file)
@@ -93,7 +93,7 @@ fn source(self, db: &impl DefDatabase) -> InFile<ast::StaticDef> {
 impl HasSource for Trait {
     type Ast = ast::TraitDef;
     fn source(self, db: &impl DefDatabase) -> InFile<ast::TraitDef> {
-        self.id.source(db)
+        self.id.lookup(db).source(db)
     }
 }
 impl HasSource for TypeAlias {
index 12d4e777a7938cc79344bdaa43b94326812bf301..3347d819c707d0c124f8d11ba2e04cdd35600943 100644 (file)
@@ -60,7 +60,7 @@ pub(crate) fn attrs_query(db: &impl DefDatabase, def: AttrDefId) -> Attrs {
                 AdtId::EnumId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
                 AdtId::UnionId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
             },
-            AttrDefId::TraitId(it) => attrs_from_ast(it.lookup_intern(db).ast_id, db),
+            AttrDefId::TraitId(it) => attrs_from_loc(it.lookup(db), db),
             AttrDefId::MacroDefId(it) => {
                 it.ast_id.map_or_else(Default::default, |ast_id| attrs_from_ast(ast_id, db))
             }
index 821549bd58073183d370a54823f849f9f82867a8..88c2d3f242ded649633f396bcc8262c543744766 100644 (file)
@@ -94,6 +94,10 @@ fn child_by_source(&self, db: &impl DefDatabase) -> DynMap {
                     let src = ty.lookup(db).source(db);
                     res[keys::TYPE_ALIAS].insert(src, ty)
                 }
+                ModuleDefId::TraitId(trait_) => {
+                    let src = trait_.lookup(db).source(db);
+                    res[keys::TRAIT].insert(src, trait_)
+                }
                 _ => (),
             }
         }
index 42821b9b11b7da5f0159828c6149e7d5750860cc..b2dac183e3bdbd077b06616ad4bc9d81af7dce7a 100644 (file)
@@ -12,8 +12,8 @@
     db::DefDatabase,
     src::HasSource,
     type_ref::{Mutability, TypeRef},
-    AssocItemId, AstItemDef, ConstId, ConstLoc, ContainerId, FunctionId, FunctionLoc, ImplId,
-    Intern, Lookup, StaticId, TraitId, TypeAliasId, TypeAliasLoc,
+    AssocItemId, ConstId, ConstLoc, ContainerId, FunctionId, FunctionLoc, ImplId, Intern, Lookup,
+    StaticId, TraitId, TypeAliasId, TypeAliasLoc,
 };
 
 #[derive(Debug, Clone, PartialEq, Eq)]
@@ -94,7 +94,7 @@ pub struct TraitData {
 
 impl TraitData {
     pub(crate) fn trait_data_query(db: &impl DefDatabase, tr: TraitId) -> Arc<TraitData> {
-        let src = tr.source(db);
+        let src = tr.lookup(db).source(db);
         let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
         let auto = src.value.is_auto();
         let ast_id_map = db.ast_id_map(src.file_id);
index 8907aacca49e2e4295f91bcbf05ca5487bffe8e5..f0c2ae559a5540bb51b3536ffaffb8664b6ee85d 100644 (file)
@@ -18,8 +18,8 @@
         CrateDefMap,
     },
     AttrDefId, ConstId, ConstLoc, DefWithBodyId, EnumId, FunctionId, FunctionLoc, GenericDefId,
-    ImplId, ImplLoc, ItemLoc, ModuleId, StaticId, StaticLoc, StructId, TraitId, TypeAliasId,
-    TypeAliasLoc, UnionId,
+    ImplId, ImplLoc, ItemLoc, ModuleId, StaticId, StaticLoc, StructId, TraitId, TraitLoc,
+    TypeAliasId, TypeAliasLoc, UnionId,
 };
 
 #[salsa::query_group(InternDatabaseStorage)]
@@ -37,7 +37,7 @@ pub trait InternDatabase: SourceDatabase {
     #[salsa::interned]
     fn intern_static(&self, loc: StaticLoc) -> StaticId;
     #[salsa::interned]
-    fn intern_trait(&self, loc: ItemLoc<ast::TraitDef>) -> TraitId;
+    fn intern_trait(&self, loc: TraitLoc) -> TraitId;
     #[salsa::interned]
     fn intern_type_alias(&self, loc: TypeAliasLoc) -> TypeAliasId;
     #[salsa::interned]
index 61727bd26088ade362b5c0f6c055081219cce9a7..1921681fbd8b9847c982e9ca0e1427618a801cbf 100644 (file)
@@ -59,7 +59,7 @@ pub(crate) fn documentation_query(
                 let src = it.parent.child_source(db);
                 docs_from_ast(&src.value[it.local_id])
             }
-            AttrDefId::TraitId(it) => docs_from_ast(&it.source(db).value),
+            AttrDefId::TraitId(it) => docs_from_ast(&it.lookup(db).source(db).value),
             AttrDefId::MacroDefId(it) => docs_from_ast(&it.ast_id?.to_node(db)),
             AttrDefId::ConstId(it) => docs_from_ast(&it.lookup(db).source(db).value),
             AttrDefId::StaticId(it) => docs_from_ast(&it.lookup(db).source(db).value),
index 5d1100945821acb563ce3e7c6425f4cdce2a90e7..cbfc3ff049184bb05961738ee8459f59ad337cab 100644 (file)
@@ -86,7 +86,7 @@ fn new(db: &impl DefDatabase, def: GenericDefId) -> (GenericParams, InFile<Sourc
                 src.file_id
             }
             GenericDefId::TraitId(it) => {
-                let src = it.source(db);
+                let src = it.lookup(db).source(db);
 
                 // traits get the Self type as an implicit first type parameter
                 let self_param_id =
index d318b2451d757677a8337d32dbf8691bb6ab2bad..6ec58f5f9a3974a20c971c3767e5534329d783b8 100644 (file)
@@ -8,7 +8,8 @@
 
 use crate::{
     dyn_map::{DynMap, Policy},
-    ConstId, EnumVariantId, FunctionId, ImplId, StaticId, StructFieldId, TypeAliasId, TypeParamId,
+    ConstId, EnumVariantId, FunctionId, ImplId, StaticId, StructFieldId, TraitId, TypeAliasId,
+    TypeParamId,
 };
 
 type Key<K, V> = crate::dyn_map::Key<InFile<K>, V, AstPtrPolicy<K, V>>;
@@ -18,6 +19,7 @@
 pub const STATIC: Key<ast::StaticDef, StaticId> = Key::new();
 pub const TYPE_ALIAS: Key<ast::TypeAliasDef, TypeAliasId> = Key::new();
 pub const IMPL: Key<ast::ImplBlock, ImplId> = Key::new();
+pub const TRAIT: Key<ast::TraitDef, TraitId> = Key::new();
 
 pub const ENUM_VARIANT: Key<ast::EnumVariant, EnumVariantId> = Key::new();
 pub const TUPLE_FIELD: Key<ast::TupleFieldDef, StructFieldId> = Key::new();
index 5564b166bf7af6f3e073483f9c576048289e74ab..0fcc2cde4977c3bbfe6cb91c8cc7ad064cb8fd49 100644 (file)
@@ -253,12 +253,24 @@ fn lookup(&self, db: &impl db::DefDatabase) -> StaticLoc {
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct TraitId(salsa::InternId);
 impl_intern_key!(TraitId);
-impl AstItemDef<ast::TraitDef> for TraitId {
-    fn intern(db: &impl InternDatabase, loc: ItemLoc<ast::TraitDef>) -> Self {
-        db.intern_trait(loc)
+
+#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+pub struct TraitLoc {
+    pub container: ModuleId,
+    pub ast_id: AstId<ast::TraitDef>,
+}
+
+impl Intern for TraitLoc {
+    type ID = TraitId;
+    fn intern(self, db: &impl db::DefDatabase) -> TraitId {
+        db.intern_trait(self)
     }
-    fn lookup_intern(self, db: &impl InternDatabase) -> ItemLoc<ast::TraitDef> {
-        db.lookup_intern_trait(self)
+}
+
+impl Lookup for TraitId {
+    type Data = TraitLoc;
+    fn lookup(&self, db: &impl db::DefDatabase) -> TraitLoc {
+        db.lookup_intern_trait(*self)
     }
 }
 
@@ -492,7 +504,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
         match self.container {
             ContainerId::ModuleId(it) => it,
             ContainerId::ImplId(it) => it.lookup(db).container,
-            ContainerId::TraitId(it) => it.module(db),
+            ContainerId::TraitId(it) => it.lookup(db).container,
         }
     }
 }
@@ -502,7 +514,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
         match self.container {
             ContainerId::ModuleId(it) => it,
             ContainerId::ImplId(it) => it.lookup(db).container,
-            ContainerId::TraitId(it) => it.module(db),
+            ContainerId::TraitId(it) => it.lookup(db).container,
         }
     }
 }
@@ -512,7 +524,7 @@ fn module(&self, db: &impl db::DefDatabase) -> ModuleId {
         match self.container {
             ContainerId::ModuleId(it) => it,
             ContainerId::ImplId(it) => it.lookup(db).container,
-            ContainerId::TraitId(it) => it.module(db),
+            ContainerId::TraitId(it) => it.lookup(db).container,
         }
     }
 }
@@ -542,7 +554,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.module(db),
+            GenericDefId::TraitId(it) => it.lookup(db).container,
             GenericDefId::TypeAliasId(it) => it.lookup(db).module(db),
             GenericDefId::ImplId(it) => it.lookup(db).container,
             GenericDefId::EnumVariantId(it) => it.parent.module(db),
index b33507a9ae0c406d01feb3c75062dfc919c9b1a0..a7bdd620b428b3b14ba20293e94acc382544b977 100644 (file)
@@ -26,7 +26,7 @@
     per_ns::PerNs,
     AdtId, AstId, AstItemDef, ConstLoc, ContainerId, EnumId, EnumVariantId, FunctionLoc, ImplLoc,
     Intern, LocalImportId, LocalModuleId, LocationCtx, ModuleDefId, ModuleId, StaticLoc, StructId,
-    TraitId, TypeAliasLoc, UnionId,
+    TraitLoc, TypeAliasLoc, UnionId,
 };
 
 pub(super) fn collect_defs(db: &impl DefDatabase, mut def_map: CrateDefMap) -> CrateDefMap {
@@ -796,7 +796,12 @@ fn define_def(&mut self, def: &raw::DefData, attrs: &Attrs) {
 
                 PerNs::values(def.into())
             }
-            raw::DefKind::Trait(ast_id) => PerNs::types(TraitId::from_ast_id(ctx, ast_id).into()),
+            raw::DefKind::Trait(ast_id) => {
+                let def = TraitLoc { container: module, ast_id: AstId::new(self.file_id, ast_id) }
+                    .intern(self.def_collector.db);
+
+                PerNs::types(def.into())
+            }
             raw::DefKind::TypeAlias(ast_id) => {
                 let def = TypeAliasLoc {
                     container: ContainerId::ModuleId(module),
index f87b16b447286b880b06aa431f8d239247dfb997..17b2169d2a527e49b016d8223de3f422a5f73677 100644 (file)
@@ -17,9 +17,9 @@
     nameres::{BuiltinShadowMode, CrateDefMap},
     path::{Path, PathKind},
     per_ns::PerNs,
-    AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, EnumVariantId, FunctionId,
-    GenericDefId, HasModule, ImplId, LocalModuleId, Lookup, ModuleDefId, ModuleId, StaticId,
-    StructId, TraitId, TypeAliasId, TypeParamId, VariantId,
+    AdtId, ConstId, ContainerId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, GenericDefId,
+    HasModule, ImplId, LocalModuleId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId,
+    TypeAliasId, TypeParamId, VariantId,
 };
 
 #[derive(Debug, Clone, Default)]
@@ -524,7 +524,7 @@ fn resolver(self, db: &impl DefDatabase) -> Resolver {
 
 impl HasResolver for TraitId {
     fn resolver(self, db: &impl DefDatabase) -> Resolver {
-        self.module(db).resolver(db).push_generic_params_scope(db, self.into())
+        self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
     }
 }
 
index a5c4359a73e963e8988f3aae5d08f1d284487aff..858e4861eb69ea34c8fb6cf2d1e0ab95d124cd52 100644 (file)
@@ -4,7 +4,7 @@
 use ra_arena::map::ArenaMap;
 use ra_syntax::ast;
 
-use crate::{db::DefDatabase, ConstLoc, FunctionLoc, ImplLoc, StaticLoc, TypeAliasLoc};
+use crate::{db::DefDatabase, ConstLoc, FunctionLoc, ImplLoc, StaticLoc, TraitLoc, TypeAliasLoc};
 
 pub trait HasSource {
     type Value;
@@ -56,6 +56,15 @@ fn source(&self, db: &impl DefDatabase) -> InFile<ast::ImplBlock> {
     }
 }
 
+impl HasSource for TraitLoc {
+    type Value = ast::TraitDef;
+
+    fn source(&self, db: &impl DefDatabase) -> InFile<ast::TraitDef> {
+        let node = self.ast_id.to_node(db);
+        InFile::new(self.ast_id.file_id, node)
+    }
+}
+
 pub trait HasChildSource {
     type ChildId;
     type Value;
index ec5ace757c663767fe1f04eb5c251a6ef60037bc..be5f3cbe35eee9b4735c7ec17a865950d6431a7a 100644 (file)
@@ -367,6 +367,9 @@ macro_rules! format_args {
             BuiltinFnLikeExpander::FormatArgs,
         );
 
-        assert_eq!(expanded, r#"std::fmt::Arguments::new_v1(&[] ,&[std::fmt::ArgumentV1::new(&(arg1(a,b,c)),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(arg2),std::fmt::Display::fmt),])"#);
+        assert_eq!(
+            expanded,
+            r#"std::fmt::Arguments::new_v1(&[] ,&[std::fmt::ArgumentV1::new(&(arg1(a,b,c)),std::fmt::Display::fmt),std::fmt::ArgumentV1::new(&(arg2),std::fmt::Display::fmt),])"#
+        );
     }
 }
index ff299f511ecc4726af99e3c5c0822070b940ce89..fc21872b2bd15bfd28ea411fd95744d8fd593ff5 100644 (file)
@@ -9,9 +9,7 @@
 };
 use chalk_rust_ir::{AssociatedTyDatum, AssociatedTyValue, ImplDatum, StructDatum, TraitDatum};
 
-use hir_def::{
-    AssocItemId, AstItemDef, ContainerId, GenericDefId, ImplId, Lookup, TraitId, TypeAliasId,
-};
+use hir_def::{AssocItemId, ContainerId, GenericDefId, ImplId, Lookup, TraitId, TypeAliasId};
 use ra_db::{
     salsa::{InternId, InternKey},
     CrateId,
@@ -593,7 +591,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_.module(db).krate != krate,
+        upstream: trait_.lookup(db).container.krate != krate,
         non_enumerable: true,
         coinductive: false, // only relevant for Chalk testing
         // FIXME set these flags correctly