]> git.lizzy.rs Git - rust.git/commitdiff
move consts&statics to new id
authorAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 24 Jan 2019 21:50:08 +0000 (00:50 +0300)
committerAleksey Kladov <aleksey.kladov@gmail.com>
Thu, 24 Jan 2019 21:50:08 +0000 (00:50 +0300)
crates/ra_hir/src/code_model_api.rs
crates/ra_hir/src/code_model_impl/module.rs
crates/ra_hir/src/ids.rs
crates/ra_hir/src/nameres/lower.rs
crates/ra_hir/src/ty.rs
crates/ra_ide_api/src/completion/complete_path.rs
crates/ra_ide_api/src/completion/completion_item.rs
crates/ra_ide_api/src/navigation_target.rs

index 1fa591ea4406b7ee1dde7951eb2471142b7e2097..d82dda79a7283e8469668f59bd06979a7612fad3 100644 (file)
@@ -16,7 +16,7 @@
     code_model_impl::def_id_to_ast,
     docs::{Documentation, Docs, docs_from_ast},
     module_tree::ModuleId,
-    ids::{FunctionId, StructId, EnumId, EnumVariantId, AstItemDef},
+    ids::{FunctionId, StructId, EnumId, EnumVariantId, AstItemDef, ConstId, StaticId},
 };
 
 /// hir::Crate describes a single crate. It's the main interface with which
@@ -47,8 +47,6 @@ pub fn root_module(&self, db: &impl HirDatabase) -> Option<Module> {
 
 #[derive(Debug)]
 pub enum Def {
-    Const(Const),
-    Static(Static),
     Trait(Trait),
     Type(Type),
     Item,
@@ -67,11 +65,21 @@ pub enum ModuleDef {
     Function(Function),
     Struct(Struct),
     Enum(Enum),
-    // Can't be directly declared, but can be imported.
     EnumVariant(EnumVariant),
+    Const(Const),
+    Static(Static),
+    // Can't be directly declared, but can be imported.
     Def(DefId),
 }
-impl_froms!(ModuleDef: Module, Function, Struct, Enum, EnumVariant);
+impl_froms!(
+    ModuleDef: Module,
+    Function,
+    Struct,
+    Enum,
+    EnumVariant,
+    Const,
+    Static
+);
 
 impl From<DefId> for ModuleDef {
     fn from(it: DefId) -> ModuleDef {
@@ -386,18 +394,14 @@ fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
     }
 }
 
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct Const {
-    pub(crate) def_id: DefId,
+    pub(crate) id: ConstId,
 }
 
 impl Const {
-    pub(crate) fn new(def_id: DefId) -> Const {
-        Const { def_id }
-    }
-
     pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::ConstDef>) {
-        def_id_to_ast(db, self.def_id)
+        self.id.source(db)
     }
 }
 
@@ -407,18 +411,14 @@ fn docs(&self, db: &impl HirDatabase) -> Option<Documentation> {
     }
 }
 
-#[derive(Debug, Clone, PartialEq, Eq, Hash)]
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
 pub struct Static {
-    pub(crate) def_id: DefId,
+    pub(crate) id: StaticId,
 }
 
 impl Static {
-    pub(crate) fn new(def_id: DefId) -> Static {
-        Static { def_id }
-    }
-
     pub fn source(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::StaticDef>) {
-        def_id_to_ast(db, self.def_id)
+        self.id.source(db)
     }
 }
 
index aa5e5d68953ee45df240ea7df7e5b93b5f2a7266..1518825c71d3e7e12a9f9b28236ed38288a351ab 100644 (file)
@@ -147,7 +147,11 @@ pub(crate) fn resolve_path_impl(&self, db: &impl HirDatabase, path: &Path) -> Pe
                         None => PerNs::none(),
                     }
                 }
