aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand/src/db.rs
diff options
context:
space:
mode:
authorEdwin Cheng <[email protected]>2020-02-17 11:32:13 +0000
committerEdwin Cheng <[email protected]>2020-03-03 17:21:14 +0000
commit0d554540730925c074693b43503e65476eadbd65 (patch)
tree8f51b96f608bbbf694d30c62214800f5f28a3841 /crates/ra_hir_expand/src/db.rs
parentcebb995d21e18990939287f55628237563583b27 (diff)
Add LazyMacroId
Diffstat (limited to 'crates/ra_hir_expand/src/db.rs')
-rw-r--r--crates/ra_hir_expand/src/db.rs20
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
11use crate::{ 11use 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
170fn to_fragment_kind(db: &dyn AstDatabase, macro_call_id: MacroCallId) -> FragmentKind { 177fn 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,