aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/adt.rs32
-rw-r--r--crates/ra_hir/src/db.rs4
-rw-r--r--crates/ra_hir/src/query_definitions.rs20
3 files changed, 31 insertions, 25 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index d56570754..8639bbd5c 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -1,9 +1,10 @@
1use std::sync::Arc; 1use std::sync::Arc;
2 2
3use ra_syntax::ast::{self, NameOwner, StructFlavor}; 3use ra_db::Cancelable;
4use ra_syntax::ast::{self, NameOwner, StructFlavor, AstNode};
4 5
5use crate::{ 6use crate::{
6 DefId, Name, AsName, Struct, Enum, VariantData, StructField, 7 DefId, Name, AsName, Struct, Enum, VariantData, StructField, HirDatabase, DefKind,
7 type_ref::TypeRef, 8 type_ref::TypeRef,
8}; 9};
9 10
@@ -20,12 +21,24 @@ pub struct StructData {
20} 21}
21 22
22impl StructData { 23impl StructData {
23 pub(crate) fn new(struct_def: &ast::StructDef) -> StructData { 24 fn new(struct_def: &ast::StructDef) -> StructData {
24 let name = struct_def.name().map(|n| n.as_name()); 25 let name = struct_def.name().map(|n| n.as_name());
25 let variant_data = VariantData::new(struct_def.flavor()); 26 let variant_data = VariantData::new(struct_def.flavor());
26 let variant_data = Arc::new(variant_data); 27 let variant_data = Arc::new(variant_data);
27 StructData { name, variant_data } 28 StructData { name, variant_data }
28 } 29 }
30
31 pub(crate) fn struct_data_query(
32 db: &impl HirDatabase,
33 def_id: DefId,
34 ) -> Cancelable<Arc<StructData>> {
35 let def_loc = def_id.loc(db);
36 assert!(def_loc.kind == DefKind::Struct);
37 let syntax = db.file_item(def_loc.source_item_id);
38 let struct_def =
39 ast::StructDef::cast(&syntax).expect("struct def should point to StructDef node");
40 Ok(Arc::new(StructData::new(struct_def)))
41 }
29} 42}
30 43
31impl Enum { 44impl Enum {
@@ -41,7 +54,7 @@ pub struct EnumData {
41} 54}
42 55
43impl EnumData { 56impl EnumData {
44 pub(crate) fn new(enum_def: &ast::EnumDef) -> Self { 57 fn new(enum_def: &ast::EnumDef) -> Self {
45 let name = enum_def.name().map(|n| n.as_name()); 58 let name = enum_def.name().map(|n| n.as_name());
46 let variants = if let Some(evl) = enum_def.variant_list() { 59 let variants = if let Some(evl) = enum_def.variant_list() {
47 evl.variants() 60 evl.variants()
@@ -57,6 +70,17 @@ impl EnumData {
57 }; 70 };
58 EnumData { name, variants } 71 EnumData { name, variants }
59 } 72 }
73
74 pub(crate) fn enum_data_query(
75 db: &impl HirDatabase,
76 def_id: DefId,
77 ) -> Cancelable<Arc<EnumData>> {
78 let def_loc = def_id.loc(db);
79 assert!(def_loc.kind == DefKind::Enum);
80 let syntax = db.file_item(def_loc.source_item_id);
81 let enum_def = ast::EnumDef::cast(&syntax).expect("enum def should point to EnumDef node");
82 Ok(Arc::new(EnumData::new(enum_def)))
83 }
60} 84}
61 85
62impl VariantData { 86impl VariantData {
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 03e65387d..bb4fb3d66 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -38,12 +38,12 @@ pub trait HirDatabase: SyntaxDatabase
38 38
39 fn struct_data(def_id: DefId) -> Cancelable<Arc<StructData>> { 39 fn struct_data(def_id: DefId) -> Cancelable<Arc<StructData>> {
40 type StructDataQuery; 40 type StructDataQuery;
41 use fn query_definitions::struct_data; 41 use fn crate::adt::StructData::struct_data_query;
42 } 42 }
43 43
44 fn enum_data(def_id: DefId) -> Cancelable<Arc<EnumData>> { 44 fn enum_data(def_id: DefId) -> Cancelable<Arc<EnumData>> {
45 type EnumDataQuery; 45 type EnumDataQuery;
46 use fn query_definitions::enum_data; 46 use fn crate::adt::EnumData::enum_data_query;
47 } 47 }
48 48
49 fn infer(def_id: DefId) -> Cancelable<Arc<InferenceResult>> { 49 fn infer(def_id: DefId) -> Cancelable<Arc<InferenceResult>> {
diff --git a/crates/ra_hir/src/query_definitions.rs b/crates/ra_hir/src/query_definitions.rs
index 380ea5410..ab4e6e629 100644
--- a/crates/ra_hir/src/query_definitions.rs
+++ b/crates/ra_hir/src/query_definitions.rs
@@ -11,13 +11,12 @@ use ra_syntax::{
11use ra_db::{SourceRootId, Cancelable,}; 11use ra_db::{SourceRootId, Cancelable,};
12 12
13use crate::{ 13use crate::{
14 SourceFileItems, SourceItemId, DefKind, DefId, HirFileId, ModuleSource, 14 SourceFileItems, SourceItemId, DefId, HirFileId, ModuleSource,
15 MacroCallLoc, 15 MacroCallLoc,
16 db::HirDatabase, 16 db::HirDatabase,
17 function::FnScopes, 17 function::FnScopes,
18 module_tree::ModuleId, 18 module_tree::ModuleId,
19 nameres::{InputModuleItems, ItemMap, Resolver}, 19 nameres::{InputModuleItems, ItemMap, Resolver},
20 adt::{StructData, EnumData},
21}; 20};
22 21
23pub(super) fn fn_scopes(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<FnScopes>> { 22pub(super) fn fn_scopes(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<FnScopes>> {
@@ -26,23 +25,6 @@ pub(super) fn fn_scopes(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<
26 Ok(Arc::new(res)) 25 Ok(Arc::new(res))
27} 26}
28 27
29pub(super) fn struct_data(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<StructData>> {
30 let def_loc = def_id.loc(db);
31 assert!(def_loc.kind == DefKind::Struct);
32 let syntax = db.file_item(def_loc.source_item_id);
33 let struct_def =
34 ast::StructDef::cast(&syntax).expect("struct def should point to StructDef node");
35 Ok(Arc::new(StructData::new(struct_def)))
36}
37
38pub(super) fn enum_data(db: &impl HirDatabase, def_id: DefId) -> Cancelable<Arc<EnumData>> {
39 let def_loc = def_id.loc(db);
40 assert!(def_loc.kind == DefKind::Enum);
41 let syntax = db.file_item(def_loc.source_item_id);
42 let enum_def = ast::EnumDef::cast(&syntax).expect("enum def should point to EnumDef node");
43 Ok(Arc::new(EnumData::new(enum_def)))
44}
45
46pub(super) fn file_items(db: &impl HirDatabase, file_id: HirFileId) -> Arc<SourceFileItems> { 28pub(super) fn file_items(db: &impl HirDatabase, file_id: HirFileId) -> Arc<SourceFileItems> {
47 let source_file = db.hir_source_file(file_id); 29 let source_file = db.hir_source_file(file_id);
48 let res = SourceFileItems::new(file_id, &source_file); 30 let res = SourceFileItems::new(file_id, &source_file);