aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/adt.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-01-25 11:21:14 +0000
committerAleksey Kladov <[email protected]>2019-01-25 11:21:14 +0000
commit87ac5f5b36602922bb45b3a5343010fa305089eb (patch)
tree5a692f559ba36aa5620bf1e7fe2ac0827ad6c25a /crates/ra_hir/src/adt.rs
parent47e553667851bfcdda0317a27c8304dbc9797f32 (diff)
use positional ids for fields
Diffstat (limited to 'crates/ra_hir/src/adt.rs')
-rw-r--r--crates/ra_hir/src/adt.rs95
1 files changed, 41 insertions, 54 deletions
diff --git a/crates/ra_hir/src/adt.rs b/crates/ra_hir/src/adt.rs
index 2579ece19..df609b8d7 100644
--- a/crates/ra_hir/src/adt.rs
+++ b/crates/ra_hir/src/adt.rs
@@ -79,12 +79,13 @@ impl EnumVariant {
79 .to_owned(); 79 .to_owned();
80 (file_id, var) 80 (file_id, var)
81 } 81 }
82 pub(crate) fn variant_data(&self, db: &impl HirDatabase) -> Arc<VariantData> {
83 db.enum_data(self.parent).variants[self.id]
84 .variant_data
85 .clone()
86 }
82} 87}
83 88
84#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
85pub(crate) struct EnumVariantId(RawId);
86impl_arena_id!(EnumVariantId);
87
88#[derive(Debug, Clone, PartialEq, Eq)] 89#[derive(Debug, Clone, PartialEq, Eq)]
89pub struct EnumData { 90pub struct EnumData {
90 pub(crate) name: Option<Name>, 91 pub(crate) name: Option<Name>,
@@ -94,28 +95,31 @@ pub struct EnumData {
94impl EnumData { 95impl EnumData {
95 pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> { 96 pub(crate) fn enum_data_query(db: &impl HirDatabase, e: Enum) -> Arc<EnumData> {
96 let (_file_id, enum_def) = e.source(db); 97 let (_file_id, enum_def) = e.source(db);
97 let mut res = EnumData { 98 let name = enum_def.name().map(|n| n.as_name());
98 name: enum_def.name().map(|n| n.as_name()), 99 let variants = variants(&*enum_def)
99 variants: Arena::default(), 100 .map(|var| EnumVariantData {
100 };
101 for var in variants(&*enum_def) {
102 let data = EnumVariantData {
103 name: var.name().map(|it| it.as_name()), 101 name: var.name().map(|it| it.as_name()),
104 variant_data: Arc::new(VariantData::new(var.flavor())), 102 variant_data: Arc::new(VariantData::new(var.flavor())),
105 }; 103 })
106 res.variants.alloc(data); 104 .collect();
107 } 105 Arc::new(EnumData { name, variants })
108
109 Arc::new(res)
110 } 106 }
111} 107}
112 108
109#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
110pub(crate) struct EnumVariantId(RawId);
111impl_arena_id!(EnumVariantId);
112
113#[derive(Debug, Clone, PartialEq, Eq)] 113#[derive(Debug, Clone, PartialEq, Eq)]
114pub struct EnumVariantData { 114pub struct EnumVariantData {
115 pub(crate) name: Option<Name>, 115 pub(crate) name: Option<Name>,
116 pub(crate) variant_data: Arc<VariantData>, 116 pub(crate) variant_data: Arc<VariantData>,
117} 117}
118 118
119#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
120pub(crate) struct StructFieldId(RawId);
121impl_arena_id!(StructFieldId);
122
119/// A single field of an enum variant or struct 123/// A single field of an enum variant or struct
120#[derive(Debug, Clone, PartialEq, Eq)] 124#[derive(Debug, Clone, PartialEq, Eq)]
121pub struct StructFieldData { 125pub struct StructFieldData {
@@ -125,45 +129,27 @@ pub struct StructFieldData {
125 129
126/// Fields of an enum variant or struct 130/// Fields of an enum variant or struct
127#[derive(Debug, Clone, PartialEq, Eq)] 131#[derive(Debug, Clone, PartialEq, Eq)]
128pub enum VariantData { 132pub struct VariantData(VariantDataInner);
129 Struct(Vec<StructFieldData>), 133
130 Tuple(Vec<StructFieldData>), 134#[derive(Debug, Clone, PartialEq, Eq)]
135enum VariantDataInner {
136 Struct(Arena<StructFieldId, StructFieldData>),
137 Tuple(Arena<StructFieldId, StructFieldData>),
131 Unit, 138 Unit,
132} 139}
133 140
134impl VariantData { 141impl VariantData {
135 pub fn fields(&self) -> &[StructFieldData] { 142 pub(crate) fn fields(&self) -> Option<&Arena<StructFieldId, StructFieldData>> {
136 match self { 143 match &self.0 {
137 VariantData::Struct(fields) | VariantData::Tuple(fields) => fields, 144 VariantDataInner::Struct(fields) | VariantDataInner::Tuple(fields) => Some(fields),
138 _ => &[], 145 _ => None,
139 }
140 }
141
142 pub fn is_struct(&self) -> bool {
143 match self {
144 VariantData::Struct(..) => true,
145 _ => false,
146 }
147 }
148
149 pub fn is_tuple(&self) -> bool {
150 match self {
151 VariantData::Tuple(..) => true,
152 _ => false,
153 }
154 }
155
156 pub fn is_unit(&self) -> bool {
157 match self {
158 VariantData::Unit => true,
159 _ => false,
160 } 146 }
161 } 147 }
162} 148}
163 149
164impl VariantData { 150impl VariantData {
165 fn new(flavor: StructFlavor) -> Self { 151 fn new(flavor: StructFlavor) -> Self {
166 match flavor { 152 let inner = match flavor {
167 StructFlavor::Tuple(fl) => { 153 StructFlavor::Tuple(fl) => {
168 let fields = fl 154 let fields = fl
169 .fields() 155 .fields()
@@ -173,7 +159,7 @@ impl VariantData {
173 type_ref: TypeRef::from_ast_opt(fd.type_ref()), 159 type_ref: TypeRef::from_ast_opt(fd.type_ref()),
174 }) 160 })
175 .collect(); 161 .collect();
176 VariantData::Tuple(fields) 162 VariantDataInner::Tuple(fields)
177 } 163 }
178 StructFlavor::Named(fl) => { 164 StructFlavor::Named(fl) => {
179 let fields = fl 165 let fields = fl
@@ -183,16 +169,17 @@ impl VariantData {
183 type_ref: TypeRef::from_ast_opt(fd.type_ref()), 169 type_ref: TypeRef::from_ast_opt(fd.type_ref()),
184 }) 170 })
185 .collect(); 171 .collect();
186 VariantData::Struct(fields) 172 VariantDataInner::Struct(fields)
187 } 173 }
188 StructFlavor::Unit => VariantData::Unit, 174 StructFlavor::Unit => VariantDataInner::Unit,
189 } 175 };
176 VariantData(inner)
190 } 177 }
191 178
192 pub(crate) fn get_field_type_ref(&self, field_name: &Name) -> Option<&TypeRef> { 179 // pub(crate) fn get_field_type_ref(&self, field_name: &Name) -> Option<&TypeRef> {
193 self.fields() 180 // self.fields()
194 .iter() 181 // .iter()
195 .find(|f| f.name == *field_name) 182 // .find(|f| f.name == *field_name)
196 .map(|f| &f.type_ref) 183 // .map(|f| &f.type_ref)
197 } 184 // }
198} 185}