Skip to content

Commit 9a431c2

Browse files
Merge #8808
8808: fix: Fix fn proc macro input again r=jonas-schievink a=jonas-schievink #8806 broke the `TokenMap`, so none of the tokens in fn-like proc macro inputs could be related to the output (presumably this is because of the `clone_for_update`). This PR instead just sets `delimiter = None;` after the `TokenMap` and `Subtree` are already created. We should probably have more tests for fn-like proc macros, and consider making the behavior consistent with MBE (which *require* the delimiters to be present). bors r+ Co-authored-by: Jonas Schievink <[email protected]>
2 parents c6e2ba4 + e78221b commit 9a431c2

File tree

2 files changed

+12
-30
lines changed

2 files changed

+12
-30
lines changed

crates/hir_expand/src/db.rs

+10-1
Original file line numberDiff line numberDiff line change
@@ -267,7 +267,16 @@ fn parse_macro_expansion(
267267

268268
fn macro_arg(db: &dyn AstDatabase, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> {
269269
let arg = db.macro_arg_text(id)?;
270-
let (tt, tmap) = mbe::syntax_node_to_token_tree(&SyntaxNode::new_root(arg));
270+
let (mut tt, tmap) = mbe::syntax_node_to_token_tree(&SyntaxNode::new_root(arg));
271+
272+
if let MacroCallId::LazyMacro(id) = id {
273+
let loc: MacroCallLoc = db.lookup_intern_macro(id);
274+
if loc.def.is_proc_macro() {
275+
// proc macros expect their inputs without parentheses, MBEs expect it with them included
276+
tt.delimiter = None;
277+
}
278+
}
279+
271280
Some(Arc::new((tt, tmap)))
272281
}
273282

crates/hir_expand/src/input.rs

+2-29
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
//! Macro input conditioning.
22
3-
use parser::SyntaxKind;
43
use syntax::{
54
ast::{self, AttrsOwner},
6-
AstNode, SyntaxElement, SyntaxNode,
5+
AstNode, SyntaxNode,
76
};
87

98
use crate::{
@@ -20,33 +19,7 @@ pub(crate) fn process_macro_input(
2019
let loc: MacroCallLoc = db.lookup_intern_macro(id);
2120

2221
match loc.kind {
23-
MacroCallKind::FnLike { .. } => {
24-
if !loc.def.is_proc_macro() {
25-
// MBE macros expect the parentheses as part of their input.
26-
return node;
27-
}
28-
29-
// The input includes the `(` + `)` delimiter tokens, so remove them before passing this
30-
// to the macro.
31-
let node = node.clone_for_update();
32-
if let Some(SyntaxElement::Token(tkn)) = node.first_child_or_token() {
33-
if matches!(
34-
tkn.kind(),
35-
SyntaxKind::L_BRACK | SyntaxKind::L_PAREN | SyntaxKind::L_CURLY
36-
) {
37-
tkn.detach();
38-
}
39-
}
40-
if let Some(SyntaxElement::Token(tkn)) = node.last_child_or_token() {
41-
if matches!(
42-
tkn.kind(),
43-
SyntaxKind::R_BRACK | SyntaxKind::R_PAREN | SyntaxKind::R_CURLY
44-
) {
45-
tkn.detach();
46-
}
47-
}
48-
node
49-
}
22+
MacroCallKind::FnLike { .. } => node,
5023
MacroCallKind::Derive { derive_attr_index, .. } => {
5124
let item = match ast::Item::cast(node.clone()) {
5225
Some(item) => item,

0 commit comments

Comments
 (0)