aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/source_id.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/source_id.rs')
-rw-r--r--crates/ra_hir/src/source_id.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/crates/ra_hir/src/source_id.rs b/crates/ra_hir/src/source_id.rs
index 7a39be779..13f548eaf 100644
--- a/crates/ra_hir/src/source_id.rs
+++ b/crates/ra_hir/src/source_id.rs
@@ -81,15 +81,19 @@ pub struct ErasedFileAstId(RawId);
81impl_arena_id!(ErasedFileAstId); 81impl_arena_id!(ErasedFileAstId);
82 82
83/// Maps items' `SyntaxNode`s to `ErasedFileAstId`s and back. 83/// Maps items' `SyntaxNode`s to `ErasedFileAstId`s and back.
84#[derive(Debug, PartialEq, Eq)] 84#[derive(Debug, PartialEq, Eq, Default)]
85pub struct AstIdMap { 85pub struct AstIdMap {
86 arena: Arena<ErasedFileAstId, SyntaxNodePtr>, 86 arena: Arena<ErasedFileAstId, SyntaxNodePtr>,
87} 87}
88 88
89impl AstIdMap { 89impl AstIdMap {
90 pub(crate) fn ast_id_map_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc<AstIdMap> { 90 pub(crate) fn ast_id_map_query(db: &impl DefDatabase, file_id: HirFileId) -> Arc<AstIdMap> {
91 let source_file = db.hir_parse(file_id); 91 let map = if let Some(node) = db.parse_or_expand(file_id) {
92 Arc::new(AstIdMap::from_source(source_file.syntax())) 92 AstIdMap::from_source(&*node)
93 } else {
94 AstIdMap::default()
95 };
96 Arc::new(map)
93 } 97 }
94 98
95 pub(crate) fn file_item_query( 99 pub(crate) fn file_item_query(
@@ -97,8 +101,8 @@ impl AstIdMap {
97 file_id: HirFileId, 101 file_id: HirFileId,
98 ast_id: ErasedFileAstId, 102 ast_id: ErasedFileAstId,
99 ) -> TreeArc<SyntaxNode> { 103 ) -> TreeArc<SyntaxNode> {
100 let source_file = db.hir_parse(file_id); 104 let node = db.parse_or_expand(file_id).unwrap();
101 db.ast_id_map(file_id).arena[ast_id].to_node(source_file.syntax()).to_owned() 105 db.ast_id_map(file_id).arena[ast_id].to_node(&*node).to_owned()
102 } 106 }
103 107
104 pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> FileAstId<N> { 108 pub(crate) fn ast_id<N: AstNode>(&self, item: &N) -> FileAstId<N> {