diff options
Diffstat (limited to 'crates/ra_hir_expand/src/db.rs')
-rw-r--r-- | crates/ra_hir_expand/src/db.rs | 23 |
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; | |||
9 | use ra_syntax::{AstNode, Parse, SyntaxKind::*, SyntaxNode}; | 9 | 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, 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 | ||
71 | pub(crate) fn ast_id_map(db: &dyn AstDatabase, file_id: HirFileId) -> Arc<AstIdMap> { | 75 | pub(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, ¯o_arg.0).map_err(|err| format!("{:?}", err))?; | 144 | let tt = macro_rules.0.expand(db, lazy_id, ¯o_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( | |||
177 | fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { | 189 | fn 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 | ||