diff options
Diffstat (limited to 'crates/ra_hir/src/resolve.rs')
-rw-r--r-- | crates/ra_hir/src/resolve.rs | 148 |
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 | }; |
14 | use hir_expand::name::{self, Name}; | 15 | use hir_expand::name::{self, Name}; |
15 | use rustc_hash::FxHashSet; | 16 | use rustc_hash::FxHashSet; |
16 | 17 | ||
17 | use crate::{ | 18 | use 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 | ||
518 | pub(crate) trait HasResolver { | 518 | pub(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 | ||
523 | impl HasResolver for Module { | 523 | impl 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 | ||
530 | impl HasResolver for Trait { | 530 | impl 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 | ||
536 | impl<T: Into<Adt>> HasResolver for T { | 536 | impl 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 | ||
546 | impl HasResolver for Function { | 551 | impl 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 | ||
555 | impl HasResolver for DefWithBody { | 557 | impl 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 | |||
563 | impl HasResolver for EnumId { | ||
564 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | ||
565 | AdtId::from(self).resolver(db) | ||
566 | } | ||
567 | } | ||
568 | |||
569 | impl 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 | |||
575 | impl 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 | ||
565 | impl HasResolver for Const { | 585 | impl 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 | ||
571 | impl HasResolver for Static { | 591 | impl 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 | ||
577 | impl HasResolver for TypeAlias { | 597 | impl 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 | ||
586 | impl HasResolver for Container { | 603 | impl 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 | ||
595 | impl HasResolver for GenericDef { | 613 | impl 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 | ||
609 | impl HasResolver for ImplBlock { | 627 | impl 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 | |||
636 | impl HasResolver for GenericDef { | ||
637 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | ||
638 | GenericDefId::from(self).resolver(db) | ||
639 | } | ||
640 | } | ||
641 | |||
642 | impl HasResolver for DefWithBody { | ||
643 | fn resolver(self, db: &impl DefDatabase2) -> Resolver { | ||
644 | DefWithBodyId::from(self).resolver(db) | ||
615 | } | 645 | } |
616 | } | 646 | } |