Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/semantics.rs')
| -rw-r--r-- | crates/hir/src/semantics.rs | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 3d346b60ab..2e8342e4e0 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -25,9 +25,9 @@ use crate::{ db::HirDatabase, semantics::source_to_def::{ChildContainer, SourceToDefCache, SourceToDefCtx}, source_analyzer::{resolve_hir_path, SourceAnalyzer}, - Access, AssocItem, Callable, ConstParam, Crate, Field, Function, HirFileId, Impl, InFile, - Label, LifetimeParam, Local, MacroDef, Module, ModuleDef, Name, Path, ScopeDef, Trait, Type, - TypeAlias, TypeParam, VariantDef, + Access, AssocItem, Callable, ConstParam, Crate, Field, Function, HasSource, HirFileId, Impl, + InFile, Label, LifetimeParam, Local, MacroDef, Module, ModuleDef, Name, Path, ScopeDef, Trait, + Type, TypeAlias, TypeParam, VariantDef, }; #[derive(Debug, Clone, PartialEq, Eq)] @@ -190,6 +190,14 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { self.imp.descend_node_into_attributes(node) } + /// Search for a definition's source and cache its syntax tree + pub fn source<Def: HasSource>(&self, def: Def) -> Option<InFile<Def::Ast>> + where + Def::Ast: AstNode, + { + self.imp.source(def) + } + pub fn hir_file_for(&self, syntax_node: &SyntaxNode) -> HirFileId { self.imp.find_file(syntax_node.clone()).file_id } @@ -845,6 +853,15 @@ impl<'db> SemanticsImpl<'db> { SemanticsScope { db: self.db, file_id, resolver } } + fn source<Def: HasSource>(&self, def: Def) -> Option<InFile<Def::Ast>> + where + Def::Ast: AstNode, + { + let res = def.source(self.db)?; + self.cache(find_root(res.value.syntax()), res.file_id); + Some(res) + } + fn analyze(&self, node: &SyntaxNode) -> SourceAnalyzer { self.analyze_impl(node, None) } |