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