-                ModuleDef::Function(_) | ModuleDef::Struct(_) | ModuleDef::EnumVariant(_) => {
+                ModuleDef::Function(_)
+                | ModuleDef::Struct(_)
+                | ModuleDef::Const(_)
+                | ModuleDef::Static(_)
+                | ModuleDef::EnumVariant(_) => {
                     // could be an inherent method call in UFCS form
                     // (`Struct::method`), or some other kind of associated
                     // item... Which we currently don't handle (TODO)
index 4b4e07e58704c9c904afb73869aacdb728dfc64d..9aae58bb63dac566b1d1d12715ef8b53c47f75e5 100644 (file)
@@ -9,7 +9,7 @@
 
 use crate::{
     HirDatabase, Def,
-    Module, Trait, Type, Static, Const,
+    Module, Trait, Type,
 };
 
 #[derive(Debug, Default)]
@@ -20,6 +20,8 @@ pub struct HirInterner {
     structs: LocationIntener<ItemLoc<ast::StructDef>, StructId>,
     enums: LocationIntener<ItemLoc<ast::EnumDef>, EnumId>,
     enum_variants: LocationIntener<ItemLoc<ast::EnumVariant>, EnumVariantId>,
+    consts: LocationIntener<ItemLoc<ast::ConstDef>, ConstId>,
+    statics: LocationIntener<ItemLoc<ast::StaticDef>, StaticId>,
 }
 
 impl HirInterner {
@@ -246,6 +248,24 @@ fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::EnumVariant
     }
 }
 
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct ConstId(RawId);
+impl_arena_id!(ConstId);
+impl AstItemDef<ast::ConstDef> for ConstId {
+    fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::ConstDef>, Self> {
+        &interner.consts
+    }
+}
+
+#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
+pub struct StaticId(RawId);
+impl_arena_id!(StaticId);
+impl AstItemDef<ast::StaticDef> for StaticId {
+    fn interner(interner: &HirInterner) -> &LocationIntener<ItemLoc<ast::StaticDef>, Self> {
+        &interner.statics
+    }
+}
+
 /// Def's are a core concept of hir. A `Def` is an Item (function, module, etc)
 /// in a specific module.
 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -261,8 +281,6 @@ pub struct DefLoc {
 
 #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
 pub(crate) enum DefKind {
-    Const,
-    Static,
     Trait,
     Type,
     Item,
@@ -286,14 +304,6 @@ pub(crate) fn loc(self, db: &impl AsRef<HirInterner>) -> DefLoc {
     pub fn resolve(self, db: &impl HirDatabase) -> Def {
         let loc = self.loc(db);
         match loc.kind {
-            DefKind::Const => {
-                let def = Const::new(self);
-                Def::Const(def)
-            }
-            DefKind::Static => {
-                let def = Static::new(self);
-                Def::Static(def)
-            }
             DefKind::Trait => {
                 let def = Trait::new(self);
                 Def::Trait(def)
index 0056bdd5a13a76710c9f82aea742053dd6ca7831..6a86e5fd4f7550777239d01a9453e8e762916d1f 100644 (file)
@@ -10,7 +10,7 @@
 use crate::{
     SourceItemId, Path, ModuleSource, HirDatabase, Name, SourceFileItems,
     HirFileId, MacroCallLoc, AsName, PerNs, DefKind, DefLoc, Function,
-    ModuleDef, Module, Struct, Enum,
+    ModuleDef, Module, Struct, Enum, Const, Static,
     ids::LocationCtx,
 };
 
@@ -187,8 +187,22 @@ fn add_def_id(
                 // TODO
                 return;
             }
-            ast::ModuleItemKind::ConstDef(it) => it.name(),
-            ast::ModuleItemKind::StaticDef(it) => it.name(),
+            ast::ModuleItemKind::ConstDef(it) => {
+                if let Some(name) = it.name() {
+                    let c = Const { id: ctx.to_def(it) };
+                    self.declarations
+                        .insert(name.as_name(), PerNs::values(c.into()));
+                }
+                return;
+            }
+            ast::ModuleItemKind::StaticDef(it) => {
+                if let Some(name) = it.name() {
+                    let s = Static { id: ctx.to_def(it) };
+                    self.declarations
+                        .insert(name.as_name(), PerNs::values(s.into()));
+                }
+                return;
+            }
             ast::ModuleItemKind::Module(_) => {
                 // modules are handled separately direclty by nameres
                 return;
@@ -246,8 +260,8 @@ fn for_syntax_kind(kind: SyntaxKind) -> PerNs<DefKind> {
             SyntaxKind::ENUM_DEF => unreachable!(),
             SyntaxKind::TRAIT_DEF => PerNs::types(DefKind::Trait),
             SyntaxKind::TYPE_DEF => PerNs::types(DefKind::Type),
-            SyntaxKind::CONST_DEF => PerNs::values(DefKind::Const),
-            SyntaxKind::STATIC_DEF => PerNs::values(DefKind::Static),
+            SyntaxKind::CONST_DEF => unreachable!(),
+            SyntaxKind::STATIC_DEF => unreachable!(),
             _ => PerNs::none(),
         }
     }
index 9a1a90eed81f5e47525247f26c2bbae73d231ed0..6d61500967d8947df4a9ddac91bcd86f0c57f582 100644 (file)
@@ -693,7 +693,10 @@ fn from(def: ModuleDef) -> Option<TypableDef> {
             ModuleDef::Struct(s) => s.into(),
             ModuleDef::Enum(e) => e.into(),
             ModuleDef::EnumVariant(v) => v.into(),
-            ModuleDef::Def(_) | ModuleDef::Module(_) => return None,
+            ModuleDef::Const(_)
+            | ModuleDef::Static(_)
+            | ModuleDef::Def(_)
+            | ModuleDef::Module(_) => return None,
         };
         Some(res)
     }
index 4768efdc1969d4e4a08bd4d657003dbc71d25cd2..bd5484516608853eafc21ea2ba8ee337021ac37c 100644 (file)
@@ -43,6 +43,8 @@ pub(super) fn complete_path(acc: &mut Completions, ctx: &CompletionContext) {
         hir::ModuleDef::Function(_)
         | hir::ModuleDef::Struct(_)
         | hir::ModuleDef::Def(_)
+        | hir::ModuleDef::Const(_)
+        | hir::ModuleDef::Static(_)
         | hir::ModuleDef::EnumVariant(_) => return,
     };
 }
index ee1f8bce06999671bec72b0c55370a8fe4283247..2f8ec41d275df3f82d75c7269de0061f7013e458 100644 (file)
@@ -223,11 +223,11 @@ pub(super) fn from_resolution(
             hir::ModuleDef::Struct(it) => (CompletionItemKind::Struct, it.docs(ctx.db)),
             hir::ModuleDef::Enum(it) => (CompletionItemKind::Enum, it.docs(ctx.db)),
             hir::ModuleDef::EnumVariant(it) => (CompletionItemKind::EnumVariant, it.docs(ctx.db)),
+            hir::ModuleDef::Const(it) => (CompletionItemKind::Const, it.docs(ctx.db)),
+            hir::ModuleDef::Static(it) => (CompletionItemKind::Static, it.docs(ctx.db)),
             hir::ModuleDef::Def(def_id) => match def_id.resolve(ctx.db) {
                 hir::Def::Trait(it) => (CompletionItemKind::Trait, it.docs(ctx.db)),
                 hir::Def::Type(it) => (CompletionItemKind::TypeAlias, it.docs(ctx.db)),
-                hir::Def::Const(it) => (CompletionItemKind::Const, it.docs(ctx.db)),
-                hir::Def::Static(it) => (CompletionItemKind::Static, it.docs(ctx.db)),
                 _ => return self,
             },
         };
index fc76338d22ce07fdf07124b78fa4ee56051cd7bd..8406fee31c0bfcc2d6300d6dc62699ae2d3e38e1 100644 (file)
@@ -121,6 +121,20 @@ pub(crate) fn from_def(
                     &*node,
                 ));
             }
+            hir::ModuleDef::Const(s) => {
+                let (file_id, node) = s.source(db);
+                return Some(NavigationTarget::from_named(
+                    file_id.original_file(db),
+                    &*node,
+                ));
+            }
+            hir::ModuleDef::Static(s) => {
+                let (file_id, node) = s.source(db);
+                return Some(NavigationTarget::from_named(
+                    file_id.original_file(db),
+                    &*node,
+                ));
+            }
             hir::ModuleDef::Enum(e) => {
                 let (file_id, node) = e.source(db);
                 return Some(NavigationTarget::from_named(
@@ -146,14 +160,6 @@ pub(crate) fn from_def(
                 let (file_id, node) = f.source(db);
                 NavigationTarget::from_named(file_id.original_file(db), &*node)
             }
-            Def::Static(f) => {
-                let (file_id, node) = f.source(db);
-                NavigationTarget::from_named(file_id.original_file(db), &*node)
-            }
-            Def::Const(f) => {
-                let (file_id, node) = f.source(db);
-                NavigationTarget::from_named(file_id.original_file(db), &*node)
-            }
             Def::Item => return None,
         };
         Some(res)