• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //! Name resolution façade.
2 use std::{fmt, hash::BuildHasherDefault};
3 
4 use base_db::CrateId;
5 use hir_expand::name::{name, Name};
6 use indexmap::IndexMap;
7 use intern::Interned;
8 use rustc_hash::FxHashSet;
9 use smallvec::{smallvec, SmallVec};
10 use triomphe::Arc;
11 
12 use crate::{
13     body::scope::{ExprScopes, ScopeId},
14     builtin_type::BuiltinType,
15     db::DefDatabase,
16     generics::{GenericParams, TypeOrConstParamData},
17     hir::{BindingId, ExprId, LabelId},
18     item_scope::{BuiltinShadowMode, BUILTIN_SCOPE},
19     lang_item::LangItemTarget,
20     nameres::{DefMap, MacroSubNs},
21     path::{ModPath, Path, PathKind},
22     per_ns::PerNs,
23     visibility::{RawVisibility, Visibility},
24     AdtId, AssocItemId, ConstId, ConstParamId, CrateRootModuleId, DefWithBodyId, EnumId,
25     EnumVariantId, ExternBlockId, FunctionId, GenericDefId, GenericParamId, HasModule, ImplId,
26     ItemContainerId, LifetimeParamId, LocalModuleId, Lookup, Macro2Id, MacroId, MacroRulesId,
27     ModuleDefId, ModuleId, ProcMacroId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId,
28     TypeOrConstParamId, TypeOwnerId, TypeParamId, VariantId,
29 };
30 
31 #[derive(Debug, Clone)]
32 pub struct Resolver {
33     /// The stack of scopes, where the inner-most scope is the last item.
34     ///
35     /// When using, you generally want to process the scopes in reverse order,
36     /// there's `scopes` *method* for that.
37     scopes: Vec<Scope>,
38     module_scope: ModuleItemMap,
39 }
40 
41 #[derive(Clone)]
42 struct ModuleItemMap {
43     def_map: Arc<DefMap>,
44     module_id: LocalModuleId,
45 }
46 
47 impl fmt::Debug for ModuleItemMap {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result48     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
49         f.debug_struct("ModuleItemMap").field("module_id", &self.module_id).finish()
50     }
51 }
52 
53 #[derive(Clone)]
54 struct ExprScope {
55     owner: DefWithBodyId,
56     expr_scopes: Arc<ExprScopes>,
57     scope_id: ScopeId,
58 }
59 
60 impl fmt::Debug for ExprScope {
fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result61     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
62         f.debug_struct("ExprScope")
63             .field("owner", &self.owner)
64             .field("scope_id", &self.scope_id)
65             .finish()
66     }
67 }
68 
69 #[derive(Debug, Clone)]
70 enum Scope {
71     /// All the items and imported names of a module
72     BlockScope(ModuleItemMap),
73     /// Brings the generic parameters of an item into scope
74     GenericParams { def: GenericDefId, params: Interned<GenericParams> },
75     /// Brings `Self` in `impl` block into scope
76     ImplDefScope(ImplId),
77     /// Brings `Self` in enum, struct and union definitions into scope
78     AdtScope(AdtId),
79     /// Local bindings
80     ExprScope(ExprScope),
81 }
82 
83 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
84 pub enum TypeNs {
85     SelfType(ImplId),
86     GenericParam(TypeParamId),
87     AdtId(AdtId),
88     AdtSelfType(AdtId),
89     // Yup, enum variants are added to the types ns, but any usage of variant as
90     // type is an error.
91     EnumVariantId(EnumVariantId),
92     TypeAliasId(TypeAliasId),
93     BuiltinType(BuiltinType),
94     TraitId(TraitId),
95     TraitAliasId(TraitAliasId),
96     // Module belong to type ns, but the resolver is used when all module paths
97     // are fully resolved.
98     // ModuleId(ModuleId)
99 }
100 
101 #[derive(Debug, Clone, PartialEq, Eq, Hash)]
102 pub enum ResolveValueResult {
103     ValueNs(ValueNs),
104     Partial(TypeNs, usize),
105 }
106 
107 #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
108 pub enum ValueNs {
109     ImplSelf(ImplId),
110     LocalBinding(BindingId),
111     FunctionId(FunctionId),
112     ConstId(ConstId),
113     StaticId(StaticId),
114     StructId(StructId),
115     EnumVariantId(EnumVariantId),
116     GenericParam(ConstParamId),
117 }
118 
119 impl Resolver {
120     /// Resolve known trait from std, like `std::futures::Future`
resolve_known_trait(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<TraitId>121     pub fn resolve_known_trait(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<TraitId> {
122         let res = self.resolve_module_path(db, path, BuiltinShadowMode::Other).take_types()?;
123         match res {
124             ModuleDefId::TraitId(it) => Some(it),
125             _ => None,
126         }
127     }
128 
129     /// Resolve known struct from std, like `std::boxed::Box`
resolve_known_struct(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<StructId>130     pub fn resolve_known_struct(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<StructId> {
131         let res = self.resolve_module_path(db, path, BuiltinShadowMode::Other).take_types()?;
132         match res {
133             ModuleDefId::AdtId(AdtId::StructId(it)) => Some(it),
134             _ => None,
135         }
136     }
137 
138     /// Resolve known enum from std, like `std::result::Result`
resolve_known_enum(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<EnumId>139     pub fn resolve_known_enum(&self, db: &dyn DefDatabase, path: &ModPath) -> Option<EnumId> {
140         let res = self.resolve_module_path(db, path, BuiltinShadowMode::Other).take_types()?;
141         match res {
142             ModuleDefId::AdtId(AdtId::EnumId(it)) => Some(it),
143             _ => None,
144         }
145     }
146 
resolve_module_path_in_items(&self, db: &dyn DefDatabase, path: &ModPath) -> PerNs147     pub fn resolve_module_path_in_items(&self, db: &dyn DefDatabase, path: &ModPath) -> PerNs {
148         self.resolve_module_path(db, path, BuiltinShadowMode::Module)
149     }
150 
151     // FIXME: This shouldn't exist
resolve_module_path_in_trait_assoc_items( &self, db: &dyn DefDatabase, path: &ModPath, ) -> Option<PerNs>152     pub fn resolve_module_path_in_trait_assoc_items(
153         &self,
154         db: &dyn DefDatabase,
155         path: &ModPath,
156     ) -> Option<PerNs> {
157         let (item_map, module) = self.item_scope();
158         let (module_res, idx) =
159             item_map.resolve_path(db, module, path, BuiltinShadowMode::Module, None);
160         match module_res.take_types()? {
161             ModuleDefId::TraitId(it) => {
162                 let idx = idx?;
163                 let unresolved = &path.segments()[idx..];
164                 let assoc = match unresolved {
165                     [it] => it,
166                     _ => return None,
167                 };
168                 let &(_, assoc) = db.trait_data(it).items.iter().find(|(n, _)| n == assoc)?;
169                 Some(match assoc {
170                     AssocItemId::FunctionId(it) => PerNs::values(it.into(), Visibility::Public),
171                     AssocItemId::ConstId(it) => PerNs::values(it.into(), Visibility::Public),
172                     AssocItemId::TypeAliasId(it) => PerNs::types(it.into(), Visibility::Public),
173                 })
174             }
175             _ => None,
176         }
177     }
178 
resolve_path_in_type_ns( &self, db: &dyn DefDatabase, path: &Path, ) -> Option<(TypeNs, Option<usize>)>179     pub fn resolve_path_in_type_ns(
180         &self,
181         db: &dyn DefDatabase,
182         path: &Path,
183     ) -> Option<(TypeNs, Option<usize>)> {
184         let path = match path {
185             Path::Normal { mod_path, .. } => mod_path,
186             Path::LangItem(l) => {
187                 return Some((
188                     match *l {
189                         LangItemTarget::Union(x) => TypeNs::AdtId(x.into()),
190                         LangItemTarget::TypeAlias(x) => TypeNs::TypeAliasId(x),
191                         LangItemTarget::Struct(x) => TypeNs::AdtId(x.into()),
192                         LangItemTarget::EnumVariant(x) => TypeNs::EnumVariantId(x),
193                         LangItemTarget::EnumId(x) => TypeNs::AdtId(x.into()),
194                         LangItemTarget::Trait(x) => TypeNs::TraitId(x),
195                         LangItemTarget::Function(_)
196                         | LangItemTarget::ImplDef(_)
197                         | LangItemTarget::Static(_) => return None,
198                     },
199                     None,
200                 ))
201             }
202         };
203         let first_name = path.segments().first()?;
204         let skip_to_mod = path.kind != PathKind::Plain;
205         if skip_to_mod {
206             return self.module_scope.resolve_path_in_type_ns(db, path);
207         }
208 
209         let remaining_idx = || if path.segments().len() == 1 { None } else { Some(1) };
210 
211         for scope in self.scopes() {
212             match scope {
213                 Scope::ExprScope(_) => continue,
214                 Scope::GenericParams { params, def } => {
215                     if let Some(id) = params.find_type_by_name(first_name, *def) {
216                         return Some((TypeNs::GenericParam(id), remaining_idx()));
217                     }
218                 }
219                 &Scope::ImplDefScope(impl_) => {
220                     if first_name == &name![Self] {
221                         return Some((TypeNs::SelfType(impl_), remaining_idx()));
222                     }
223                 }
224                 &Scope::AdtScope(adt) => {
225                     if first_name == &name![Self] {
226                         return Some((TypeNs::AdtSelfType(adt), remaining_idx()));
227                     }
228                 }
229                 Scope::BlockScope(m) => {
230                     if let Some(res) = m.resolve_path_in_type_ns(db, path) {
231                         return Some(res);
232                     }
233                 }
234             }
235         }
236         self.module_scope.resolve_path_in_type_ns(db, path)
237     }
238 
resolve_path_in_type_ns_fully( &self, db: &dyn DefDatabase, path: &Path, ) -> Option<TypeNs>239     pub fn resolve_path_in_type_ns_fully(
240         &self,
241         db: &dyn DefDatabase,
242         path: &Path,
243     ) -> Option<TypeNs> {
244         let (res, unresolved) = self.resolve_path_in_type_ns(db, path)?;
245         if unresolved.is_some() {
246             return None;
247         }
248         Some(res)
249     }
250 
resolve_visibility( &self, db: &dyn DefDatabase, visibility: &RawVisibility, ) -> Option<Visibility>251     pub fn resolve_visibility(
252         &self,
253         db: &dyn DefDatabase,
254         visibility: &RawVisibility,
255     ) -> Option<Visibility> {
256         let within_impl =
257             self.scopes().find(|scope| matches!(scope, Scope::ImplDefScope(_))).is_some();
258         match visibility {
259             RawVisibility::Module(_) => {
260                 let (item_map, module) = self.item_scope();
261                 item_map.resolve_visibility(db, module, visibility, within_impl)
262             }
263             RawVisibility::Public => Some(Visibility::Public),
264         }
265     }
266 
resolve_path_in_value_ns( &self, db: &dyn DefDatabase, path: &Path, ) -> Option<ResolveValueResult>267     pub fn resolve_path_in_value_ns(
268         &self,
269         db: &dyn DefDatabase,
270         path: &Path,
271     ) -> Option<ResolveValueResult> {
272         let path = match path {
273             Path::Normal { mod_path, .. } => mod_path,
274             Path::LangItem(l) => {
275                 return Some(ResolveValueResult::ValueNs(match *l {
276                     LangItemTarget::Function(x) => ValueNs::FunctionId(x),
277                     LangItemTarget::Static(x) => ValueNs::StaticId(x),
278                     LangItemTarget::Struct(x) => ValueNs::StructId(x),
279                     LangItemTarget::EnumVariant(x) => ValueNs::EnumVariantId(x),
280                     LangItemTarget::Union(_)
281                     | LangItemTarget::ImplDef(_)
282                     | LangItemTarget::TypeAlias(_)
283                     | LangItemTarget::Trait(_)
284                     | LangItemTarget::EnumId(_) => return None,
285                 }))
286             }
287         };
288         let n_segments = path.segments().len();
289         let tmp = name![self];
290         let first_name = if path.is_self() { &tmp } else { path.segments().first()? };
291         let skip_to_mod = path.kind != PathKind::Plain && !path.is_self();
292         if skip_to_mod {
293             return self.module_scope.resolve_path_in_value_ns(db, path);
294         }
295 
296         if n_segments <= 1 {
297             for scope in self.scopes() {
298                 match scope {
299                     Scope::ExprScope(scope) => {
300                         let entry = scope
301                             .expr_scopes
302                             .entries(scope.scope_id)
303                             .iter()
304                             .find(|entry| entry.name() == first_name);
305 
306                         if let Some(e) = entry {
307                             return Some(ResolveValueResult::ValueNs(ValueNs::LocalBinding(
308                                 e.binding(),
309                             )));
310                         }
311                     }
312                     Scope::GenericParams { params, def } => {
313                         if let Some(id) = params.find_const_by_name(first_name, *def) {
314                             let val = ValueNs::GenericParam(id);
315                             return Some(ResolveValueResult::ValueNs(val));
316                         }
317                     }
318                     &Scope::ImplDefScope(impl_) => {
319                         if first_name == &name![Self] {
320                             return Some(ResolveValueResult::ValueNs(ValueNs::ImplSelf(impl_)));
321                         }
322                     }
323                     // bare `Self` doesn't work in the value namespace in a struct/enum definition
324                     Scope::AdtScope(_) => continue,
325                     Scope::BlockScope(m) => {
326                         if let Some(def) = m.resolve_path_in_value_ns(db, path) {
327                             return Some(def);
328                         }
329                     }
330                 }
331             }
332         } else {
333             for scope in self.scopes() {
334                 match scope {
335                     Scope::ExprScope(_) => continue,
336                     Scope::GenericParams { params, def } => {
337                         if let Some(id) = params.find_type_by_name(first_name, *def) {
338                             let ty = TypeNs::GenericParam(id);
339                             return Some(ResolveValueResult::Partial(ty, 1));
340                         }
341                     }
342                     &Scope::ImplDefScope(impl_) => {
343                         if first_name == &name![Self] {
344                             return Some(ResolveValueResult::Partial(TypeNs::SelfType(impl_), 1));
345                         }
346                     }
347                     Scope::AdtScope(adt) => {
348                         if first_name == &name![Self] {
349                             let ty = TypeNs::AdtSelfType(*adt);
350                             return Some(ResolveValueResult::Partial(ty, 1));
351                         }
352                     }
353                     Scope::BlockScope(m) => {
354                         if let Some(def) = m.resolve_path_in_value_ns(db, path) {
355                             return Some(def);
356                         }
357                     }
358                 }
359             }
360         }
361 
362         if let Some(res) = self.module_scope.resolve_path_in_value_ns(db, path) {
363             return Some(res);
364         }
365 
366         // If a path of the shape `u16::from_le_bytes` failed to resolve at all, then we fall back
367         // to resolving to the primitive type, to allow this to still work in the presence of
368         // `use core::u16;`.
369         if path.kind == PathKind::Plain && n_segments > 1 {
370             if let Some(builtin) = BuiltinType::by_name(first_name) {
371                 return Some(ResolveValueResult::Partial(TypeNs::BuiltinType(builtin), 1));
372             }
373         }
374 
375         None
376     }
377 
resolve_path_in_value_ns_fully( &self, db: &dyn DefDatabase, path: &Path, ) -> Option<ValueNs>378     pub fn resolve_path_in_value_ns_fully(
379         &self,
380         db: &dyn DefDatabase,
381         path: &Path,
382     ) -> Option<ValueNs> {
383         match self.resolve_path_in_value_ns(db, path)? {
384             ResolveValueResult::ValueNs(it) => Some(it),
385             ResolveValueResult::Partial(..) => None,
386         }
387     }
388 
resolve_path_as_macro( &self, db: &dyn DefDatabase, path: &ModPath, expected_macro_kind: Option<MacroSubNs>, ) -> Option<MacroId>389     pub fn resolve_path_as_macro(
390         &self,
391         db: &dyn DefDatabase,
392         path: &ModPath,
393         expected_macro_kind: Option<MacroSubNs>,
394     ) -> Option<MacroId> {
395         let (item_map, module) = self.item_scope();
396         item_map
397             .resolve_path(db, module, path, BuiltinShadowMode::Other, expected_macro_kind)
398             .0
399             .take_macros()
400     }
401 
402     /// Returns a set of names available in the current scope.
403     ///
404     /// Note that this is a somewhat fuzzy concept -- internally, the compiler
405     /// doesn't necessary follow a strict scoping discipline. Rather, it just
406     /// tells for each ident what it resolves to.
407     ///
408     /// A good example is something like `str::from_utf8`. From scopes point of
409     /// view, this code is erroneous -- both `str` module and `str` type occupy
410     /// the same type namespace.
411     ///
412     /// We don't try to model that super-correctly -- this functionality is
413     /// primarily exposed for completions.
414     ///
415     /// Note that in Rust one name can be bound to several items:
416     ///
417     /// ```
418     /// macro_rules! t { () => (()) }
419     /// type t = t!();
420     /// const t: t = t!()
421     /// ```
422     ///
423     /// That's why we return a multimap.
424     ///
425     /// The shadowing is accounted for: in
426     ///
427     /// ```
428     /// let x = 92;
429     /// {
430     ///     let x = 92;
431     ///     $0
432     /// }
433     /// ```
434     ///
435     /// there will be only one entry for `x` in the result.
436     ///
437     /// The result is ordered *roughly* from the innermost scope to the
438     /// outermost: when the name is introduced in two namespaces in two scopes,
439     /// we use the position of the first scope.
names_in_scope( &self, db: &dyn DefDatabase, ) -> FxIndexMap<Name, SmallVec<[ScopeDef; 1]>>440     pub fn names_in_scope(
441         &self,
442         db: &dyn DefDatabase,
443     ) -> FxIndexMap<Name, SmallVec<[ScopeDef; 1]>> {
444         let mut res = ScopeNames::default();
445         for scope in self.scopes() {
446             scope.process_names(&mut res, db);
447         }
448         let ModuleItemMap { ref def_map, module_id } = self.module_scope;
449         // FIXME: should we provide `self` here?
450         // f(
451         //     Name::self_param(),
452         //     PerNs::types(Resolution::Def {
453         //         def: m.module.into(),
454         //     }),
455         // );
456         def_map[module_id].scope.entries().for_each(|(name, def)| {
457             res.add_per_ns(name, def);
458         });
459         def_map[module_id].scope.legacy_macros().for_each(|(name, macs)| {
460             macs.iter().for_each(|&mac| {
461                 res.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)));
462             })
463         });
464         def_map.macro_use_prelude().for_each(|(name, def)| {
465             res.add(name, ScopeDef::ModuleDef(def.into()));
466         });
467         def_map.extern_prelude().for_each(|(name, def)| {
468             res.add(name, ScopeDef::ModuleDef(ModuleDefId::ModuleId(def)));
469         });
470         BUILTIN_SCOPE.iter().for_each(|(name, &def)| {
471             res.add_per_ns(name, def);
472         });
473         if let Some(prelude) = def_map.prelude() {
474             let prelude_def_map = prelude.def_map(db);
475             for (name, def) in prelude_def_map[prelude.local_id].scope.entries() {
476                 res.add_per_ns(name, def)
477             }
478         }
479         res.map
480     }
481 
traits_in_scope(&self, db: &dyn DefDatabase) -> FxHashSet<TraitId>482     pub fn traits_in_scope(&self, db: &dyn DefDatabase) -> FxHashSet<TraitId> {
483         // FIXME(trait_alias): Trait alias brings aliased traits in scope! Note that supertraits of
484         // aliased traits are NOT brought in scope (unless also aliased).
485         let mut traits = FxHashSet::default();
486 
487         for scope in self.scopes() {
488             match scope {
489                 Scope::BlockScope(m) => traits.extend(m.def_map[m.module_id].scope.traits()),
490                 &Scope::ImplDefScope(impl_) => {
491                     if let Some(target_trait) = &db.impl_data(impl_).target_trait {
492                         if let Some(TypeNs::TraitId(trait_)) =
493                             self.resolve_path_in_type_ns_fully(db, &target_trait.path)
494                         {
495                             traits.insert(trait_);
496                         }
497                     }
498                 }
499                 _ => (),
500             }
501         }
502 
503         // Fill in the prelude traits
504         if let Some(prelude) = self.module_scope.def_map.prelude() {
505             let prelude_def_map = prelude.def_map(db);
506             traits.extend(prelude_def_map[prelude.local_id].scope.traits());
507         }
508         // Fill in module visible traits
509         traits.extend(self.module_scope.def_map[self.module_scope.module_id].scope.traits());
510         traits
511     }
512 
traits_in_scope_from_block_scopes(&self) -> impl Iterator<Item = TraitId> + '_513     pub fn traits_in_scope_from_block_scopes(&self) -> impl Iterator<Item = TraitId> + '_ {
514         self.scopes()
515             .filter_map(|scope| match scope {
516                 Scope::BlockScope(m) => Some(m.def_map[m.module_id].scope.traits()),
517                 _ => None,
518             })
519             .flatten()
520     }
521 
module(&self) -> ModuleId522     pub fn module(&self) -> ModuleId {
523         let (def_map, local_id) = self.item_scope();
524         def_map.module_id(local_id)
525     }
526 
krate(&self) -> CrateId527     pub fn krate(&self) -> CrateId {
528         self.module_scope.def_map.krate()
529     }
530 
def_map(&self) -> &DefMap531     pub fn def_map(&self) -> &DefMap {
532         self.item_scope().0
533     }
534 
where_predicates_in_scope( &self, ) -> impl Iterator<Item = &crate::generics::WherePredicate>535     pub fn where_predicates_in_scope(
536         &self,
537     ) -> impl Iterator<Item = &crate::generics::WherePredicate> {
538         self.scopes()
539             .filter_map(|scope| match scope {
540                 Scope::GenericParams { params, .. } => Some(params),
541                 _ => None,
542             })
543             .flat_map(|params| params.where_predicates.iter())
544     }
545 
generic_def(&self) -> Option<GenericDefId>546     pub fn generic_def(&self) -> Option<GenericDefId> {
547         self.scopes().find_map(|scope| match scope {
548             Scope::GenericParams { def, .. } => Some(*def),
549             _ => None,
550         })
551     }
552 
generic_params(&self) -> Option<&Interned<GenericParams>>553     pub fn generic_params(&self) -> Option<&Interned<GenericParams>> {
554         self.scopes().find_map(|scope| match scope {
555             Scope::GenericParams { params, .. } => Some(params),
556             _ => None,
557         })
558     }
559 
body_owner(&self) -> Option<DefWithBodyId>560     pub fn body_owner(&self) -> Option<DefWithBodyId> {
561         self.scopes().find_map(|scope| match scope {
562             Scope::ExprScope(it) => Some(it.owner),
563             _ => None,
564         })
565     }
566     /// `expr_id` is required to be an expression id that comes after the top level expression scope in the given resolver
567     #[must_use]
update_to_inner_scope( &mut self, db: &dyn DefDatabase, owner: DefWithBodyId, expr_id: ExprId, ) -> UpdateGuard568     pub fn update_to_inner_scope(
569         &mut self,
570         db: &dyn DefDatabase,
571         owner: DefWithBodyId,
572         expr_id: ExprId,
573     ) -> UpdateGuard {
574         #[inline(always)]
575         fn append_expr_scope(
576             db: &dyn DefDatabase,
577             resolver: &mut Resolver,
578             owner: DefWithBodyId,
579             expr_scopes: &Arc<ExprScopes>,
580             scope_id: ScopeId,
581         ) {
582             resolver.scopes.push(Scope::ExprScope(ExprScope {
583                 owner,
584                 expr_scopes: expr_scopes.clone(),
585                 scope_id,
586             }));
587             if let Some(block) = expr_scopes.block(scope_id) {
588                 let def_map = db.block_def_map(block);
589                 resolver
590                     .scopes
591                     .push(Scope::BlockScope(ModuleItemMap { def_map, module_id: DefMap::ROOT }));
592                 // FIXME: This adds as many module scopes as there are blocks, but resolving in each
593                 // already traverses all parents, so this is O(n²). I think we could only store the
594                 // innermost module scope instead?
595             }
596         }
597 
598         let start = self.scopes.len();
599         let innermost_scope = self.scopes().next();
600         match innermost_scope {
601             Some(&Scope::ExprScope(ExprScope { scope_id, ref expr_scopes, owner })) => {
602                 let expr_scopes = expr_scopes.clone();
603                 let scope_chain = expr_scopes
604                     .scope_chain(expr_scopes.scope_for(expr_id))
605                     .take_while(|&it| it != scope_id);
606                 for scope_id in scope_chain {
607                     append_expr_scope(db, self, owner, &expr_scopes, scope_id);
608                 }
609             }
610             _ => {
611                 let expr_scopes = db.expr_scopes(owner);
612                 let scope_chain = expr_scopes.scope_chain(expr_scopes.scope_for(expr_id));
613 
614                 for scope_id in scope_chain {
615                     append_expr_scope(db, self, owner, &expr_scopes, scope_id);
616                 }
617             }
618         }
619         self.scopes[start..].reverse();
620         UpdateGuard(start)
621     }
622 
reset_to_guard(&mut self, UpdateGuard(start): UpdateGuard)623     pub fn reset_to_guard(&mut self, UpdateGuard(start): UpdateGuard) {
624         self.scopes.truncate(start);
625     }
626 }
627 
628 pub struct UpdateGuard(usize);
629 
630 impl Resolver {
scopes(&self) -> impl Iterator<Item = &Scope>631     fn scopes(&self) -> impl Iterator<Item = &Scope> {
632         self.scopes.iter().rev()
633     }
634 
resolve_module_path( &self, db: &dyn DefDatabase, path: &ModPath, shadow: BuiltinShadowMode, ) -> PerNs635     fn resolve_module_path(
636         &self,
637         db: &dyn DefDatabase,
638         path: &ModPath,
639         shadow: BuiltinShadowMode,
640     ) -> PerNs {
641         let (item_map, module) = self.item_scope();
642         // This method resolves `path` just like import paths, so no expected macro subns is given.
643         let (module_res, segment_index) = item_map.resolve_path(db, module, path, shadow, None);
644         if segment_index.is_some() {
645             return PerNs::none();
646         }
647         module_res
648     }
649 
650     /// The innermost block scope that contains items or the module scope that contains this resolver.
item_scope(&self) -> (&DefMap, LocalModuleId)651     fn item_scope(&self) -> (&DefMap, LocalModuleId) {
652         self.scopes()
653             .find_map(|scope| match scope {
654                 Scope::BlockScope(m) => Some((&*m.def_map, m.module_id)),
655                 _ => None,
656             })
657             .unwrap_or((&self.module_scope.def_map, self.module_scope.module_id))
658     }
659 }
660 
661 #[derive(Copy, Clone, Debug, PartialEq, Eq)]
662 pub enum ScopeDef {
663     ModuleDef(ModuleDefId),
664     Unknown,
665     ImplSelfType(ImplId),
666     AdtSelfType(AdtId),
667     GenericParam(GenericParamId),
668     Local(BindingId),
669     Label(LabelId),
670 }
671 
672 impl Scope {
process_names(&self, acc: &mut ScopeNames, db: &dyn DefDatabase)673     fn process_names(&self, acc: &mut ScopeNames, db: &dyn DefDatabase) {
674         match self {
675             Scope::BlockScope(m) => {
676                 m.def_map[m.module_id].scope.entries().for_each(|(name, def)| {
677                     acc.add_per_ns(name, def);
678                 });
679                 m.def_map[m.module_id].scope.legacy_macros().for_each(|(name, macs)| {
680                     macs.iter().for_each(|&mac| {
681                         acc.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)));
682                     })
683                 });
684             }
685             Scope::GenericParams { params, def: parent } => {
686                 let parent = *parent;
687                 for (local_id, param) in params.type_or_consts.iter() {
688                     if let Some(name) = &param.name() {
689                         let id = TypeOrConstParamId { parent, local_id };
690                         let data = &db.generic_params(parent).type_or_consts[local_id];
691                         acc.add(
692                             name,
693                             ScopeDef::GenericParam(match data {
694                                 TypeOrConstParamData::TypeParamData(_) => {
695                                     GenericParamId::TypeParamId(TypeParamId::from_unchecked(id))
696                                 }
697                                 TypeOrConstParamData::ConstParamData(_) => {
698                                     GenericParamId::ConstParamId(ConstParamId::from_unchecked(id))
699                                 }
700                             }),
701                         );
702                     }
703                 }
704                 for (local_id, param) in params.lifetimes.iter() {
705                     let id = LifetimeParamId { parent, local_id };
706                     acc.add(&param.name, ScopeDef::GenericParam(id.into()))
707                 }
708             }
709             Scope::ImplDefScope(i) => {
710                 acc.add(&name![Self], ScopeDef::ImplSelfType(*i));
711             }
712             Scope::AdtScope(i) => {
713                 acc.add(&name![Self], ScopeDef::AdtSelfType(*i));
714             }
715             Scope::ExprScope(scope) => {
716                 if let Some((label, name)) = scope.expr_scopes.label(scope.scope_id) {
717                     acc.add(&name, ScopeDef::Label(label))
718                 }
719                 scope.expr_scopes.entries(scope.scope_id).iter().for_each(|e| {
720                     acc.add_local(e.name(), e.binding());
721                 });
722             }
723         }
724     }
725 }
726 
resolver_for_expr(db: &dyn DefDatabase, owner: DefWithBodyId, expr_id: ExprId) -> Resolver727 pub fn resolver_for_expr(db: &dyn DefDatabase, owner: DefWithBodyId, expr_id: ExprId) -> Resolver {
728     let r = owner.resolver(db);
729     let scopes = db.expr_scopes(owner);
730     let scope_id = scopes.scope_for(expr_id);
731     resolver_for_scope_(db, scopes, scope_id, r, owner)
732 }
733 
resolver_for_scope( db: &dyn DefDatabase, owner: DefWithBodyId, scope_id: Option<ScopeId>, ) -> Resolver734 pub fn resolver_for_scope(
735     db: &dyn DefDatabase,
736     owner: DefWithBodyId,
737     scope_id: Option<ScopeId>,
738 ) -> Resolver {
739     let r = owner.resolver(db);
740     let scopes = db.expr_scopes(owner);
741     resolver_for_scope_(db, scopes, scope_id, r, owner)
742 }
743 
resolver_for_scope_( db: &dyn DefDatabase, scopes: Arc<ExprScopes>, scope_id: Option<ScopeId>, mut r: Resolver, owner: DefWithBodyId, ) -> Resolver744 fn resolver_for_scope_(
745     db: &dyn DefDatabase,
746     scopes: Arc<ExprScopes>,
747     scope_id: Option<ScopeId>,
748     mut r: Resolver,
749     owner: DefWithBodyId,
750 ) -> Resolver {
751     let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
752     r.scopes.reserve(scope_chain.len());
753 
754     for scope in scope_chain.into_iter().rev() {
755         if let Some(block) = scopes.block(scope) {
756             let def_map = db.block_def_map(block);
757             r = r.push_block_scope(def_map, DefMap::ROOT);
758             // FIXME: This adds as many module scopes as there are blocks, but resolving in each
759             // already traverses all parents, so this is O(n²). I think we could only store the
760             // innermost module scope instead?
761         }
762 
763         r = r.push_expr_scope(owner, Arc::clone(&scopes), scope);
764     }
765     r
766 }
767 
768 impl Resolver {
push_scope(mut self, scope: Scope) -> Resolver769     fn push_scope(mut self, scope: Scope) -> Resolver {
770         self.scopes.push(scope);
771         self
772     }
773 
push_generic_params_scope(self, db: &dyn DefDatabase, def: GenericDefId) -> Resolver774     fn push_generic_params_scope(self, db: &dyn DefDatabase, def: GenericDefId) -> Resolver {
775         let params = db.generic_params(def);
776         self.push_scope(Scope::GenericParams { def, params })
777     }
778 
push_impl_def_scope(self, impl_def: ImplId) -> Resolver779     fn push_impl_def_scope(self, impl_def: ImplId) -> Resolver {
780         self.push_scope(Scope::ImplDefScope(impl_def))
781     }
782 
push_block_scope(self, def_map: Arc<DefMap>, module_id: LocalModuleId) -> Resolver783     fn push_block_scope(self, def_map: Arc<DefMap>, module_id: LocalModuleId) -> Resolver {
784         self.push_scope(Scope::BlockScope(ModuleItemMap { def_map, module_id }))
785     }
786 
push_expr_scope( self, owner: DefWithBodyId, expr_scopes: Arc<ExprScopes>, scope_id: ScopeId, ) -> Resolver787     fn push_expr_scope(
788         self,
789         owner: DefWithBodyId,
790         expr_scopes: Arc<ExprScopes>,
791         scope_id: ScopeId,
792     ) -> Resolver {
793         self.push_scope(Scope::ExprScope(ExprScope { owner, expr_scopes, scope_id }))
794     }
795 }
796 
797 impl ModuleItemMap {
resolve_path_in_value_ns( &self, db: &dyn DefDatabase, path: &ModPath, ) -> Option<ResolveValueResult>798     fn resolve_path_in_value_ns(
799         &self,
800         db: &dyn DefDatabase,
801         path: &ModPath,
802     ) -> Option<ResolveValueResult> {
803         let (module_def, idx) =
804             self.def_map.resolve_path_locally(db, self.module_id, path, BuiltinShadowMode::Other);
805         match idx {
806             None => {
807                 let value = to_value_ns(module_def)?;
808                 Some(ResolveValueResult::ValueNs(value))
809             }
810             Some(idx) => {
811                 let ty = match module_def.take_types()? {
812                     ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
813                     ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
814                     ModuleDefId::TraitAliasId(it) => TypeNs::TraitAliasId(it),
815                     ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
816                     ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
817 
818                     ModuleDefId::ModuleId(_)
819                     | ModuleDefId::FunctionId(_)
820                     | ModuleDefId::EnumVariantId(_)
821                     | ModuleDefId::ConstId(_)
822                     | ModuleDefId::MacroId(_)
823                     | ModuleDefId::StaticId(_) => return None,
824                 };
825                 Some(ResolveValueResult::Partial(ty, idx))
826             }
827         }
828     }
829 
resolve_path_in_type_ns( &self, db: &dyn DefDatabase, path: &ModPath, ) -> Option<(TypeNs, Option<usize>)>830     fn resolve_path_in_type_ns(
831         &self,
832         db: &dyn DefDatabase,
833         path: &ModPath,
834     ) -> Option<(TypeNs, Option<usize>)> {
835         let (module_def, idx) =
836             self.def_map.resolve_path_locally(db, self.module_id, path, BuiltinShadowMode::Other);
837         let res = to_type_ns(module_def)?;
838         Some((res, idx))
839     }
840 }
841 
to_value_ns(per_ns: PerNs) -> Option<ValueNs>842 fn to_value_ns(per_ns: PerNs) -> Option<ValueNs> {
843     let res = match per_ns.take_values()? {
844         ModuleDefId::FunctionId(it) => ValueNs::FunctionId(it),
845         ModuleDefId::AdtId(AdtId::StructId(it)) => ValueNs::StructId(it),
846         ModuleDefId::EnumVariantId(it) => ValueNs::EnumVariantId(it),
847         ModuleDefId::ConstId(it) => ValueNs::ConstId(it),
848         ModuleDefId::StaticId(it) => ValueNs::StaticId(it),
849 
850         ModuleDefId::AdtId(AdtId::EnumId(_) | AdtId::UnionId(_))
851         | ModuleDefId::TraitId(_)
852         | ModuleDefId::TraitAliasId(_)
853         | ModuleDefId::TypeAliasId(_)
854         | ModuleDefId::BuiltinType(_)
855         | ModuleDefId::MacroId(_)
856         | ModuleDefId::ModuleId(_) => return None,
857     };
858     Some(res)
859 }
860 
to_type_ns(per_ns: PerNs) -> Option<TypeNs>861 fn to_type_ns(per_ns: PerNs) -> Option<TypeNs> {
862     let res = match per_ns.take_types()? {
863         ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
864         ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
865 
866         ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
867         ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
868 
869         ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
870         ModuleDefId::TraitAliasId(it) => TypeNs::TraitAliasId(it),
871 
872         ModuleDefId::FunctionId(_)
873         | ModuleDefId::ConstId(_)
874         | ModuleDefId::MacroId(_)
875         | ModuleDefId::StaticId(_)
876         | ModuleDefId::ModuleId(_) => return None,
877     };
878     Some(res)
879 }
880 
881 type FxIndexMap<K, V> = IndexMap<K, V, BuildHasherDefault<rustc_hash::FxHasher>>;
882 #[derive(Default)]
883 struct ScopeNames {
884     map: FxIndexMap<Name, SmallVec<[ScopeDef; 1]>>,
885 }
886 
887 impl ScopeNames {
add(&mut self, name: &Name, def: ScopeDef)888     fn add(&mut self, name: &Name, def: ScopeDef) {
889         let set = self.map.entry(name.clone()).or_default();
890         if !set.contains(&def) {
891             set.push(def)
892         }
893     }
add_per_ns(&mut self, name: &Name, def: PerNs)894     fn add_per_ns(&mut self, name: &Name, def: PerNs) {
895         if let &Some((ty, _)) = &def.types {
896             self.add(name, ScopeDef::ModuleDef(ty))
897         }
898         if let &Some((def, _)) = &def.values {
899             self.add(name, ScopeDef::ModuleDef(def))
900         }
901         if let &Some((mac, _)) = &def.macros {
902             self.add(name, ScopeDef::ModuleDef(ModuleDefId::MacroId(mac)))
903         }
904         if def.is_none() {
905             self.add(name, ScopeDef::Unknown)
906         }
907     }
add_local(&mut self, name: &Name, binding: BindingId)908     fn add_local(&mut self, name: &Name, binding: BindingId) {
909         let set = self.map.entry(name.clone()).or_default();
910         // XXX: hack, account for local (and only local) shadowing.
911         //
912         // This should be somewhat more principled and take namespaces into
913         // accounts, but, alas, scoping rules are a hoax. `str` type and `str`
914         // module can be both available in the same scope.
915         if set.iter().any(|it| matches!(it, &ScopeDef::Local(_))) {
916             cov_mark::hit!(shadowing_shows_single_completion);
917             return;
918         }
919         set.push(ScopeDef::Local(binding))
920     }
921 }
922 
923 pub trait HasResolver: Copy {
924     /// Builds a resolver for type references inside this def.
resolver(self, db: &dyn DefDatabase) -> Resolver925     fn resolver(self, db: &dyn DefDatabase) -> Resolver;
926 }
927 
928 impl HasResolver for ModuleId {
resolver(self, db: &dyn DefDatabase) -> Resolver929     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
930         let mut def_map = self.def_map(db);
931         let mut modules: SmallVec<[_; 1]> = smallvec![];
932         let mut module_id = self.local_id;
933         while let Some(parent) = def_map.parent() {
934             modules.push((def_map, module_id));
935             def_map = parent.def_map(db);
936             module_id = parent.local_id;
937         }
938         let mut resolver = Resolver {
939             scopes: Vec::with_capacity(modules.len()),
940             module_scope: ModuleItemMap { def_map, module_id },
941         };
942         for (def_map, module) in modules.into_iter().rev() {
943             resolver = resolver.push_block_scope(def_map, module);
944         }
945         resolver
946     }
947 }
948 
949 impl HasResolver for CrateRootModuleId {
resolver(self, db: &dyn DefDatabase) -> Resolver950     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
951         Resolver {
952             scopes: vec![],
953             module_scope: ModuleItemMap { def_map: self.def_map(db), module_id: DefMap::ROOT },
954         }
955     }
956 }
957 
958 impl HasResolver for TraitId {
resolver(self, db: &dyn DefDatabase) -> Resolver959     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
960         self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
961     }
962 }
963 
964 impl HasResolver for TraitAliasId {
resolver(self, db: &dyn DefDatabase) -> Resolver965     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
966         self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
967     }
968 }
969 
970 impl<T: Into<AdtId> + Copy> HasResolver for T {
resolver(self, db: &dyn DefDatabase) -> Resolver971     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
972         let def = self.into();
973         def.module(db)
974             .resolver(db)
975             .push_generic_params_scope(db, def.into())
976             .push_scope(Scope::AdtScope(def))
977     }
978 }
979 
980 impl HasResolver for FunctionId {
resolver(self, db: &dyn DefDatabase) -> Resolver981     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
982         self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
983     }
984 }
985 
986 impl HasResolver for ConstId {
resolver(self, db: &dyn DefDatabase) -> Resolver987     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
988         self.lookup(db).container.resolver(db)
989     }
990 }
991 
992 impl HasResolver for StaticId {
resolver(self, db: &dyn DefDatabase) -> Resolver993     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
994         self.lookup(db).container.resolver(db)
995     }
996 }
997 
998 impl HasResolver for TypeAliasId {
resolver(self, db: &dyn DefDatabase) -> Resolver999     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1000         self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
1001     }
1002 }
1003 
1004 impl HasResolver for ImplId {
resolver(self, db: &dyn DefDatabase) -> Resolver1005     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1006         self.lookup(db)
1007             .container
1008             .resolver(db)
1009             .push_generic_params_scope(db, self.into())
1010             .push_impl_def_scope(self)
1011     }
1012 }
1013 
1014 impl HasResolver for ExternBlockId {
resolver(self, db: &dyn DefDatabase) -> Resolver1015     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1016         // Same as parent's
1017         self.lookup(db).container.resolver(db)
1018     }
1019 }
1020 
1021 impl HasResolver for TypeOwnerId {
resolver(self, db: &dyn DefDatabase) -> Resolver1022     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1023         match self {
1024             TypeOwnerId::FunctionId(x) => x.resolver(db),
1025             TypeOwnerId::StaticId(x) => x.resolver(db),
1026             TypeOwnerId::ConstId(x) => x.resolver(db),
1027             TypeOwnerId::InTypeConstId(x) => x.lookup(db).owner.resolver(db),
1028             TypeOwnerId::AdtId(x) => x.resolver(db),
1029             TypeOwnerId::TraitId(x) => x.resolver(db),
1030             TypeOwnerId::TraitAliasId(x) => x.resolver(db),
1031             TypeOwnerId::TypeAliasId(x) => x.resolver(db),
1032             TypeOwnerId::ImplId(x) => x.resolver(db),
1033             TypeOwnerId::EnumVariantId(x) => x.resolver(db),
1034             TypeOwnerId::ModuleId(x) => x.resolver(db),
1035         }
1036     }
1037 }
1038 
1039 impl HasResolver for DefWithBodyId {
resolver(self, db: &dyn DefDatabase) -> Resolver1040     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1041         match self {
1042             DefWithBodyId::ConstId(c) => c.resolver(db),
1043             DefWithBodyId::FunctionId(f) => f.resolver(db),
1044             DefWithBodyId::StaticId(s) => s.resolver(db),
1045             DefWithBodyId::VariantId(v) => v.parent.resolver(db),
1046             DefWithBodyId::InTypeConstId(c) => c.lookup(db).owner.resolver(db),
1047         }
1048     }
1049 }
1050 
1051 impl HasResolver for ItemContainerId {
resolver(self, db: &dyn DefDatabase) -> Resolver1052     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1053         match self {
1054             ItemContainerId::ModuleId(it) => it.resolver(db),
1055             ItemContainerId::TraitId(it) => it.resolver(db),
1056             ItemContainerId::ImplId(it) => it.resolver(db),
1057             ItemContainerId::ExternBlockId(it) => it.resolver(db),
1058         }
1059     }
1060 }
1061 
1062 impl HasResolver for GenericDefId {
resolver(self, db: &dyn DefDatabase) -> Resolver1063     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1064         match self {
1065             GenericDefId::FunctionId(inner) => inner.resolver(db),
1066             GenericDefId::AdtId(adt) => adt.resolver(db),
1067             GenericDefId::TraitId(inner) => inner.resolver(db),
1068             GenericDefId::TraitAliasId(inner) => inner.resolver(db),
1069             GenericDefId::TypeAliasId(inner) => inner.resolver(db),
1070             GenericDefId::ImplId(inner) => inner.resolver(db),
1071             GenericDefId::EnumVariantId(inner) => inner.parent.resolver(db),
1072             GenericDefId::ConstId(inner) => inner.resolver(db),
1073         }
1074     }
1075 }
1076 
1077 impl HasResolver for EnumVariantId {
resolver(self, db: &dyn DefDatabase) -> Resolver1078     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1079         self.parent.resolver(db)
1080     }
1081 }
1082 
1083 impl HasResolver for VariantId {
resolver(self, db: &dyn DefDatabase) -> Resolver1084     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1085         match self {
1086             VariantId::EnumVariantId(it) => it.parent.resolver(db),
1087             VariantId::StructId(it) => it.resolver(db),
1088             VariantId::UnionId(it) => it.resolver(db),
1089         }
1090     }
1091 }
1092 
1093 impl HasResolver for MacroId {
resolver(self, db: &dyn DefDatabase) -> Resolver1094     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1095         match self {
1096             MacroId::Macro2Id(it) => it.resolver(db),
1097             MacroId::MacroRulesId(it) => it.resolver(db),
1098             MacroId::ProcMacroId(it) => it.resolver(db),
1099         }
1100     }
1101 }
1102 
1103 impl HasResolver for Macro2Id {
resolver(self, db: &dyn DefDatabase) -> Resolver1104     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1105         self.lookup(db).container.resolver(db)
1106     }
1107 }
1108 
1109 impl HasResolver for ProcMacroId {
resolver(self, db: &dyn DefDatabase) -> Resolver1110     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1111         self.lookup(db).container.resolver(db)
1112     }
1113 }
1114 
1115 impl HasResolver for MacroRulesId {
resolver(self, db: &dyn DefDatabase) -> Resolver1116     fn resolver(self, db: &dyn DefDatabase) -> Resolver {
1117         self.lookup(db).container.resolver(db)
1118     }
1119 }
1120