aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/resolve.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-21 11:13:49 +0000
committerAleksey Kladov <[email protected]>2019-11-21 11:13:49 +0000
commit061e6c77b5fdb63aa1cad63f1420a7fc810fa17d (patch)
treec24ffc3fe582c84ad78be3129aef472253b5d9f7 /crates/ra_hir/src/resolve.rs
parent621cf06156975f8bd75e35af46da034f72e11fad (diff)
Decouple
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r--crates/ra_hir/src/resolve.rs148
1 files changed, 89 insertions, 59 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index 770864ec5..ed9fa0491 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -8,18 +8,18 @@ use hir_def::{
8 generics::GenericParams, 8 generics::GenericParams,
9 nameres::CrateDefMap, 9 nameres::CrateDefMap,
10 path::{Path, PathKind}, 10 path::{Path, PathKind},
11 AdtId, ConstId, CrateModuleId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, GenericDefId, 11 AdtId, AstItemDef, ConstId, ContainerId, CrateModuleId, DefWithBodyId, EnumId, EnumVariantId,
12 ImplId, ModuleDefId, StaticId, StructId, TraitId, TypeAliasId, 12 FunctionId, GenericDefId, ImplId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId,
13 TypeAliasId, UnionId,
13}; 14};
14use hir_expand::name::{self, Name}; 15use hir_expand::name::{self, Name};
15use rustc_hash::FxHashSet; 16use rustc_hash::FxHashSet;
16 17
17use crate::{ 18use crate::{
18 code_model::Crate, 19 code_model::Crate,
19 db::{DefDatabase, HirDatabase}, 20 db::HirDatabase,
20 expr::{ExprScopes, PatId, ScopeId}, 21 expr::{ExprScopes, PatId, ScopeId},
21 Adt, Const, Container, DefWithBody, Function, GenericDef, ImplBlock, Local, MacroDef, Module, 22 Adt, DefWithBody, GenericDef, ImplBlock, Local, MacroDef, ModuleDef, PerNs,
22 ModuleDef, PerNs, Static, Trait, TypeAlias,
23}; 23};
24 24
25#[derive(Debug, Clone, Default)] 25#[derive(Debug, Clone, Default)]
@@ -506,7 +506,7 @@ pub(crate) fn resolver_for_scope(
506 owner: DefWithBodyId, 506 owner: DefWithBodyId,
507 scope_id: Option<ScopeId>, 507 scope_id: Option<ScopeId>,
508) -> Resolver { 508) -> Resolver {
509 let mut r = DefWithBody::from(owner).resolver(db); 509 let mut r = owner.resolver(db);
510 let scopes = db.expr_scopes(owner); 510 let scopes = db.expr_scopes(owner);
511 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>(); 511 let scope_chain = scopes.scope_chain(scope_id).collect::<Vec<_>>();
512 for scope in scope_chain.into_iter().rev() { 512 for scope in scope_chain.into_iter().rev() {
@@ -517,100 +517,130 @@ pub(crate) fn resolver_for_scope(
517 517
518pub(crate) trait HasResolver { 518pub(crate) trait HasResolver {
519 /// Builds a resolver for type references inside this def. 519 /// Builds a resolver for type references inside this def.
520 fn resolver(self, db: &impl DefDatabase) -> Resolver; 520 fn resolver(self, db: &impl DefDatabase2) -> Resolver;
521} 521}
522 522
523impl HasResolver for Module { 523impl HasResolver for ModuleId {
524 fn resolver(self, db: &impl DefDatabase) -> Resolver { 524 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
525 let def_map = db.crate_def_map(self.id.krate); 525 let def_map = db.crate_def_map(self.krate);
526 Resolver::default().push_module_scope(def_map, self.id.module_id) 526 Resolver::default().push_module_scope(def_map, self.module_id)
527 } 527 }
528} 528}
529 529
530impl HasResolver for Trait { 530impl HasResolver for TraitId {
531 fn resolver(self, db: &impl DefDatabase) -> Resolver { 531 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
532 self.module(db).resolver(db).push_generic_params_scope(db, self.id.into()) 532 self.module(db).resolver(db).push_generic_params_scope(db, self.into())
533 } 533 }
534} 534}
535 535
536impl<T: Into<Adt>> HasResolver for T { 536impl HasResolver for AdtId {
537 fn resolver(self, db: &impl DefDatabase) -> Resolver { 537 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
538 let def = self.into(); 538 let module = match self {
539 def.module(db) 539 AdtId::StructId(it) => it.0.module(db),
540 AdtId::UnionId(it) => it.0.module(db),
541 AdtId::EnumId(it) => it.module(db),
542 };
543
544 module
540 .resolver(db) 545 .resolver(db)
541 .push_generic_params_scope(db, def.into()) 546 .push_generic_params_scope(db, self.into())
542 .push_scope(Scope::AdtScope(def.into())) 547 .push_scope(Scope::AdtScope(self.into()))
543 } 548 }
544} 549}
545 550
546impl HasResolver for Function { 551impl HasResolver for StructId {
547 fn resolver(self, db: &impl DefDatabase) -> Resolver { 552 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
548 self.container(db) 553 AdtId::from(self).resolver(db)
549 .map(|c| c.resolver(db))
550 .unwrap_or_else(|| self.module(db).resolver(db))
551 .push_generic_params_scope(db, self.id.into())
552 } 554 }
553} 555}
554 556
555impl HasResolver for DefWithBody { 557impl HasResolver for UnionId {
556 fn resolver(self, db: &impl DefDatabase) -> Resolver { 558 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
559 AdtId::from(self).resolver(db)
560 }
561}
562
563impl HasResolver for EnumId {
564 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
565 AdtId::from(self).resolver(db)
566 }
567}
568
569impl HasResolver for FunctionId {
570 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
571 self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
572 }
573}
574
575impl HasResolver for DefWithBodyId {
576 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
557 match self { 577 match self {
558 DefWithBody::Const(c) => c.resolver(db), 578 DefWithBodyId::ConstId(c) => c.resolver(db),
559 DefWithBody::Function(f) => f.resolver(db), 579 DefWithBodyId::FunctionId(f) => f.resolver(db),
560 DefWithBody::Static(s) => s.resolver(db), 580 DefWithBodyId::StaticId(s) => s.resolver(db),
561 } 581 }
562 } 582 }
563} 583}
564 584
565impl HasResolver for Const { 585impl HasResolver for ConstId {
566 fn resolver(self, db: &impl DefDatabase) -> Resolver { 586 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
567 self.container(db).map(|c| c.resolver(db)).unwrap_or_else(|| self.module(db).resolver(db)) 587 self.lookup(db).container.resolver(db)
568 } 588 }
569} 589}
570 590
571impl HasResolver for Static { 591impl HasResolver for StaticId {
572 fn resolver(self, db: &impl DefDatabase) -> Resolver { 592 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
573 self.module(db).resolver(db) 593 self.module(db).resolver(db)
574 } 594 }
575} 595}
576 596
577impl HasResolver for TypeAlias { 597impl HasResolver for TypeAliasId {
578 fn resolver(self, db: &impl DefDatabase) -> Resolver { 598 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
579 self.container(db) 599 self.lookup(db).container.resolver(db).push_generic_params_scope(db, self.into())
580 .map(|ib| ib.resolver(db))
581 .unwrap_or_else(|| self.module(db).resolver(db))
582 .push_generic_params_scope(db, self.id.into())
583 } 600 }
584} 601}
585 602
586impl HasResolver for Container { 603impl HasResolver for ContainerId {
587 fn resolver(self, db: &impl DefDatabase) -> Resolver { 604 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
588 match self { 605 match self {
589 Container::Trait(trait_) => trait_.resolver(db), 606 ContainerId::TraitId(it) => it.resolver(db),
590 Container::ImplBlock(impl_block) => impl_block.resolver(db), 607 ContainerId::ImplId(it) => it.resolver(db),
608 ContainerId::ModuleId(it) => it.resolver(db),
591 } 609 }
592 } 610 }
593} 611}
594 612
595impl HasResolver for GenericDef { 613impl HasResolver for GenericDefId {
596 fn resolver(self, db: &impl DefDatabase) -> crate::Resolver { 614 fn resolver(self, db: &impl DefDatabase2) -> crate::Resolver {
597 match self { 615 match self {
598 GenericDef::Function(inner) => inner.resolver(db), 616 GenericDefId::FunctionId(inner) => inner.resolver(db),
599 GenericDef::Adt(adt) => adt.resolver(db), 617 GenericDefId::AdtId(adt) => adt.resolver(db),
600 GenericDef::Trait(inner) => inner.resolver(db), 618 GenericDefId::TraitId(inner) => inner.resolver(db),
601 GenericDef::TypeAlias(inner) => inner.resolver(db), 619 GenericDefId::TypeAliasId(inner) => inner.resolver(db),
602 GenericDef::ImplBlock(inner) => inner.resolver(db), 620 GenericDefId::ImplId(inner) => inner.resolver(db),
603 GenericDef::EnumVariant(inner) => inner.parent_enum(db).resolver(db), 621 GenericDefId::EnumVariantId(inner) => inner.parent.resolver(db),
604 GenericDef::Const(inner) => inner.resolver(db), 622 GenericDefId::ConstId(inner) => inner.resolver(db),
605 } 623 }
606 } 624 }
607} 625}
608 626
609impl HasResolver for ImplBlock { 627impl HasResolver for ImplId {
610 fn resolver(self, db: &impl DefDatabase) -> Resolver { 628 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
611 self.module(db) 629 self.module(db)
612 .resolver(db) 630 .resolver(db)
613 .push_generic_params_scope(db, self.id.into()) 631 .push_generic_params_scope(db, self.into())
614 .push_impl_block_scope(self.id) 632 .push_impl_block_scope(self)
633 }
634}
635
636impl HasResolver for GenericDef {
637 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
638 GenericDefId::from(self).resolver(db)
639 }
640}
641
642impl HasResolver for DefWithBody {
643 fn resolver(self, db: &impl DefDatabase2) -> Resolver {
644 DefWithBodyId::from(self).resolver(db)
615 } 645 }
616} 646}