diff options
Diffstat (limited to 'crates/ra_hir/src/adt.rs')
-rw-r--r-- | crates/ra_hir/src/adt.rs | 54 |
1 files changed, 12 insertions, 42 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index b2631d6a6..ad3f9c405 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs | |||
@@ -8,42 +8,18 @@ use ra_syntax::{ | |||
8 | }; | 8 | }; |
9 | 9 | ||
10 | use crate::{ | 10 | use crate::{ |
11 | Name, AsName, Struct, Enum, EnumVariant, Module, HirFileId, | 11 | Name, AsName, Struct, Enum, EnumVariant, |
12 | HirDatabase, | 12 | HirDatabase, |
13 | type_ref::TypeRef, | 13 | type_ref::TypeRef, |
14 | ids::ItemLoc, | 14 | ids::LocationCtx, |
15 | }; | 15 | }; |
16 | 16 | ||
17 | impl Struct { | 17 | impl Struct { |
18 | pub(crate) fn from_ast( | ||
19 | db: &impl HirDatabase, | ||
20 | module: Module, | ||
21 | file_id: HirFileId, | ||
22 | ast: &ast::StructDef, | ||
23 | ) -> Struct { | ||
24 | let loc = ItemLoc::from_ast(db, module, file_id, ast); | ||
25 | let id = db.as_ref().structs.loc2id(&loc); | ||
26 | Struct { id } | ||
27 | } | ||
28 | |||
29 | pub(crate) fn variant_data(&self, db: &impl HirDatabase) -> Arc<VariantData> { | 18 | pub(crate) fn variant_data(&self, db: &impl HirDatabase) -> Arc<VariantData> { |
30 | db.struct_data((*self).into()).variant_data.clone() | 19 | db.struct_data((*self).into()).variant_data.clone() |
31 | } | 20 | } |
32 | } | 21 | } |
33 | 22 | ||
34 | impl Enum { | ||
35 | pub(crate) fn from_ast( | ||
36 | db: &impl HirDatabase, | ||
37 | module: Module, | ||
38 | file_id: HirFileId, | ||
39 | ast: &ast::EnumDef, | ||
40 | ) -> Enum { | ||
41 | let loc = ItemLoc::from_ast(db, module, file_id, ast); | ||
42 | let id = db.as_ref().enums.loc2id(&loc); | ||
43 | Enum { id } | ||
44 | } | ||
45 | } | ||
46 | |||
47 | #[derive(Debug, Clone, PartialEq, Eq)] | 23 | #[derive(Debug, Clone, PartialEq, Eq)] |
48 | pub struct StructData { | 24 | pub struct StructData { |
49 | pub(crate) name: Option<Name>, | 25 | pub(crate) name: Option<Name>, |
@@ -64,19 +40,6 @@ impl StructData { | |||
64 | } | 40 | } |
65 | } | 41 | } |
66 | 42 | ||
67 | impl EnumVariant { | ||
68 | pub(crate) fn from_ast( | ||
69 | db: &impl HirDatabase, | ||
70 | module: Module, | ||
71 | file_id: HirFileId, | ||
72 | ast: &ast::EnumVariant, | ||
73 | ) -> EnumVariant { | ||
74 | let loc = ItemLoc::from_ast(db, module, file_id, ast); | ||
75 | let id = db.as_ref().enum_variants.loc2id(&loc); | ||
76 | EnumVariant { id } | ||
77 | } | ||
78 | } | ||
79 | |||
80 | #[derive(Debug, Clone, PartialEq, Eq)] | 43 | #[derive(Debug, Clone, PartialEq, Eq)] |
81 | pub struct EnumData { | 44 | pub struct EnumData { |
82 | pub(crate) name: Option<Name>, | 45 | pub(crate) name: Option<Name>, |
@@ -92,11 +55,15 @@ impl EnumData { | |||
92 | pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> { | 55 | pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> { |
93 | let (file_id, enum_def) = e.source(db); | 56 | let (file_id, enum_def) = e.source(db); |
94 | let module = e.module(db); | 57 | let module = e.module(db); |
58 | let ctx = LocationCtx::new(db, module, file_id); | ||
95 | let variants = if let Some(vl) = enum_def.variant_list() { | 59 | let variants = if let Some(vl) = enum_def.variant_list() { |
96 | vl.variants() | 60 | vl.variants() |
97 | .filter_map(|variant_def| { | 61 | .filter_map(|variant_def| { |
98 | let name = variant_def.name().map(|n| n.as_name()); | 62 | let name = variant_def.name()?.as_name(); |
99 | name.map(|n| (n, EnumVariant::from_ast(db, module, file_id, variant_def))) | 63 | let var = EnumVariant { |
64 | id: ctx.to_def(variant_def), | ||
65 | }; | ||
66 | Some((name, var)) | ||
100 | }) | 67 | }) |
101 | .collect() | 68 | .collect() |
102 | } else { | 69 | } else { |
@@ -131,7 +98,10 @@ impl EnumVariantData { | |||
131 | ) -> Arc<EnumVariantData> { | 98 | ) -> Arc<EnumVariantData> { |
132 | let (file_id, variant_def) = var.source(db); | 99 | let (file_id, variant_def) = var.source(db); |
133 | let enum_def = variant_def.parent_enum(); | 100 | let enum_def = variant_def.parent_enum(); |
134 | let e = Enum::from_ast(db, var.module(db), file_id, enum_def); | 101 | let ctx = LocationCtx::new(db, var.module(db), file_id); |
102 | let e = Enum { | ||
103 | id: ctx.to_def(enum_def), | ||
104 | }; | ||
135 | Arc::new(EnumVariantData::new(&*variant_def, e)) | 105 | Arc::new(EnumVariantData::new(&*variant_def, e)) |
136 | } | 106 | } |
137 | } | 107 | } |