Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-expand/src/eager.rs')
| -rw-r--r-- | crates/hir-expand/src/eager.rs | 43 |
1 files changed, 27 insertions, 16 deletions
diff --git a/crates/hir-expand/src/eager.rs b/crates/hir-expand/src/eager.rs index 3ccc3ab1e1..e6f1edfb60 100644 --- a/crates/hir-expand/src/eager.rs +++ b/crates/hir-expand/src/eager.rs @@ -67,26 +67,37 @@ pub fn expand_eager_macro_input( })), kind: MacroCallKind::FnLike { ast_id: call_id, expand_to: ExpandTo::Expr }, }); - let arg_as_expr = match db.macro_arg_text(arg_id) { - Some(it) => it, - None => { - return Ok(ExpandResult { - value: None, - err: Some(ExpandError::other("invalid token tree")), - }) - } + + let ExpandResult { value: expanded_eager_input, err } = { + let arg_as_expr = match db.macro_arg_text(arg_id) { + Some(it) => it, + None => { + return Ok(ExpandResult { + value: None, + err: Some(ExpandError::other("invalid token tree")), + }) + } + }; + + eager_macro_recur( + db, + &Hygiene::new(db, macro_call.file_id), + InFile::new(arg_id.as_file(), SyntaxNode::new_root(arg_as_expr)), + krate, + resolver, + )? }; - let ExpandResult { value: expanded_eager_input, err } = eager_macro_recur( - db, - &Hygiene::new(db, macro_call.file_id), - InFile::new(arg_id.as_file(), SyntaxNode::new_root(arg_as_expr)), - krate, - resolver, - )?; + let Some(expanded_eager_input) = expanded_eager_input else { return Ok(ExpandResult { value: None, err }); }; - let (mut subtree, token_map) = mbe::syntax_node_to_token_tree(&expanded_eager_input); + // FIXME: This token map is pointless, it points into the expanded eager syntax node, but that + // node doesn't exist outside this function so we can't use this tokenmap. + // Ideally we'd need to patch the tokenmap of the pre-expanded input and then put that here + // or even better, forego expanding into a SyntaxNode altogether and instead construct a subtree + // in place! But that is kind of difficult. + let (mut subtree, _token_map) = mbe::syntax_node_to_token_tree(&expanded_eager_input); + let token_map = Default::default(); subtree.delimiter = crate::tt::Delimiter::unspecified(); let loc = MacroCallLoc { |