diff options
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r-- | crates/hir/src/semantics.rs | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 1467d825d..d8beac98a 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs | |||
@@ -502,18 +502,19 @@ impl<'db> SemanticsImpl<'db> { | |||
502 | fn scope(&self, node: &SyntaxNode) -> SemanticsScope<'db> { | 502 | fn scope(&self, node: &SyntaxNode) -> SemanticsScope<'db> { |
503 | let node = self.find_file(node.clone()); | 503 | let node = self.find_file(node.clone()); |
504 | let resolver = self.analyze2(node.as_ref(), None).resolver; | 504 | let resolver = self.analyze2(node.as_ref(), None).resolver; |
505 | SemanticsScope { db: self.db, resolver } | 505 | SemanticsScope { db: self.db, file_id: node.file_id, resolver } |
506 | } | 506 | } |
507 | 507 | ||
508 | fn scope_at_offset(&self, node: &SyntaxNode, offset: TextSize) -> SemanticsScope<'db> { | 508 | fn scope_at_offset(&self, node: &SyntaxNode, offset: TextSize) -> SemanticsScope<'db> { |
509 | let node = self.find_file(node.clone()); | 509 | let node = self.find_file(node.clone()); |
510 | let resolver = self.analyze2(node.as_ref(), Some(offset)).resolver; | 510 | let resolver = self.analyze2(node.as_ref(), Some(offset)).resolver; |
511 | SemanticsScope { db: self.db, resolver } | 511 | SemanticsScope { db: self.db, file_id: node.file_id, resolver } |
512 | } | 512 | } |
513 | 513 | ||
514 | fn scope_for_def(&self, def: Trait) -> SemanticsScope<'db> { | 514 | fn scope_for_def(&self, def: Trait) -> SemanticsScope<'db> { |
515 | let file_id = self.db.lookup_intern_trait(def.id).id.file_id; | ||
515 | let resolver = def.id.resolver(self.db.upcast()); | 516 | let resolver = def.id.resolver(self.db.upcast()); |
516 | SemanticsScope { db: self.db, resolver } | 517 | SemanticsScope { db: self.db, file_id, resolver } |
517 | } | 518 | } |
518 | 519 | ||
519 | fn analyze(&self, node: &SyntaxNode) -> SourceAnalyzer { | 520 | fn analyze(&self, node: &SyntaxNode) -> SourceAnalyzer { |
@@ -709,6 +710,7 @@ fn find_root(node: &SyntaxNode) -> SyntaxNode { | |||
709 | #[derive(Debug)] | 710 | #[derive(Debug)] |
710 | pub struct SemanticsScope<'a> { | 711 | pub struct SemanticsScope<'a> { |
711 | pub db: &'a dyn HirDatabase, | 712 | pub db: &'a dyn HirDatabase, |
713 | file_id: HirFileId, | ||
712 | resolver: Resolver, | 714 | resolver: Resolver, |
713 | } | 715 | } |
714 | 716 | ||
@@ -752,6 +754,14 @@ impl<'a> SemanticsScope<'a> { | |||
752 | }) | 754 | }) |
753 | } | 755 | } |
754 | 756 | ||
757 | /// Resolve a path as-if it was written at the given scope. This is | ||
758 | /// necessary a heuristic, as it doesn't take hygiene into account. | ||
759 | pub fn resolve_hypothetical(&self, path: &ast::Path) -> Option<PathResolution> { | ||
760 | let hygiene = Hygiene::new(self.db.upcast(), self.file_id); | ||
761 | let path = Path::from_src(path.clone(), &hygiene)?; | ||
762 | self.resolve_hir_path(&path) | ||
763 | } | ||
764 | |||
755 | pub fn resolve_hir_path(&self, path: &Path) -> Option<PathResolution> { | 765 | pub fn resolve_hir_path(&self, path: &Path) -> Option<PathResolution> { |
756 | resolve_hir_path(self.db, &self.resolver, path) | 766 | resolve_hir_path(self.db, &self.resolver, path) |
757 | } | 767 | } |