aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/resolve.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2019-11-20 18:55:33 +0000
committerAleksey Kladov <[email protected]>2019-11-20 19:22:32 +0000
commit6241cf9a598b19cbd6c8c41c3743f8d56adafd2b (patch)
tree632e060e2db216d2e9bed0414a37578a35ee4a61 /crates/ra_hir/src/resolve.rs
parent7c275a7ed2253fc7bd8b46c685a754c4d4e9dee3 (diff)
Add HasResolver trait
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r--crates/ra_hir/src/resolve.rs131
1 files changed, 129 insertions, 2 deletions
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index e5e768be9..b8e1b4dad 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -15,8 +15,8 @@ use crate::{
15 db::{DefDatabase, HirDatabase}, 15 db::{DefDatabase, HirDatabase},
16 expr::{ExprScopes, PatId, ScopeId}, 16 expr::{ExprScopes, PatId, ScopeId},
17 generics::{GenericParams, HasGenericParams}, 17 generics::{GenericParams, HasGenericParams},
18 Adt, Const, DefWithBody, Enum, EnumVariant, Function, GenericDef, ImplBlock, Local, MacroDef, 18 Adt, Const, Container, DefWithBody, Enum, EnumVariant, Function, GenericDef, ImplBlock, Local,
19 ModuleDef, PerNs, Static, Struct, Trait, TypeAlias, 19 MacroDef, Module, ModuleDef, PerNs, Static, Struct, Trait, TypeAlias, Union,
20}; 20};
21 21
22#[derive(Debug, Clone, Default)] 22#[derive(Debug, Clone, Default)]
@@ -486,3 +486,130 @@ impl Scope {
486 } 486 }
487 } 487 }
488} 488}
489
490pub(crate) trait HasResolver {
491 /// Builds a resolver for type references inside this def.
492 fn resolver(self, db: &impl DefDatabase) -> Resolver;
493}
494
495impl HasResolver for Module {
496 fn resolver(self, db: &impl DefDatabase) -> Resolver {
497 let def_map = db.crate_def_map(self.id.krate);
498 Resolver::default().push_module_scope(def_map, self.id.module_id)
499 }
500}
501
502impl HasResolver for Trait {
503 fn resolver(self, db: &impl DefDatabase) -> Resolver {
504 self.module(db).resolver(db).push_generic_params_scope(db, self.into())
505 }
506}
507
508impl HasResolver for Struct {
509 fn resolver(self, db: &impl DefDatabase) -> Resolver {
510 self.module(db)
511 .resolver(db)
512 .push_generic_params_scope(db, self.into())
513 .push_scope(Scope::AdtScope(self.into()))
514 }
515}
516
517impl HasResolver for Union {
518 fn resolver(self, db: &impl DefDatabase) -> Resolver {
519 self.module(db)
520 .resolver(db)
521 .push_generic_params_scope(db, self.into())
522 .push_scope(Scope::AdtScope(self.into()))
523 }
524}
525
526impl HasResolver for Enum {
527 fn resolver(self, db: &impl DefDatabase) -> Resolver {
528 self.module(db)
529 .resolver(db)
530 .push_generic_params_scope(db, self.into())
531 .push_scope(Scope::AdtScope(self.into()))
532 }
533}
534
535impl HasResolver for Adt {
536 fn resolver(self, db: &impl DefDatabase) -> Resolver {
537 match self {
538 Adt::Struct(it) => it.resolver(db),
539 Adt::Union(it) => it.resolver(db),
540 Adt::Enum(it) => it.resolver(db),
541 }
542 }
543}
544
545impl HasResolver for Function {
546 fn resolver(self, db: &impl DefDatabase) -> Resolver {
547 self.container(db)
548 .map(|c| c.resolver(db))
549 .unwrap_or_else(|| self.module(db).resolver(db))
550 .push_generic_params_scope(db, self.into())
551 }
552}
553
554impl HasResolver for DefWithBody {
555 fn resolver(self, db: &impl DefDatabase) -> Resolver {
556 match self {
557 DefWithBody::Const(c) => c.resolver(db),
558 DefWithBody::Function(f) => f.resolver(db),
559 DefWithBody::Static(s) => s.resolver(db),
560 }
561 }
562}
563
564impl HasResolver for Const {
565 fn resolver(self, db: &impl DefDatabase) -> Resolver {
566 self.container(db).map(|c| c.resolver(db)).unwrap_or_else(|| self.module(db).resolver(db))
567 }
568}
569
570impl HasResolver for Static {
571 fn resolver(self, db: &impl DefDatabase) -> Resolver {
572 self.module(db).resolver(db)
573 }
574}
575
576impl HasResolver for TypeAlias {
577 fn resolver(self, db: &impl DefDatabase) -> Resolver {
578 self.container(db)
579 .map(|ib| ib.resolver(db))
580 .unwrap_or_else(|| self.module(db).resolver(db))
581 .push_generic_params_scope(db, self.into())
582 }
583}
584
585impl HasResolver for Container {
586 fn resolver(self, db: &impl DefDatabase) -> Resolver {
587 match self {
588 Container::Trait(trait_) => trait_.resolver(db),
589 Container::ImplBlock(impl_block) => impl_block.resolver(db),
590 }
591 }
592}
593
594impl HasResolver for GenericDef {
595 fn resolver(self, db: &impl DefDatabase) -> crate::Resolver {
596 match self {
597 GenericDef::Function(inner) => inner.resolver(db),
598 GenericDef::Adt(adt) => adt.resolver(db),
599 GenericDef::Trait(inner) => inner.resolver(db),
600 GenericDef::TypeAlias(inner) => inner.resolver(db),
601 GenericDef::ImplBlock(inner) => inner.resolver(db),
602 GenericDef::EnumVariant(inner) => inner.parent_enum(db).resolver(db),
603 GenericDef::Const(inner) => inner.resolver(db),
604 }
605 }
606}
607
608impl HasResolver for ImplBlock {
609 fn resolver(self, db: &impl DefDatabase) -> Resolver {
610 self.module(db)
611 .resolver(db)
612 .push_generic_params_scope(db, self.into())
613 .push_impl_block_scope(self)
614 }
615}