aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/item_scope.rs
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2020-07-21 16:52:43 +0100
committerJonas Schievink <[email protected]>2020-07-21 16:55:17 +0100
commitc07eaf868dab86d061ae80c098798a767b910e91 (patch)
tree1793a7f85fd45a0774e019aaa9fe16410ab6eda9 /crates/ra_hir_def/src/item_scope.rs
parent65b89b5471879a80fb6003c9fa0f8f93e2eb38e6 (diff)
Support `Trait as _` imports
Diffstat (limited to 'crates/ra_hir_def/src/item_scope.rs')
-rw-r--r--crates/ra_hir_def/src/item_scope.rs29
1 files changed, 23 insertions, 6 deletions
diff --git a/crates/ra_hir_def/src/item_scope.rs b/crates/ra_hir_def/src/item_scope.rs
index beeb98559..8fee4b15e 100644
--- a/crates/ra_hir_def/src/item_scope.rs
+++ b/crates/ra_hir_def/src/item_scope.rs
@@ -36,6 +36,8 @@ pub struct ItemScope {
36 36
37 defs: Vec<ModuleDefId>, 37 defs: Vec<ModuleDefId>,
38 impls: Vec<ImplId>, 38 impls: Vec<ImplId>,
39 /// Traits imported via `use Trait as _;`.
40 unnamed_trait_imports: FxHashMap<TraitId, Visibility>,
39 /// Macros visible in current module in legacy textual scope 41 /// Macros visible in current module in legacy textual scope
40 /// 42 ///
41 /// For macros invoked by an unqualified identifier like `bar!()`, `legacy_macros` will be searched in first. 43 /// For macros invoked by an unqualified identifier like `bar!()`, `legacy_macros` will be searched in first.
@@ -126,10 +128,13 @@ impl ItemScope {
126 } 128 }
127 129
128 pub(crate) fn traits<'a>(&'a self) -> impl Iterator<Item = TraitId> + 'a { 130 pub(crate) fn traits<'a>(&'a self) -> impl Iterator<Item = TraitId> + 'a {
129 self.types.values().filter_map(|(def, _)| match def { 131 self.types
130 ModuleDefId::TraitId(t) => Some(*t), 132 .values()
131 _ => None, 133 .filter_map(|(def, _)| match def {
132 }) 134 ModuleDefId::TraitId(t) => Some(*t),
135 _ => None,
136 })
137 .chain(self.unnamed_trait_imports.keys().copied())
133 } 138 }
134 139
135 pub(crate) fn define_def(&mut self, def: ModuleDefId) { 140 pub(crate) fn define_def(&mut self, def: ModuleDefId) {
@@ -148,6 +153,14 @@ impl ItemScope {
148 self.legacy_macros.insert(name, mac); 153 self.legacy_macros.insert(name, mac);
149 } 154 }
150 155
156 pub(crate) fn unnamed_trait_vis(&self, tr: TraitId) -> Option<Visibility> {
157 self.unnamed_trait_imports.get(&tr).copied()
158 }
159
160 pub(crate) fn push_unnamed_trait(&mut self, tr: TraitId, vis: Visibility) {
161 self.unnamed_trait_imports.insert(tr, vis);
162 }
163
151 pub(crate) fn push_res(&mut self, name: Name, def: PerNs) -> bool { 164 pub(crate) fn push_res(&mut self, name: Name, def: PerNs) -> bool {
152 let mut changed = false; 165 let mut changed = false;
153 166
@@ -241,8 +254,12 @@ impl ItemScope {
241 changed 254 changed
242 } 255 }
243 256
244 pub(crate) fn resolutions<'a>(&'a self) -> impl Iterator<Item = (Name, PerNs)> + 'a { 257 pub(crate) fn resolutions<'a>(&'a self) -> impl Iterator<Item = (Option<Name>, PerNs)> + 'a {
245 self.entries().map(|(name, res)| (name.clone(), res)) 258 self.entries().map(|(name, res)| (Some(name.clone()), res)).chain(
259 self.unnamed_trait_imports
260 .iter()
261 .map(|(tr, vis)| (None, PerNs::types(ModuleDefId::TraitId(*tr), *vis))),
262 )
246 } 263 }
247 264
248 pub(crate) fn collect_legacy_macros(&self) -> FxHashMap<Name, MacroDefId> { 265 pub(crate) fn collect_legacy_macros(&self) -> FxHashMap<Name, MacroDefId> {