From 9ba772657950cb8353f37bc2576b78c4f0c8996f Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 25 Jun 2020 13:50:27 +0200 Subject: Allow iterating fields in the ItemTree --- crates/ra_hir_def/src/item_tree.rs | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir_def/src/item_tree.rs') diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs index d7bc64e6c..f99e05432 100644 --- a/crates/ra_hir_def/src/item_tree.rs +++ b/crates/ra_hir_def/src/item_tree.rs @@ -681,10 +681,28 @@ pub struct Variant { pub fields: Fields, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct FieldIds { + range: Range, +} + +impl FieldIds { + fn new(range: Range>) -> Self { + Self { range: range.start.into_raw().into()..range.end.into_raw().into() } + } +} + +impl Iterator for FieldIds { + type Item = Idx; + fn next(&mut self) -> Option { + self.range.next().map(|raw| Idx::from_raw(raw.into())) + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub enum Fields { - Record(Range>), - Tuple(Range>), + Record(FieldIds), + Tuple(FieldIds), Unit, } -- cgit v1.2.3 From d84b3ff6a1c42df0e349dc8ec3fc08e8c1251777 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 25 Jun 2020 14:39:27 +0200 Subject: Collect field/variant attrs in ItemTree --- crates/ra_hir_def/src/item_tree.rs | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) (limited to 'crates/ra_hir_def/src/item_tree.rs') diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs index f99e05432..fd874750e 100644 --- a/crates/ra_hir_def/src/item_tree.rs +++ b/crates/ra_hir_def/src/item_tree.rs @@ -178,8 +178,8 @@ impl ItemTree { self.attrs.get(&AttrOwner::TopLevel).unwrap_or(&Attrs::EMPTY) } - pub fn attrs(&self, of: ModItem) -> &Attrs { - self.attrs.get(&AttrOwner::ModItem(of)).unwrap_or(&Attrs::EMPTY) + pub fn attrs(&self, of: AttrOwner) -> &Attrs { + self.attrs.get(&of).unwrap_or(&Attrs::EMPTY) } /// Returns the lowered inner items that `ast` corresponds to. @@ -282,15 +282,32 @@ struct ItemTreeData { } #[derive(Debug, Eq, PartialEq, Hash)] -enum AttrOwner { +pub enum AttrOwner { /// Attributes on an item. ModItem(ModItem), /// Inner attributes of the source file. TopLevel, + + Variant(Idx), + Field(Idx), // FIXME: Store variant and field attrs, and stop reparsing them in `attrs_query`. } -/// Trait implemented by all nodes in the item tree. +macro_rules! from_attrs { + ( $( $var:ident($t:ty) ),+ ) => { + $( + impl From<$t> for AttrOwner { + fn from(t: $t) -> AttrOwner { + AttrOwner::$var(t) + } + } + )+ + }; +} + +from_attrs!(ModItem(ModItem), Variant(Idx), Field(Idx)); + +/// Trait implemented by all item nodes in the item tree. pub trait ItemTreeNode: Clone { type Source: AstNode + Into; -- cgit v1.2.3 From b06214d16408e0b699f9d6051ba244e5fe766578 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 25 Jun 2020 16:42:59 +0200 Subject: Generalize FieldIds -> IdRange --- crates/ra_hir_def/src/item_tree.rs | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'crates/ra_hir_def/src/item_tree.rs') diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs index fd874750e..8c93e3adf 100644 --- a/crates/ra_hir_def/src/item_tree.rs +++ b/crates/ra_hir_def/src/item_tree.rs @@ -699,18 +699,19 @@ pub struct Variant { } #[derive(Debug, Clone, PartialEq, Eq)] -pub struct FieldIds { +pub struct IdRange { range: Range, + _p: PhantomData, } -impl FieldIds { - fn new(range: Range>) -> Self { - Self { range: range.start.into_raw().into()..range.end.into_raw().into() } +impl IdRange { + fn new(range: Range>) -> Self { + Self { range: range.start.into_raw().into()..range.end.into_raw().into(), _p: PhantomData } } } -impl Iterator for FieldIds { - type Item = Idx; +impl Iterator for IdRange { + type Item = Idx; fn next(&mut self) -> Option { self.range.next().map(|raw| Idx::from_raw(raw.into())) } @@ -718,8 +719,8 @@ impl Iterator for FieldIds { #[derive(Debug, Clone, PartialEq, Eq)] pub enum Fields { - Record(FieldIds), - Tuple(FieldIds), + Record(IdRange), + Tuple(IdRange), Unit, } -- cgit v1.2.3 From 563d58559400c4e5b67377bd10f40fee7695ea46 Mon Sep 17 00:00:00 2001 From: Jonas Schievink Date: Thu, 25 Jun 2020 16:47:21 +0200 Subject: Use IdRange for variants --- crates/ra_hir_def/src/item_tree.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir_def/src/item_tree.rs') diff --git a/crates/ra_hir_def/src/item_tree.rs b/crates/ra_hir_def/src/item_tree.rs index 8c93e3adf..3e603bd55 100644 --- a/crates/ra_hir_def/src/item_tree.rs +++ b/crates/ra_hir_def/src/item_tree.rs @@ -5,6 +5,7 @@ mod lower; mod tests; use std::{ + any::type_name, fmt::{self, Debug}, hash::{Hash, Hasher}, marker::PhantomData, @@ -540,7 +541,7 @@ pub struct Enum { pub name: Name, pub visibility: RawVisibilityId, pub generic_params: GenericParamsId, - pub variants: Range>, + pub variants: IdRange, pub ast_id: FileAstId, } @@ -698,7 +699,6 @@ pub struct Variant { pub fields: Fields, } -#[derive(Debug, Clone, PartialEq, Eq)] pub struct IdRange { range: Range, _p: PhantomData, @@ -717,6 +717,26 @@ impl Iterator for IdRange { } } +impl fmt::Debug for IdRange { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple(&format!("IdRange::<{}>", type_name::())).field(&self.range).finish() + } +} + +impl Clone for IdRange { + fn clone(&self) -> Self { + Self { range: self.range.clone(), _p: PhantomData } + } +} + +impl PartialEq for IdRange { + fn eq(&self, other: &Self) -> bool { + self.range == other.range + } +} + +impl Eq for IdRange {} + #[derive(Debug, Clone, PartialEq, Eq)] pub enum Fields { Record(IdRange), -- cgit v1.2.3