diff options
author | Aleksey Kladov <[email protected]> | 2019-11-20 18:55:33 +0000 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2019-11-20 19:22:32 +0000 |
commit | 6241cf9a598b19cbd6c8c41c3743f8d56adafd2b (patch) | |
tree | 632e060e2db216d2e9bed0414a37578a35ee4a61 /crates/ra_hir/src/resolve.rs | |
parent | 7c275a7ed2253fc7bd8b46c685a754c4d4e9dee3 (diff) |
Add HasResolver trait
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r-- | crates/ra_hir/src/resolve.rs | 131 |
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 | |||
490 | pub(crate) trait HasResolver { | ||
491 | /// Builds a resolver for type references inside this def. | ||
492 | fn resolver(self, db: &impl DefDatabase) -> Resolver; | ||
493 | } | ||
494 | |||
495 | impl 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 | |||
502 | impl 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 | |||
508 | impl 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 | |||
517 | impl 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 | |||
526 | impl 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 | |||
535 | impl 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 | |||
545 | impl 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 | |||
554 | impl 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 | |||
564 | impl 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 | |||
570 | impl HasResolver for Static { | ||
571 | fn resolver(self, db: &impl DefDatabase) -> Resolver { | ||
572 | self.module(db).resolver(db) | ||
573 | } | ||
574 | } | ||
575 | |||
576 | impl 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 | |||
585 | impl 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 | |||
594 | impl 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 | |||
608 | impl 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 | } | ||