diff options
| author | David Barsky <me@davidbarsky.com> | 2025-06-09 18:18:49 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-09 18:18:49 +0000 |
| commit | e3ec14385f62ea80f40e7b131ca2ccb58a1cafcf (patch) | |
| tree | 0df2a0438e523bf669259414190fe8de9789c7cd /src/tools/rust-analyzer | |
| parent | f5bfde2303f7b6784224230a8cb8d2bcb743b9f8 (diff) | |
| parent | 50c2faad9213618e84ea322519c874dead7ecc65 (diff) | |
| download | rust-e3ec14385f62ea80f40e7b131ca2ccb58a1cafcf.tar.gz rust-e3ec14385f62ea80f40e7b131ca2ccb58a1cafcf.zip | |
Merge pull request #19930 from regexident/dyn-semantics-take-two
Make `Semantics<'db, DB>` support `Semantics<'db, dyn HirDatabase>`, take two
Diffstat (limited to 'src/tools/rust-analyzer')
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir/src/semantics.rs | 20 |
1 files changed, 18 insertions, 2 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/semantics.rs b/src/tools/rust-analyzer/crates/hir/src/semantics.rs index 4a2e8e379fb..953e2e7a025 100644 --- a/src/tools/rust-analyzer/crates/hir/src/semantics.rs +++ b/src/tools/rust-analyzer/crates/hir/src/semantics.rs @@ -159,13 +159,13 @@ pub struct SemanticsImpl<'db> { macro_call_cache: RefCell<FxHashMap<InFile<ast::MacroCall>, MacroCallId>>, } -impl<DB> fmt::Debug for Semantics<'_, DB> { +impl<DB: ?Sized> fmt::Debug for Semantics<'_, DB> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Semantics {{ ... }}") } } -impl<'db, DB> ops::Deref for Semantics<'db, DB> { +impl<'db, DB: ?Sized> ops::Deref for Semantics<'db, DB> { type Target = SemanticsImpl<'db>; fn deref(&self) -> &Self::Target { @@ -173,12 +173,28 @@ impl<'db, DB> ops::Deref for Semantics<'db, DB> { } } +// Note: while this variant of `Semantics<'_, _>` might seem unused, as it does not +// find actual use within the rust-analyzer project itself, it exists to enable the use +// within e.g. tracked salsa functions in third-party crates that build upon `ra_ap_hir`. +impl Semantics<'_, dyn HirDatabase> { + /// Creates an instance that's weakly coupled to its underlying database type. + pub fn new_dyn(db: &'_ dyn HirDatabase) -> Semantics<'_, dyn HirDatabase> { + let impl_ = SemanticsImpl::new(db); + Semantics { db, imp: impl_ } + } +} + impl<DB: HirDatabase> Semantics<'_, DB> { + /// Creates an instance that's strongly coupled to its underlying database type. pub fn new(db: &DB) -> Semantics<'_, DB> { let impl_ = SemanticsImpl::new(db); Semantics { db, imp: impl_ } } +} +// Note: We take `DB` as `?Sized` here in order to support type-erased +// use of `Semantics` via `Semantics<'_, dyn HirDatabase>`: +impl<DB: HirDatabase + ?Sized> Semantics<'_, DB> { pub fn hir_file_for(&self, syntax_node: &SyntaxNode) -> HirFileId { self.imp.find_file(syntax_node).file_id } |
