diff options
Diffstat (limited to 'crates/hir_expand')
-rw-r--r-- | crates/hir_expand/src/db.rs | 1 | ||||
-rw-r--r-- | crates/hir_expand/src/eager.rs | 19 |
2 files changed, 11 insertions, 9 deletions
diff --git a/crates/hir_expand/src/db.rs b/crates/hir_expand/src/db.rs index ca705ee9d..1e4b0cc19 100644 --- a/crates/hir_expand/src/db.rs +++ b/crates/hir_expand/src/db.rs | |||
@@ -440,6 +440,7 @@ fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { | |||
440 | MACRO_ITEMS | SOURCE_FILE => FragmentKind::Items, | 440 | MACRO_ITEMS | SOURCE_FILE => FragmentKind::Items, |
441 | MACRO_STMTS => FragmentKind::Statements, | 441 | MACRO_STMTS => FragmentKind::Statements, |
442 | MACRO_PAT => FragmentKind::Pattern, | 442 | MACRO_PAT => FragmentKind::Pattern, |
443 | MACRO_TYPE => FragmentKind::Type, | ||
443 | ITEM_LIST => FragmentKind::Items, | 444 | ITEM_LIST => FragmentKind::Items, |
444 | LET_STMT => { | 445 | LET_STMT => { |
445 | // FIXME: Handle LHS Pattern | 446 | // FIXME: Handle LHS Pattern |
diff --git a/crates/hir_expand/src/eager.rs b/crates/hir_expand/src/eager.rs index ef126e4ad..f12132f84 100644 --- a/crates/hir_expand/src/eager.rs +++ b/crates/hir_expand/src/eager.rs | |||
@@ -29,8 +29,9 @@ use base_db::CrateId; | |||
29 | use mbe::ExpandResult; | 29 | use mbe::ExpandResult; |
30 | use parser::FragmentKind; | 30 | use parser::FragmentKind; |
31 | use std::sync::Arc; | 31 | use std::sync::Arc; |
32 | use syntax::{algo::SyntaxRewriter, SyntaxNode}; | 32 | use syntax::{ted, SyntaxNode}; |
33 | 33 | ||
34 | #[derive(Debug)] | ||
34 | pub struct ErrorEmitted { | 35 | pub struct ErrorEmitted { |
35 | _private: (), | 36 | _private: (), |
36 | } | 37 | } |
@@ -191,10 +192,10 @@ fn eager_macro_recur( | |||
191 | macro_resolver: &dyn Fn(ast::Path) -> Option<MacroDefId>, | 192 | macro_resolver: &dyn Fn(ast::Path) -> Option<MacroDefId>, |
192 | mut diagnostic_sink: &mut dyn FnMut(mbe::ExpandError), | 193 | mut diagnostic_sink: &mut dyn FnMut(mbe::ExpandError), |
193 | ) -> Result<SyntaxNode, ErrorEmitted> { | 194 | ) -> Result<SyntaxNode, ErrorEmitted> { |
194 | let original = curr.value.clone(); | 195 | let original = curr.value.clone().clone_for_update(); |
195 | 196 | ||
196 | let children = curr.value.descendants().filter_map(ast::MacroCall::cast); | 197 | let children = original.descendants().filter_map(ast::MacroCall::cast); |
197 | let mut rewriter = SyntaxRewriter::default(); | 198 | let mut replacements = Vec::new(); |
198 | 199 | ||
199 | // Collect replacement | 200 | // Collect replacement |
200 | for child in children { | 201 | for child in children { |
@@ -213,6 +214,7 @@ fn eager_macro_recur( | |||
213 | .into(); | 214 | .into(); |
214 | db.parse_or_expand(id.as_file()) | 215 | db.parse_or_expand(id.as_file()) |
215 | .expect("successful macro expansion should be parseable") | 216 | .expect("successful macro expansion should be parseable") |
217 | .clone_for_update() | ||
216 | } | 218 | } |
217 | MacroDefKind::Declarative(_) | 219 | MacroDefKind::Declarative(_) |
218 | | MacroDefKind::BuiltIn(..) | 220 | | MacroDefKind::BuiltIn(..) |
@@ -226,15 +228,14 @@ fn eager_macro_recur( | |||
226 | } | 228 | } |
227 | }; | 229 | }; |
228 | 230 | ||
229 | // check if the whole original sytnax is replaced | 231 | // check if the whole original syntax is replaced |
230 | // Note that SyntaxRewriter cannot replace the root node itself | ||
231 | if child.syntax() == &original { | 232 | if child.syntax() == &original { |
232 | return Ok(insert); | 233 | return Ok(insert); |
233 | } | 234 | } |
234 | 235 | ||
235 | rewriter.replace(child.syntax(), &insert); | 236 | replacements.push((child, insert)); |
236 | } | 237 | } |
237 | 238 | ||
238 | let res = rewriter.rewrite(&original); | 239 | replacements.into_iter().rev().for_each(|(old, new)| ted::replace(old.syntax(), new)); |
239 | Ok(res) | 240 | Ok(original) |
240 | } | 241 | } |