diff options
Diffstat (limited to 'crates/ra_hir_expand/src/db.rs')
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs index 70d969238..b695c5b8d 100644 --- a/crates/ra_hir_expand/src/db.rs +++ b/crates/ra_hir_expand/src/db.rs | |||
@@ -10,7 +10,7 @@ use ra_syntax::{AstNode, Parse, SyntaxKind::*, SyntaxNode}; | |||
10 | 10 | ||
11 | use crate::{ | 11 | use crate::{ |
12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, HirFileId, HirFileIdRepr, | 12 | ast_id_map::AstIdMap, BuiltinDeriveExpander, BuiltinFnLikeExpander, HirFileId, HirFileIdRepr, |
13 | MacroCallId, MacroCallLoc, MacroDefId, MacroDefKind, MacroFile, | 13 | LazyMacroId, MacroCallId, MacroCallLoc, MacroDefId, MacroDefKind, MacroFile, |
14 | }; | 14 | }; |
15 | 15 | ||
16 | #[derive(Debug, Clone, Eq, PartialEq)] | 16 | #[derive(Debug, Clone, Eq, PartialEq)] |
@@ -60,7 +60,7 @@ pub trait AstDatabase: SourceDatabase { | |||
60 | fn parse_or_expand(&self, file_id: HirFileId) -> Option<SyntaxNode>; | 60 | fn parse_or_expand(&self, file_id: HirFileId) -> Option<SyntaxNode>; |
61 | 61 | ||
62 | #[salsa::interned] | 62 | #[salsa::interned] |
63 | fn intern_macro(&self, macro_call: MacroCallLoc) -> MacroCallId; | 63 | fn intern_macro(&self, macro_call: MacroCallLoc) -> LazyMacroId; |
64 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; | 64 | fn macro_arg(&self, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>>; |
65 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; | 65 | fn macro_def(&self, id: MacroDefId) -> Option<Arc<(TokenExpander, mbe::TokenMap)>>; |
66 | fn parse_macro(&self, macro_file: MacroFile) | 66 | fn parse_macro(&self, macro_file: MacroFile) |
@@ -108,6 +108,9 @@ pub(crate) fn macro_arg( | |||
108 | db: &dyn AstDatabase, | 108 | db: &dyn AstDatabase, |
109 | id: MacroCallId, | 109 | id: MacroCallId, |
110 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | 110 | ) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { |
111 | let id = match id { | ||
112 | MacroCallId::LazyMacro(id) => id, | ||
113 | }; | ||
111 | let loc = db.lookup_intern_macro(id); | 114 | let loc = db.lookup_intern_macro(id); |
112 | let arg = loc.kind.arg(db)?; | 115 | let arg = loc.kind.arg(db)?; |
113 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&arg)?; | 116 | let (tt, tmap) = mbe::syntax_node_to_token_tree(&arg)?; |
@@ -118,7 +121,11 @@ pub(crate) fn macro_expand( | |||
118 | db: &dyn AstDatabase, | 121 | db: &dyn AstDatabase, |
119 | id: MacroCallId, | 122 | id: MacroCallId, |
120 | ) -> Result<Arc<tt::Subtree>, String> { | 123 | ) -> Result<Arc<tt::Subtree>, String> { |
121 | let loc = db.lookup_intern_macro(id); | 124 | let lazy_id = match id { |
125 | MacroCallId::LazyMacro(id) => id, | ||
126 | }; | ||
127 | |||
128 | let loc = db.lookup_intern_macro(lazy_id); | ||
122 | let macro_arg = db.macro_arg(id).ok_or("Fail to args in to tt::TokenTree")?; | 129 | let macro_arg = db.macro_arg(id).ok_or("Fail to args in to tt::TokenTree")?; |
123 | 130 | ||
124 | let macro_rules = db.macro_def(loc.def).ok_or("Fail to find macro definition")?; | 131 | let macro_rules = db.macro_def(loc.def).ok_or("Fail to find macro definition")?; |
@@ -167,8 +174,11 @@ pub(crate) fn parse_macro( | |||
167 | 174 | ||
168 | /// Given a `MacroCallId`, return what `FragmentKind` it belongs to. | 175 | /// Given a `MacroCallId`, return what `FragmentKind` it belongs to. |
169 | /// FIXME: Not completed | 176 | /// FIXME: Not completed |
170 | fn to_fragment_kind(db: &dyn AstDatabase, macro_call_id: MacroCallId) -> FragmentKind { | 177 | fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { |
171 | let syn = db.lookup_intern_macro(macro_call_id).kind.node(db).value; | 178 | let lazy_id = match id { |
179 | MacroCallId::LazyMacro(id) => id, | ||
180 | }; | ||
181 | let syn = db.lookup_intern_macro(lazy_id).kind.node(db).value; | ||
172 | 182 | ||
173 | let parent = match syn.parent() { | 183 | let parent = match syn.parent() { |
174 | Some(it) => it, | 184 | Some(it) => it, |