aboutsummaryrefslogtreecommitdiff
path: root/crates/hir_expand/src/ast_id_map.rs
diff options
context:
space:
mode:
authorJonas Schievink <[email protected]>2021-01-19 18:49:19 +0000
committerJonas Schievink <[email protected]>2021-01-19 18:49:19 +0000
commit52fe50a97b702f3e72600b19936f5f355d897d1e (patch)
tree175a7be6d7cb335834b73cb9aba6d5dc4bcb1adf /crates/hir_expand/src/ast_id_map.rs
parent02edb4b31be02fdab9c970cafb38439f472c0696 (diff)
Record `FileAstId`s for block expressiosn
Every block expression may contain inner items, so we need to be able to refer to any block expression and use it as a salsa key.
Diffstat (limited to 'crates/hir_expand/src/ast_id_map.rs')
-rw-r--r--crates/hir_expand/src/ast_id_map.rs20
1 files changed, 14 insertions, 6 deletions
diff --git a/crates/hir_expand/src/ast_id_map.rs b/crates/hir_expand/src/ast_id_map.rs
index 2401b0cc5..0991fffd8 100644
--- a/crates/hir_expand/src/ast_id_map.rs
+++ b/crates/hir_expand/src/ast_id_map.rs
@@ -13,7 +13,7 @@ use std::{
13}; 13};
14 14
15use la_arena::{Arena, Idx}; 15use la_arena::{Arena, Idx};
16use syntax::{ast, AstNode, AstPtr, SyntaxNode, SyntaxNodePtr}; 16use syntax::{ast, match_ast, AstNode, AstPtr, SyntaxNode, SyntaxNodePtr};
17 17
18/// `AstId` points to an AST node in a specific file. 18/// `AstId` points to an AST node in a specific file.
19pub struct FileAstId<N: AstNode> { 19pub struct FileAstId<N: AstNode> {
@@ -72,12 +72,20 @@ impl AstIdMap {
72 // get lower ids then children. That is, adding a new child does not 72 // get lower ids then children. That is, adding a new child does not
73 // change parent's id. This means that, say, adding a new function to a 73 // change parent's id. This means that, say, adding a new function to a
74 // trait does not change ids of top-level items, which helps caching. 74 // trait does not change ids of top-level items, which helps caching.
75 bdfs(node, |it| match ast::Item::cast(it) { 75 bdfs(node, |it| {
76 Some(module_item) => { 76 match_ast! {
77 res.alloc(module_item.syntax()); 77 match it {
78 true 78 ast::Item(module_item) => {
79 res.alloc(module_item.syntax());
80 true
81 },
82 ast::BlockExpr(block) => {
83 res.alloc(block.syntax());
84 true
85 },
86 _ => false,
87 }
79 } 88 }
80 None => false,
81 }); 89 });
82 res 90 res
83 } 91 }