mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-29 05:15:04 +00:00
use positional ids for fields
This commit is contained in:
parent
47e5536678
commit
87ac5f5b36
6 changed files with 144 additions and 131 deletions
|
@ -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<Ty> {
|
||||
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<StructField> {
|
||||
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<GenericParams> {
|
||||
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<VariantData> {
|
||||
db.enum_data(self.parent).variants[self.id]
|
||||
.variant_data
|
||||
.clone()
|
||||
}
|
||||
|
||||
pub fn fields(&self, db: &impl HirDatabase) -> Vec<StructField> {
|
||||
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<StructField> {
|
||||
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 {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue