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) = ¶m.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(¶m.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