From 87288d802c3cad7ec50c508276b89a8c454f336c Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 25 Jan 2019 12:41:23 +0300 Subject: pack enum variants into arena --- crates/ra_hir/src/code_model_api.rs | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) (limited to 'crates/ra_hir/src/code_model_api.rs') diff --git a/crates/ra_hir/src/code_model_api.rs b/crates/ra_hir/src/code_model_api.rs index 4fc47aba5..249a4aba9 100644 --- a/crates/ra_hir/src/code_model_api.rs +++ b/crates/ra_hir/src/code_model_api.rs @@ -11,7 +11,7 @@ use crate::{ db::HirDatabase, expr::BodySyntaxMapping, ty::{InferenceResult, VariantDef}, - adt::VariantData, + adt::{VariantData, EnumVariantId}, generics::GenericParams, docs::{Documentation, Docs, docs_from_ast}, module_tree::ModuleId, @@ -252,8 +252,20 @@ impl Enum { db.enum_data(*self).name.clone() } - pub fn variants(&self, db: &impl HirDatabase) -> Vec<(Name, EnumVariant)> { - db.enum_data(*self).variants.clone() + pub fn variants(&self, db: &impl HirDatabase) -> Vec { + db.enum_data(*self) + .variants + .iter() + .map(|(id, _)| EnumVariant { parent: *self, id }) + .collect() + } + + pub fn variant(&self, db: &impl HirDatabase, name: &Name) -> Option { + db.enum_data(*self) + .variants + .iter() + .find(|(_id, data)| data.name.as_ref() == Some(name)) + .map(|(id, _)| EnumVariant { parent: *self, id }) } pub fn generic_params(&self, db: &impl HirDatabase) -> Arc { @@ -270,7 +282,7 @@ impl Docs for Enum { #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct EnumVariant { pub(crate) parent: Enum, - pub(crate) idx: u32, + pub(crate) id: EnumVariantId, } impl EnumVariant { @@ -285,11 +297,13 @@ impl EnumVariant { } pub fn name(&self, db: &impl HirDatabase) -> Option { - db.enum_variant_data(*self).name.clone() + db.enum_data(self.parent).variants[self.id].name.clone() } pub fn variant_data(&self, db: &impl HirDatabase) -> Arc { - db.enum_variant_data(*self).variant_data.clone() + db.enum_data(self.parent).variants[self.id] + .variant_data + .clone() } pub fn fields(&self, db: &impl HirDatabase) -> Vec { -- cgit v1.2.3