aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_def/src/resolver.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-23 11:44:43 +0000
committerAleksey Kladov <[email protected]>2019-11-23 11:49:45 +0000
commitfc1e543f7abb69b8cab308410fa0a127950ee1c5 (patch)
tree5e30f4e18a0ea83215fd48776f372546dece9431 /crates/ra_hir_def/src/resolver.rs
parent958862093e83083b188427246323047a2c9e7bab (diff)
Get rid of DefDatabase2
Diffstat (limited to 'crates/ra_hir_def/src/resolver.rs')
-rw-r--r--crates/ra_hir_def/src/resolver.rs60
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;
11use crate::{ 11use 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
88impl Resolver { 88impl 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
380impl Scope { 380impl 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?
428pub fn resolver_for_expr( 428pub 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
437pub fn resolver_for_scope( 433pub 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
488pub trait HasResolver { 484pub 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
493impl HasResolver for ModuleId { 489impl 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
500impl HasResolver for TraitId { 496impl 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
506impl<T: Into<AdtId>> HasResolver for T { 502impl<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
522impl HasResolver for FunctionId { 518impl 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
528impl HasResolver for DefWithBodyId { 524impl 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
538impl HasResolver for ConstId { 534impl 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
544impl HasResolver for StaticId { 540impl 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
550impl HasResolver for TypeAliasId { 546impl 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
556impl HasResolver for ContainerId { 552impl 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
566impl HasResolver for GenericDefId { 562impl 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
580impl HasResolver for ImplId { 576impl 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())