Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/per_ns.rs')
| -rw-r--r-- | crates/hir-def/src/per_ns.rs | 77 |
1 files changed, 47 insertions, 30 deletions
diff --git a/crates/hir-def/src/per_ns.rs b/crates/hir-def/src/per_ns.rs index 3f3b98c6b5..899dd4afff 100644 --- a/crates/hir-def/src/per_ns.rs +++ b/crates/hir-def/src/per_ns.rs @@ -28,11 +28,22 @@ bitflags! { } } +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub struct Item<Def, Import = ImportId> { + pub def: Def, + pub vis: Visibility, + pub import: Option<Import>, +} + +pub type TypesItem = Item<ModuleDefId, ImportOrExternCrate>; +pub type ValuesItem = Item<ModuleDefId>; +pub type MacrosItem = Item<MacroId>; + #[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)] pub struct PerNs { - pub types: Option<(ModuleDefId, Visibility, Option<ImportOrExternCrate>)>, - pub values: Option<(ModuleDefId, Visibility, Option<ImportId>)>, - pub macros: Option<(MacroId, Visibility, Option<ImportId>)>, + pub types: Option<TypesItem>, + pub values: Option<ValuesItem>, + pub macros: Option<MacrosItem>, } impl PerNs { @@ -48,29 +59,33 @@ impl PerNs { PerNs { types: None, values: None, macros: None } } - pub fn values(t: ModuleDefId, v: Visibility, i: Option<ImportId>) -> PerNs { - PerNs { types: None, values: Some((t, v, i)), macros: None } + pub fn values(def: ModuleDefId, vis: Visibility, import: Option<ImportId>) -> PerNs { + PerNs { types: None, values: Some(Item { def, vis, import }), macros: None } } - pub fn types(t: ModuleDefId, v: Visibility, i: Option<ImportOrExternCrate>) -> PerNs { - PerNs { types: Some((t, v, i)), values: None, macros: None } + pub fn types(def: ModuleDefId, vis: Visibility, import: Option<ImportOrExternCrate>) -> PerNs { + PerNs { types: Some(Item { def, vis, import }), values: None, macros: None } } pub fn both( types: ModuleDefId, values: ModuleDefId, - v: Visibility, - i: Option<ImportOrExternCrate>, + vis: Visibility, + import: Option<ImportOrExternCrate>, ) -> PerNs { PerNs { - types: Some((types, v, i)), - values: Some((values, v, i.and_then(ImportOrExternCrate::into_import))), + types: Some(Item { def: types, vis, import }), + values: Some(Item { + def: values, + vis, + import: import.and_then(ImportOrExternCrate::into_import), + }), macros: None, } } - pub fn macros(macro_: MacroId, v: Visibility, i: Option<ImportId>) -> PerNs { - PerNs { types: None, values: None, macros: Some((macro_, v, i)) } + pub fn macros(def: MacroId, vis: Visibility, import: Option<ImportId>) -> PerNs { + PerNs { types: None, values: None, macros: Some(Item { def, vis, import }) } } pub fn is_none(&self) -> bool { @@ -82,43 +97,43 @@ impl PerNs { } pub fn take_types(self) -> Option<ModuleDefId> { - self.types.map(|it| it.0) + self.types.map(|it| it.def) } - pub fn take_types_full(self) -> Option<(ModuleDefId, Visibility, Option<ImportOrExternCrate>)> { + pub fn take_types_full(self) -> Option<TypesItem> { self.types } pub fn take_values(self) -> Option<ModuleDefId> { - self.values.map(|it| it.0) + self.values.map(|it| it.def) } pub fn take_values_import(self) -> Option<(ModuleDefId, Option<ImportId>)> { - self.values.map(|it| (it.0, it.2)) + self.values.map(|it| (it.def, it.import)) } pub fn take_macros(self) -> Option<MacroId> { - self.macros.map(|it| it.0) + self.macros.map(|it| it.def) } pub fn take_macros_import(self) -> Option<(MacroId, Option<ImportId>)> { - self.macros.map(|it| (it.0, it.2)) + self.macros.map(|it| (it.def, it.import)) } pub fn filter_visibility(self, mut f: impl FnMut(Visibility) -> bool) -> PerNs { let _p = tracing::info_span!("PerNs::filter_visibility").entered(); PerNs { - types: self.types.filter(|&(_, v, _)| f(v)), - values: self.values.filter(|&(_, v, _)| f(v)), - macros: self.macros.filter(|&(_, v, _)| f(v)), + types: self.types.filter(|def| f(def.vis)), + values: self.values.filter(|def| f(def.vis)), + macros: self.macros.filter(|def| f(def.vis)), } } pub fn with_visibility(self, vis: Visibility) -> PerNs { PerNs { - types: self.types.map(|(it, _, c)| (it, vis, c)), - values: self.values.map(|(it, _, c)| (it, vis, c)), - macros: self.macros.map(|(it, _, import)| (it, vis, import)), + types: self.types.map(|def| Item { vis, ..def }), + values: self.values.map(|def| Item { vis, ..def }), + macros: self.macros.map(|def| Item { vis, ..def }), } } @@ -141,15 +156,17 @@ impl PerNs { pub fn iter_items(self) -> impl Iterator<Item = (ItemInNs, Option<ImportOrExternCrate>)> { let _p = tracing::info_span!("PerNs::iter_items").entered(); self.types - .map(|it| (ItemInNs::Types(it.0), it.2)) + .map(|it| (ItemInNs::Types(it.def), it.import)) .into_iter() .chain( - self.values - .map(|it| (ItemInNs::Values(it.0), it.2.map(ImportOrExternCrate::Import))), + self.values.map(|it| { + (ItemInNs::Values(it.def), it.import.map(ImportOrExternCrate::Import)) + }), ) .chain( - self.macros - .map(|it| (ItemInNs::Macros(it.0), it.2.map(ImportOrExternCrate::Import))), + self.macros.map(|it| { + (ItemInNs::Macros(it.def), it.import.map(ImportOrExternCrate::Import)) + }), ) } } |