From 87ac5f5b36602922bb45b3a5343010fa305089eb Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Fri, 25 Jan 2019 14:21:14 +0300 Subject: use positional ids for fields --- crates/ra_hir/src/code_model_api.rs | 65 ++++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 19 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 249a4aba9..118562984 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, EnumVariantId}, + adt::{EnumVariantId, StructFieldId}, generics::GenericParams, docs::{Documentation, Docs, docs_from_ast}, module_tree::ModuleId, @@ -177,19 +177,25 @@ impl Module { } } -#[derive(Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] pub struct StructField { parent: VariantDef, - name: Name, + pub(crate) id: StructFieldId, } impl StructField { - pub fn name(&self) -> &Name { - &self.name + pub fn name(&self, db: &impl HirDatabase) -> Name { + self.parent.variant_data(db).fields().unwrap()[self.id] + .name + .clone() } - pub fn ty(&self, db: &impl HirDatabase) -> Option { - db.type_for_field(self.parent, self.name.clone()) + pub fn ty(&self, db: &impl HirDatabase) -> Ty { + db.type_for_field(*self) + } + + pub fn parent_def(&self, _db: &impl HirDatabase) -> VariantDef { + self.parent } } @@ -215,14 +221,28 @@ impl Struct { db.struct_data(*self) .variant_data .fields() - .iter() - .map(|it| StructField { + .into_iter() + .flat_map(|it| it.iter()) + .map(|(id, _)| StructField { parent: (*self).into(), - name: it.name.clone(), + id, }) .collect() } + pub fn field(&self, db: &impl HirDatabase, name: &Name) -> Option { + db.struct_data(*self) + .variant_data + .fields() + .into_iter() + .flat_map(|it| it.iter()) + .find(|(_id, data)| data.name == *name) + .map(|(id, _)| StructField { + parent: (*self).into(), + id, + }) + } + pub fn generic_params(&self, db: &impl HirDatabase) -> Arc { db.generic_params((*self).into()) } @@ -300,22 +320,29 @@ impl EnumVariant { db.enum_data(self.parent).variants[self.id].name.clone() } - pub fn variant_data(&self, db: &impl HirDatabase) -> Arc { - db.enum_data(self.parent).variants[self.id] - .variant_data - .clone() - } - pub fn fields(&self, db: &impl HirDatabase) -> Vec { self.variant_data(db) .fields() - .iter() - .map(|it| StructField { + .into_iter() + .flat_map(|it| it.iter()) + .map(|(id, _)| StructField { parent: (*self).into(), - name: it.name.clone(), + id, }) .collect() } + + pub fn field(&self, db: &impl HirDatabase, name: &Name) -> Option { + self.variant_data(db) + .fields() + .into_iter() + .flat_map(|it| it.iter()) + .find(|(_id, data)| data.name == *name) + .map(|(id, _)| StructField { + parent: (*self).into(), + id, + }) + } } impl Docs for EnumVariant { -- cgit v1.2.3