aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src/semantics.rs
diff options
context:
space:
mode:
authorAleksey Kladov <[email protected]>2020-08-13 22:52:14 +0100
committerAleksey Kladov <[email protected]>2020-08-13 22:54:37 +0100
commit9664c57e60ec5662b3e8b063324d9ab7879d5570 (patch)
treea62d88ce37b64507b708f8cdc86c8ff3602a42bc /crates/hir/src/semantics.rs
parent9930ef253634465e2fe25b47b469e4c3bbcf6df1 (diff)
Make hygiene private to hir
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r--crates/hir/src/semantics.rs16
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)]
710pub struct SemanticsScope<'a> { 711pub 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 }