diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-04-07 02:35:00 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-04-07 02:35:00 +0100 |
commit | cf41e1410a0cf87a05b2dd632e3b5d67f8d55327 (patch) | |
tree | be2ec91cdd13c8125e560bb414a37866ae573642 /crates/hir_def | |
parent | 3e7ac2b830f692fd993a9b30b6be96a4206b8229 (diff) | |
parent | 7c1c0e6feadc017f5919f789f974405635fc25e3 (diff) |
Merge #8390
8390: Support trait impls in unnamed consts r=jonas-schievink a=jonas-schievink
Fixes https://github.com/rust-analyzer/rust-analyzer/issues/7550
bors r+
Co-authored-by: Jonas Schievink <[email protected]>
Diffstat (limited to 'crates/hir_def')
-rw-r--r-- | crates/hir_def/src/item_scope.rs | 13 | ||||
-rw-r--r-- | crates/hir_def/src/nameres/collector.rs | 34 |
2 files changed, 33 insertions, 14 deletions
diff --git a/crates/hir_def/src/item_scope.rs b/crates/hir_def/src/item_scope.rs index a8ee5eeac..9014468ea 100644 --- a/crates/hir_def/src/item_scope.rs +++ b/crates/hir_def/src/item_scope.rs | |||
@@ -11,7 +11,7 @@ use rustc_hash::{FxHashMap, FxHashSet}; | |||
11 | use stdx::format_to; | 11 | use stdx::format_to; |
12 | 12 | ||
13 | use crate::{ | 13 | use crate::{ |
14 | db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, ImplId, | 14 | db::DefDatabase, per_ns::PerNs, visibility::Visibility, AdtId, BuiltinType, ConstId, ImplId, |
15 | LocalModuleId, MacroDefId, ModuleDefId, ModuleId, TraitId, | 15 | LocalModuleId, MacroDefId, ModuleDefId, ModuleId, TraitId, |
16 | }; | 16 | }; |
17 | 17 | ||
@@ -37,6 +37,7 @@ pub struct ItemScope { | |||
37 | 37 | ||
38 | defs: Vec<ModuleDefId>, | 38 | defs: Vec<ModuleDefId>, |
39 | impls: Vec<ImplId>, | 39 | impls: Vec<ImplId>, |
40 | unnamed_consts: Vec<ConstId>, | ||
40 | /// Traits imported via `use Trait as _;`. | 41 | /// Traits imported via `use Trait as _;`. |
41 | unnamed_trait_imports: FxHashMap<TraitId, Visibility>, | 42 | unnamed_trait_imports: FxHashMap<TraitId, Visibility>, |
42 | /// Macros visible in current module in legacy textual scope | 43 | /// Macros visible in current module in legacy textual scope |
@@ -106,6 +107,10 @@ impl ItemScope { | |||
106 | .map(|(_, v)| v) | 107 | .map(|(_, v)| v) |
107 | } | 108 | } |
108 | 109 | ||
110 | pub fn unnamed_consts(&self) -> impl Iterator<Item = ConstId> + '_ { | ||
111 | self.unnamed_consts.iter().copied() | ||
112 | } | ||
113 | |||
109 | /// Iterate over all module scoped macros | 114 | /// Iterate over all module scoped macros |
110 | pub(crate) fn macros<'a>(&'a self) -> impl Iterator<Item = (&'a Name, MacroDefId)> + 'a { | 115 | pub(crate) fn macros<'a>(&'a self) -> impl Iterator<Item = (&'a Name, MacroDefId)> + 'a { |
111 | self.entries().filter_map(|(name, def)| def.take_macros().map(|macro_| (name, macro_))) | 116 | self.entries().filter_map(|(name, def)| def.take_macros().map(|macro_| (name, macro_))) |
@@ -156,6 +161,10 @@ impl ItemScope { | |||
156 | self.impls.push(imp) | 161 | self.impls.push(imp) |
157 | } | 162 | } |
158 | 163 | ||
164 | pub(crate) fn define_unnamed_const(&mut self, konst: ConstId) { | ||
165 | self.unnamed_consts.push(konst); | ||
166 | } | ||
167 | |||
159 | pub(crate) fn define_legacy_macro(&mut self, name: Name, mac: MacroDefId) { | 168 | pub(crate) fn define_legacy_macro(&mut self, name: Name, mac: MacroDefId) { |
160 | self.legacy_macros.insert(name, mac); | 169 | self.legacy_macros.insert(name, mac); |
161 | } | 170 | } |
@@ -295,6 +304,7 @@ impl ItemScope { | |||
295 | unresolved, | 304 | unresolved, |
296 | defs, | 305 | defs, |
297 | impls, | 306 | impls, |
307 | unnamed_consts, | ||
298 | unnamed_trait_imports, | 308 | unnamed_trait_imports, |
299 | legacy_macros, | 309 | legacy_macros, |
300 | } = self; | 310 | } = self; |
@@ -304,6 +314,7 @@ impl ItemScope { | |||
304 | unresolved.shrink_to_fit(); | 314 | unresolved.shrink_to_fit(); |
305 | defs.shrink_to_fit(); | 315 | defs.shrink_to_fit(); |
306 | impls.shrink_to_fit(); | 316 | impls.shrink_to_fit(); |
317 | unnamed_consts.shrink_to_fit(); | ||
307 | unnamed_trait_imports.shrink_to_fit(); | 318 | unnamed_trait_imports.shrink_to_fit(); |
308 | legacy_macros.shrink_to_fit(); | 319 | legacy_macros.shrink_to_fit(); |
309 | } | 320 | } |
diff --git a/crates/hir_def/src/nameres/collector.rs b/crates/hir_def/src/nameres/collector.rs index f42f92702..492d8c71f 100644 --- a/crates/hir_def/src/nameres/collector.rs +++ b/crates/hir_def/src/nameres/collector.rs | |||
@@ -1163,19 +1163,27 @@ impl ModCollector<'_, '_> { | |||
1163 | } | 1163 | } |
1164 | ModItem::Const(id) => { | 1164 | ModItem::Const(id) => { |
1165 | let it = &self.item_tree[id]; | 1165 | let it = &self.item_tree[id]; |
1166 | 1166 | let const_id = ConstLoc { | |
1167 | if let Some(name) = &it.name { | 1167 | container: module.into(), |
1168 | def = Some(DefData { | 1168 | id: ItemTreeId::new(self.file_id, id), |
1169 | id: ConstLoc { | 1169 | } |
1170 | container: module.into(), | 1170 | .intern(self.def_collector.db); |
1171 | id: ItemTreeId::new(self.file_id, id), | 1171 | |
1172 | } | 1172 | match &it.name { |
1173 | .intern(self.def_collector.db) | 1173 | Some(name) => { |
1174 | .into(), | 1174 | def = Some(DefData { |
1175 | name, | 1175 | id: const_id.into(), |
1176 | visibility: &self.item_tree[it.visibility], | 1176 | name, |
1177 | has_constructor: false, | 1177 | visibility: &self.item_tree[it.visibility], |
1178 | }); | 1178 | has_constructor: false, |
1179 | }); | ||
1180 | } | ||
1181 | None => { | ||
1182 | // const _: T = ...; | ||
1183 | self.def_collector.def_map.modules[self.module_id] | ||
1184 | .scope | ||
1185 | .define_unnamed_const(const_id); | ||
1186 | } | ||
1179 | } | 1187 | } |
1180 | } | 1188 | } |
1181 | ModItem::Static(id) => { | 1189 | ModItem::Static(id) => { |