diff options
author | Aleksey Kladov <[email protected]> | 2019-01-25 08:35:38 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-01-25 08:35:38 +0000 |
commit | 2ee2fba752c0f03ab8d1b7009bc56cc785738413 (patch) | |
tree | 656ed2e90603c06af1df84c6a9bc3a7c5046eff2 /crates/ra_hir/src/adt.rs | |
parent | 946aea3eb34d1b7f09900e017bb94708e6299d0a (diff) |
switch to positional enum variants
Diffstat (limited to 'crates/ra_hir/src/adt.rs')
-rw-r--r-- | crates/ra_hir/src/adt.rs | 54 |
1 files changed, 36 insertions, 18 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs index 6b13b464d..e0f515642 100644 --- a/crates/ra_hir/src/adt.rs +++ b/crates/ra_hir/src/adt.rs | |||
@@ -3,11 +3,14 @@ | |||
3 | 3 | ||
4 | use std::sync::Arc; | 4 | use std::sync::Arc; |
5 | 5 | ||
6 | use ra_syntax::ast::{self, NameOwner, StructFlavor}; | 6 | use ra_syntax::{ |
7 | TreeArc, | ||
8 | ast::{self, NameOwner, StructFlavor} | ||
9 | }; | ||
7 | 10 | ||
8 | use crate::{ | 11 | use crate::{ |
9 | Name, AsName, Struct, Enum, EnumVariant, Crate, | 12 | Name, AsName, Struct, Enum, EnumVariant, Crate, |
10 | HirDatabase, | 13 | HirDatabase, HirFileId, |
11 | type_ref::TypeRef, | 14 | type_ref::TypeRef, |
12 | ids::LocationCtx, | 15 | ids::LocationCtx, |
13 | }; | 16 | }; |
@@ -55,6 +58,24 @@ impl StructData { | |||
55 | } | 58 | } |
56 | } | 59 | } |
57 | 60 | ||
61 | fn variants(enum_def: &ast::EnumDef) -> impl Iterator<Item = &ast::EnumVariant> { | ||
62 | enum_def | ||
63 | .variant_list() | ||
64 | .into_iter() | ||
65 | .flat_map(|it| it.variants()) | ||
66 | } | ||
67 | |||
68 | impl EnumVariant { | ||
69 | pub fn source_impl(&self, db: &impl HirDatabase) -> (HirFileId, TreeArc<ast::EnumVariant>) { | ||
70 | let (file_id, enum_def) = self.parent.source(db); | ||
71 | let var = variants(&*enum_def) | ||
72 | .nth(self.idx as usize) | ||
73 | .unwrap() | ||
74 | .to_owned(); | ||
75 | (file_id, var) | ||
76 | } | ||
77 | } | ||
78 | |||
58 | #[derive(Debug, Clone, PartialEq, Eq)] | 79 | #[derive(Debug, Clone, PartialEq, Eq)] |
59 | pub struct EnumData { | 80 | pub struct EnumData { |
60 | pub(crate) name: Option<Name>, | 81 | pub(crate) name: Option<Name>, |
@@ -68,22 +89,19 @@ impl EnumData { | |||
68 | } | 89 | } |
69 | 90 | ||
70 | pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> { | 91 | pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> { |
71 | let (file_id, enum_def) = e.source(db); | 92 | let (_file_id, enum_def) = e.source(db); |
72 | let module = e.module(db); | 93 | let variants = variants(&*enum_def) |
73 | let ctx = LocationCtx::new(db, module, file_id); | 94 | .enumerate() |
74 | let variants = if let Some(vl) = enum_def.variant_list() { | 95 | .filter_map(|(idx, variant_def)| { |
75 | vl.variants() | 96 | let name = variant_def.name()?.as_name(); |
76 | .filter_map(|variant_def| { | 97 | let var = EnumVariant { |
77 | let name = variant_def.name()?.as_name(); | 98 | parent: e, |
78 | let var = EnumVariant { | 99 | idx: idx as u32, |
79 | id: ctx.to_def(variant_def), | 100 | }; |
80 | }; | 101 | Some((name, var)) |
81 | Some((name, var)) | 102 | }) |
82 | }) | 103 | .collect(); |
83 | .collect() | 104 | |
84 | } else { | ||
85 | Vec::new() | ||
86 | }; | ||
87 | Arc::new(EnumData::new(&*enum_def, variants)) | 105 | Arc::new(EnumData::new(&*enum_def, variants)) |
88 | } | 106 | } |
89 | } | 107 | } |