diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2019-11-23 11:50:30 +0000 |
---|---|---|
committer | GitHub <[email protected]> | 2019-11-23 11:50:30 +0000 |
commit | 102f1984c662544d16441d437e5b0883502d49d1 (patch) | |
tree | 9fbf1b22c02412f15ad4ddb8fcbc405ce8d33795 /crates/ra_hir_def/src/resolver.rs | |
parent | ee300085c016a5b24ff61e0a1406857d4e638618 (diff) | |
parent | 32658a73b4c9078421a1cab92ec459bb5b7236f5 (diff) |
Merge #2372
2372: Note that debugging infra is broken r=matklad a=matklad
Co-authored-by: Aleksey Kladov <[email protected]>
Diffstat (limited to 'crates/ra_hir_def/src/resolver.rs')
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 60 |
1 files changed, 28 insertions, 32 deletions
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index 7b5c3ec06..48a836a20 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -11,7 +11,7 @@ use rustc_hash::FxHashSet; | |||
11 | use crate::{ | 11 | use crate::{ |
12 | body::scope::{ExprScopes, ScopeId}, | 12 | body::scope::{ExprScopes, ScopeId}, |
13 | builtin_type::BuiltinType, | 13 | builtin_type::BuiltinType, |
14 | db::DefDatabase2, | 14 | db::DefDatabase, |
15 | expr::{ExprId, PatId}, | 15 | expr::{ExprId, PatId}, |
16 | generics::GenericParams, | 16 | generics::GenericParams, |
17 | nameres::{per_ns::PerNs, CrateDefMap}, | 17 | nameres::{per_ns::PerNs, CrateDefMap}, |
@@ -87,7 +87,7 @@ pub enum ValueNs { | |||
87 | 87 | ||
88 | impl Resolver { | 88 | impl Resolver { |
89 | /// Resolve known trait from std, like `std::futures::Future` | 89 | /// Resolve known trait from std, like `std::futures::Future` |
90 | pub fn resolve_known_trait(&self, db: &impl DefDatabase2, path: &Path) -> Option<TraitId> { | 90 | pub fn resolve_known_trait(&self, db: &impl DefDatabase, path: &Path) -> Option<TraitId> { |
91 | let res = self.resolve_module_path(db, path).take_types()?; | 91 | let res = self.resolve_module_path(db, path).take_types()?; |
92 | match res { | 92 | match res { |
93 | ModuleDefId::TraitId(it) => Some(it), | 93 | ModuleDefId::TraitId(it) => Some(it), |
@@ -96,7 +96,7 @@ impl Resolver { | |||
96 | } | 96 | } |
97 | 97 | ||
98 | /// Resolve known struct from std, like `std::boxed::Box` | 98 | /// Resolve known struct from std, like `std::boxed::Box` |
99 | pub fn resolve_known_struct(&self, db: &impl DefDatabase2, path: &Path) -> Option<StructId> { | 99 | pub fn resolve_known_struct(&self, db: &impl DefDatabase, path: &Path) -> Option<StructId> { |
100 | let res = self.resolve_module_path(db, path).take_types()?; | 100 | let res = self.resolve_module_path(db, path).take_types()?; |
101 | match res { | 101 | match res { |
102 | ModuleDefId::AdtId(AdtId::StructId(it)) => Some(it), | 102 | ModuleDefId::AdtId(AdtId::StructId(it)) => Some(it), |
@@ -105,7 +105,7 @@ impl Resolver { | |||
105 | } | 105 | } |
106 | 106 | ||
107 | /// Resolve known enum from std, like `std::result::Result` | 107 | /// Resolve known enum from std, like `std::result::Result` |
108 | pub fn resolve_known_enum(&self, db: &impl DefDatabase2, path: &Path) -> Option<EnumId> { | 108 | pub fn resolve_known_enum(&self, db: &impl DefDatabase, path: &Path) -> Option<EnumId> { |
109 | let res = self.resolve_module_path(db, path).take_types()?; | 109 | let res = self.resolve_module_path(db, path).take_types()?; |
110 | match res { | 110 | match res { |
111 | ModuleDefId::AdtId(AdtId::EnumId(it)) => Some(it), | 111 | ModuleDefId::AdtId(AdtId::EnumId(it)) => Some(it), |
@@ -114,7 +114,7 @@ impl Resolver { | |||
114 | } | 114 | } |
115 | 115 | ||
116 | /// pub only for source-binder | 116 | /// pub only for source-binder |
117 | pub fn resolve_module_path(&self, db: &impl DefDatabase2, path: &Path) -> PerNs { | 117 | pub fn resolve_module_path(&self, db: &impl DefDatabase, path: &Path) -> PerNs { |
118 | let (item_map, module) = match self.module() { | 118 | let (item_map, module) = match self.module() { |
119 | Some(it) => it, | 119 | Some(it) => it, |
120 | None => return PerNs::none(), | 120 | None => return PerNs::none(), |
@@ -128,7 +128,7 @@ impl Resolver { | |||
128 | 128 | ||
129 | pub fn resolve_path_in_type_ns( | 129 | pub fn resolve_path_in_type_ns( |
130 | &self, | 130 | &self, |
131 | db: &impl DefDatabase2, | 131 | db: &impl DefDatabase, |
132 | path: &Path, | 132 | path: &Path, |
133 | ) -> Option<(TypeNs, Option<usize>)> { | 133 | ) -> Option<(TypeNs, Option<usize>)> { |
134 | if path.is_type_relative() { | 134 | if path.is_type_relative() { |
@@ -184,7 +184,7 @@ impl Resolver { | |||
184 | 184 | ||
185 | pub fn resolve_path_in_type_ns_fully( | 185 | pub fn resolve_path_in_type_ns_fully( |
186 | &self, | 186 | &self, |
187 | db: &impl DefDatabase2, | 187 | db: &impl DefDatabase, |
188 | path: &Path, | 188 | path: &Path, |
189 | ) -> Option<TypeNs> { | 189 | ) -> Option<TypeNs> { |
190 | let (res, unresolved) = self.resolve_path_in_type_ns(db, path)?; | 190 | let (res, unresolved) = self.resolve_path_in_type_ns(db, path)?; |
@@ -196,7 +196,7 @@ impl Resolver { | |||
196 | 196 | ||
197 | pub fn resolve_path_in_value_ns<'p>( | 197 | pub fn resolve_path_in_value_ns<'p>( |
198 | &self, | 198 | &self, |
199 | db: &impl DefDatabase2, | 199 | db: &impl DefDatabase, |
200 | path: &'p Path, | 200 | path: &'p Path, |
201 | ) -> Option<ResolveValueResult> { | 201 | ) -> Option<ResolveValueResult> { |
202 | if path.is_type_relative() { | 202 | if path.is_type_relative() { |
@@ -296,7 +296,7 @@ impl Resolver { | |||
296 | 296 | ||
297 | pub fn resolve_path_in_value_ns_fully( | 297 | pub fn resolve_path_in_value_ns_fully( |
298 | &self, | 298 | &self, |
299 | db: &impl DefDatabase2, | 299 | db: &impl DefDatabase, |
300 | path: &Path, | 300 | path: &Path, |
301 | ) -> Option<ValueNs> { | 301 | ) -> Option<ValueNs> { |
302 | match self.resolve_path_in_value_ns(db, path)? { | 302 | match self.resolve_path_in_value_ns(db, path)? { |
@@ -305,18 +305,18 @@ impl Resolver { | |||
305 | } | 305 | } |
306 | } | 306 | } |
307 | 307 | ||
308 | pub fn resolve_path_as_macro(&self, db: &impl DefDatabase2, path: &Path) -> Option<MacroDefId> { | 308 | pub fn resolve_path_as_macro(&self, db: &impl DefDatabase, path: &Path) -> Option<MacroDefId> { |
309 | let (item_map, module) = self.module()?; | 309 | let (item_map, module) = self.module()?; |
310 | item_map.resolve_path(db, module, path).0.get_macros() | 310 | item_map.resolve_path(db, module, path).0.get_macros() |
311 | } | 311 | } |
312 | 312 | ||
313 | pub fn process_all_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) { | 313 | pub fn process_all_names(&self, db: &impl DefDatabase, f: &mut dyn FnMut(Name, ScopeDef)) { |
314 | for scope in self.scopes.iter().rev() { | 314 | for scope in self.scopes.iter().rev() { |
315 | scope.process_names(db, f); | 315 | scope.process_names(db, f); |
316 | } | 316 | } |
317 | } | 317 | } |
318 | 318 | ||
319 | pub fn traits_in_scope(&self, db: &impl DefDatabase2) -> FxHashSet<TraitId> { | 319 | pub fn traits_in_scope(&self, db: &impl DefDatabase) -> FxHashSet<TraitId> { |
320 | let mut traits = FxHashSet::default(); | 320 | let mut traits = FxHashSet::default(); |
321 | for scope in &self.scopes { | 321 | for scope in &self.scopes { |
322 | if let Scope::ModuleScope(m) = scope { | 322 | if let Scope::ModuleScope(m) = scope { |
@@ -378,7 +378,7 @@ pub enum ScopeDef { | |||
378 | } | 378 | } |
379 | 379 | ||
380 | impl Scope { | 380 | impl Scope { |
381 | fn process_names(&self, db: &impl DefDatabase2, f: &mut dyn FnMut(Name, ScopeDef)) { | 381 | fn process_names(&self, db: &impl DefDatabase, f: &mut dyn FnMut(Name, ScopeDef)) { |
382 | match self { | 382 | match self { |
383 | Scope::ModuleScope(m) => { | 383 | Scope::ModuleScope(m) => { |
384 | // FIXME: should we provide `self` here? | 384 | // FIXME: should we provide `self` here? |
@@ -425,17 +425,13 @@ impl Scope { | |||
425 | } | 425 | } |
426 | 426 | ||
427 | // needs arbitrary_self_types to be a method... or maybe move to the def? | 427 | // needs arbitrary_self_types to be a method... or maybe move to the def? |
428 | pub fn resolver_for_expr( | 428 | pub fn resolver_for_expr(db: &impl DefDatabase, owner: DefWithBodyId, expr_id: ExprId) -> Resolver { |
429 | db: &impl DefDatabase2, | ||
430 | owner: DefWithBodyId, | ||
431 | expr_id: ExprId, | ||
432 | ) -> Resolver { | ||
433 | let scopes = db.expr_scopes(owner); | 429 | let scopes = db.expr_scopes(owner); |
434 | resolver_for_scope(db, owner, scopes.scope_for(expr_id)) | 430 | resolver_for_scope(db, owner, scopes.scope_for(expr_id)) |
435 | } | 431 | } |
436 | 432 | ||
437 | pub fn resolver_for_scope( | 433 | pub fn resolver_for_scope( |
438 | db: &impl DefDatabase2, | 434 | db: &impl DefDatabase, |
439 | owner: DefWithBodyId, | 435 | owner: DefWithBodyId, |
440 | scope_id: Option<ScopeId>, | 436 | scope_id: Option<ScopeId>, |
441 | ) -> Resolver { | 437 | ) -> Resolver { |
@@ -454,7 +450,7 @@ impl Resolver { | |||
454 | self | 450 | self |
455 | } | 451 | } |
456 | 452 | ||
457 | fn push_generic_params_scope(self, db: &impl DefDatabase2, def: GenericDefId) -> Resolver { | 453 | fn push_generic_params_scope(self, db: &impl DefDatabase, def: GenericDefId) -> Resolver { |
458 | let params = db.generic_params(def); | 454 | let params = db.generic_params(def); |
459 | if params.params.is_empty() { | 455 | if params.params.is_empty() { |
460 | self | 456 | self |
@@ -487,24 +483,24 @@ impl Resolver { | |||
487 | 483 | ||
488 | pub trait HasResolver { | 484 | pub trait HasResolver { |
489 | /// Builds a resolver for type references inside this def. | 485 | /// Builds a resolver for type references inside this def. |
490 | fn resolver(self, db: &impl DefDatabase2) -> Resolver; | 486 | fn resolver(self, db: &impl DefDatabase) -> Resolver; |
491 | } | 487 | } |
492 | 488 | ||
493 | impl HasResolver for ModuleId { | 489 | impl HasResolver for ModuleId { |
494 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 490 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
495 | let def_map = db.crate_def_map(self.krate); | 491 | let def_map = db.crate_def_map(self.krate); |
496 | Resolver::default().push_module_scope(def_map, self.module_id) | 492 | Resolver::default().push_module_scope(def_map, self.module_id) |
497 | } | 493 | } |
498 | } | 494 | } |
499 | 495 | ||
500 | impl HasResolver for TraitId { | 496 | impl HasResolver for TraitId { |
501 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 497 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
502 | self.module(db).resolver(db).push_generic_params_scope(db, self.into()) | 498 | self.module(db).resolver(db).push_generic_params_scope(db, self.into()) |
503 | } | 499 | } |
504 | } | 500 | } |
505 | 501 | ||
506 | impl<T: Into<AdtId>> HasResolver for T { | 502 | impl<T: Into<AdtId>> HasResolver for T { |
507 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 503 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
508 | let def = self.into(); | 504 | let def = self.into(); |
509 | let module = match def { | 505 | let module = match def { |
510 | AdtId::StructId(it) => it.0.module(db), | 506 | AdtId::StructId(it) => it.0.module(db), |
@@ -520,13 +516,13 @@ impl<T: Into<AdtId>> HasResolver for T { | |||
520 | } | 516 | } |
521 | 517 | ||
522 | impl HasResolver for FunctionId { | 518 | impl HasResolver for FunctionId { |
523 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 519 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
524 | self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into()) | 520 | self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into()) |
525 | } | 521 | } |
526 | } | 522 | } |
527 | 523 | ||
528 | impl HasResolver for DefWithBodyId { | 524 | impl HasResolver for DefWithBodyId { |
529 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 525 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
530 | match self { | 526 | match self { |
531 | DefWithBodyId::ConstId(c) => c.resolver(db), | 527 | DefWithBodyId::ConstId(c) => c.resolver(db), |
532 | DefWithBodyId::FunctionId(f) => f.resolver(db), | 528 | DefWithBodyId::FunctionId(f) => f.resolver(db), |
@@ -536,25 +532,25 @@ impl HasResolver for DefWithBodyId { | |||
536 | } | 532 | } |
537 | 533 | ||
538 | impl HasResolver for ConstId { | 534 | impl HasResolver for ConstId { |
539 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 535 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
540 | self.lookup(db).container.resolver(db) | 536 | self.lookup(db).container.resolver(db) |
541 | } | 537 | } |
542 | } | 538 | } |
543 | 539 | ||
544 | impl HasResolver for StaticId { | 540 | impl HasResolver for StaticId { |
545 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 541 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
546 | self.module(db).resolver(db) | 542 | self.module(db).resolver(db) |
547 | } | 543 | } |
548 | } | 544 | } |
549 | 545 | ||
550 | impl HasResolver for TypeAliasId { | 546 | impl HasResolver for TypeAliasId { |
551 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 547 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
552 | self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into()) | 548 | self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into()) |
553 | } | 549 | } |
554 | } | 550 | } |
555 | 551 | ||
556 | impl HasResolver for ContainerId { | 552 | impl HasResolver for ContainerId { |
557 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 553 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
558 | match self { | 554 | match self { |
559 | ContainerId::TraitId(it) => it.resolver(db), | 555 | ContainerId::TraitId(it) => it.resolver(db), |
560 | ContainerId::ImplId(it) => it.resolver(db), | 556 | ContainerId::ImplId(it) => it.resolver(db), |
@@ -564,7 +560,7 @@ impl HasResolver for ContainerId { | |||
564 | } | 560 | } |
565 | 561 | ||
566 | impl HasResolver for GenericDefId { | 562 | impl HasResolver for GenericDefId { |
567 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 563 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
568 | match self { | 564 | match self { |
569 | GenericDefId::FunctionId(inner) => inner.resolver(db), | 565 | GenericDefId::FunctionId(inner) => inner.resolver(db), |
570 | GenericDefId::AdtId(adt) => adt.resolver(db), | 566 | GenericDefId::AdtId(adt) => adt.resolver(db), |
@@ -578,7 +574,7 @@ impl HasResolver for GenericDefId { | |||
578 | } | 574 | } |
579 | 575 | ||
580 | impl HasResolver for ImplId { | 576 | impl HasResolver for ImplId { |
581 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | 577 | fn resolver(self, db: &impl DefDatabase) -> Resolver { |
582 | self.module(db) | 578 | self.module(db) |
583 | .resolver(db) | 579 | .resolver(db) |
584 | .push_generic_params_scope(db, self.into()) | 580 | .push_generic_params_scope(db, self.into()) |