aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/adt.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/adt.rs')
-rw-r--r--crates/ra_hir/src/adt.rs54
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
4use std::sync::Arc; 4use std::sync::Arc;
5 5
6use ra_syntax::ast::{self, NameOwner, StructFlavor}; 6use ra_syntax::{
7 TreeArc,
8 ast::{self, NameOwner, StructFlavor}
9};
7 10
8use crate::{ 11use 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
61fn 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
68impl 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)]
59pub struct EnumData { 80pub 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}