diff options
Diffstat (limited to 'crates/ra_hir/src/source_id.rs')
-rw-r--r-- | crates/ra_hir/src/source_id.rs | 14 |
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); | |||
81 | impl_arena_id!(ErasedFileAstId); | 81 | impl_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)] |
85 | pub struct AstIdMap { | 85 | pub struct AstIdMap { |
86 | arena: Arena<ErasedFileAstId, SyntaxNodePtr>, | 86 | arena: Arena<ErasedFileAstId, SyntaxNodePtr>, |
87 | } | 87 | } |
88 | 88 | ||
89 | impl AstIdMap { | 89 | impl 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> { |