aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir_expand/src/db.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir_expand/src/db.rs')
-rw-r--r--crates/ra_hir_expand/src/db.rs23
1 files changed, 19 insertions, 4 deletions
diff --git a/crates/ra_hir_expand/src/db.rs b/crates/ra_hir_expand/src/db.rs
index b695c5b8d..ac8256a84 100644
--- a/crates/ra_hir_expand/src/db.rs
+++ b/crates/ra_hir_expand/src/db.rs
@@ -9,8 +9,9 @@ use ra_prof::profile;
9use ra_syntax::{AstNode, Parse, SyntaxKind::*, SyntaxNode}; 9use 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, EagerCallLoc, EagerMacroId,
13 LazyMacroId, MacroCallId, MacroCallLoc, MacroDefId, MacroDefKind, MacroFile, 13 HirFileId, HirFileIdRepr, LazyMacroId, MacroCallId, MacroCallLoc, MacroDefId, MacroDefKind,
14 MacroFile,
14}; 15};
15 16
16#[derive(Debug, Clone, Eq, PartialEq)] 17#[derive(Debug, Clone, Eq, PartialEq)]
@@ -24,7 +25,7 @@ impl TokenExpander {
24 pub fn expand( 25 pub fn expand(
25 &self, 26 &self,
26 db: &dyn AstDatabase, 27 db: &dyn AstDatabase,
27 id: MacroCallId, 28 id: LazyMacroId,
28 tt: &tt::Subtree, 29 tt: &tt::Subtree,
29 ) -> Result<tt::Subtree, mbe::ExpandError> { 30 ) -> Result<tt::Subtree, mbe::ExpandError> {
30 match self { 31 match self {
@@ -66,6 +67,9 @@ pub trait AstDatabase: SourceDatabase {
66 fn parse_macro(&self, macro_file: MacroFile) 67 fn parse_macro(&self, macro_file: MacroFile)
67 -> Option<(Parse<SyntaxNode>, Arc<mbe::TokenMap>)>; 68 -> Option<(Parse<SyntaxNode>, Arc<mbe::TokenMap>)>;
68 fn macro_expand(&self, macro_call: MacroCallId) -> Result<Arc<tt::Subtree>, String>; 69 fn macro_expand(&self, macro_call: MacroCallId) -> Result<Arc<tt::Subtree>, String>;
70
71 #[salsa::interned]
72 fn intern_eager_expansion(&self, eager: EagerCallLoc) -> EagerMacroId;
69} 73}
70 74
71pub(crate) fn ast_id_map(db: &dyn AstDatabase, file_id: HirFileId) -> Arc<AstIdMap> { 75pub(crate) fn ast_id_map(db: &dyn AstDatabase, file_id: HirFileId) -> Arc<AstIdMap> {
@@ -101,6 +105,7 @@ pub(crate) fn macro_def(
101 MacroDefKind::BuiltInDerive(expander) => { 105 MacroDefKind::BuiltInDerive(expander) => {
102 Some(Arc::new((TokenExpander::BuiltinDerive(expander), mbe::TokenMap::default()))) 106 Some(Arc::new((TokenExpander::BuiltinDerive(expander), mbe::TokenMap::default())))
103 } 107 }
108 MacroDefKind::BuiltInEager(_expander) => None,
104 } 109 }
105} 110}
106 111
@@ -110,6 +115,10 @@ pub(crate) fn macro_arg(
110) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { 115) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> {
111 let id = match id { 116 let id = match id {
112 MacroCallId::LazyMacro(id) => id, 117 MacroCallId::LazyMacro(id) => id,
118 MacroCallId::EagerMacro(_id) => {
119 // FIXME: support macro_arg for eager macro
120 return None;
121 }
113 }; 122 };
114 let loc = db.lookup_intern_macro(id); 123 let loc = db.lookup_intern_macro(id);
115 let arg = loc.kind.arg(db)?; 124 let arg = loc.kind.arg(db)?;
@@ -123,13 +132,16 @@ pub(crate) fn macro_expand(
123) -> Result<Arc<tt::Subtree>, String> { 132) -> Result<Arc<tt::Subtree>, String> {
124 let lazy_id = match id { 133 let lazy_id = match id {
125 MacroCallId::LazyMacro(id) => id, 134 MacroCallId::LazyMacro(id) => id,
135 MacroCallId::EagerMacro(id) => {
136 return Ok(db.lookup_intern_eager_expansion(id).subtree);
137 }
126 }; 138 };
127 139
128 let loc = db.lookup_intern_macro(lazy_id); 140 let loc = db.lookup_intern_macro(lazy_id);
129 let macro_arg = db.macro_arg(id).ok_or("Fail to args in to tt::TokenTree")?; 141 let macro_arg = db.macro_arg(id).ok_or("Fail to args in to tt::TokenTree")?;
130 142
131 let macro_rules = db.macro_def(loc.def).ok_or("Fail to find macro definition")?; 143 let macro_rules = db.macro_def(loc.def).ok_or("Fail to find macro definition")?;
132 let tt = macro_rules.0.expand(db, id, &macro_arg.0).map_err(|err| format!("{:?}", err))?; 144 let tt = macro_rules.0.expand(db, lazy_id, &macro_arg.0).map_err(|err| format!("{:?}", err))?;
133 // Set a hard limit for the expanded tt 145 // Set a hard limit for the expanded tt
134 let count = tt.count(); 146 let count = tt.count();
135 if count > 65536 { 147 if count > 65536 {
@@ -177,6 +189,9 @@ pub(crate) fn parse_macro(
177fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { 189fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind {
178 let lazy_id = match id { 190 let lazy_id = match id {
179 MacroCallId::LazyMacro(id) => id, 191 MacroCallId::LazyMacro(id) => id,
192 MacroCallId::EagerMacro(id) => {
193 return db.lookup_intern_eager_expansion(id).fragment;
194 }
180 }; 195 };
181 let syn = db.lookup_intern_macro(lazy_id).kind.node(db).value; 196 let syn = db.lookup_intern_macro(lazy_id).kind.node(db).value;
182 197