diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/hir_expand/src/db.rs | 11 | ||||
-rw-r--r-- | crates/hir_expand/src/input.rs | 31 |
2 files changed, 12 insertions, 30 deletions
diff --git a/crates/hir_expand/src/db.rs b/crates/hir_expand/src/db.rs index 9fa419fcf..c43d382ad 100644 --- a/crates/hir_expand/src/db.rs +++ b/crates/hir_expand/src/db.rs | |||
@@ -267,7 +267,16 @@ fn parse_macro_expansion( | |||
267 | 267 | ||
268 | fn macro_arg(db: &dyn AstDatabase, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { | 268 | fn macro_arg(db: &dyn AstDatabase, id: MacroCallId) -> Option<Arc<(tt::Subtree, mbe::TokenMap)>> { |
269 | let arg = db.macro_arg_text(id)?; | 269 | 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 | |||
271 | Some(Arc::new((tt, tmap))) | 280 | Some(Arc::new((tt, tmap))) |
272 | } | 281 | } |
273 | 282 | ||
diff --git a/crates/hir_expand/src/input.rs b/crates/hir_expand/src/input.rs index 860aa049b..112216859 100644 --- a/crates/hir_expand/src/input.rs +++ b/crates/hir_expand/src/input.rs | |||
@@ -1,9 +1,8 @@ | |||
1 | //! Macro input conditioning. | 1 | //! Macro input conditioning. |
2 | 2 | ||
3 | use parser::SyntaxKind; | ||
4 | use syntax::{ | 3 | use syntax::{ |
5 | ast::{self, AttrsOwner}, | 4 | ast::{self, AttrsOwner}, |
6 | AstNode, SyntaxElement, SyntaxNode, | 5 | AstNode, SyntaxNode, |
7 | }; | 6 | }; |
8 | 7 | ||
9 | use crate::{ | 8 | use crate::{ |
@@ -20,33 +19,7 @@ pub(crate) fn process_macro_input( | |||
20 | let loc: MacroCallLoc = db.lookup_intern_macro(id); | 19 | let loc: MacroCallLoc = db.lookup_intern_macro(id); |
21 | 20 | ||
22 | match loc.kind { | 21 | match loc.kind { |
23 | MacroCallKind::FnLike { .. } => { | 22 | MacroCallKind::FnLike { .. } => node, |
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 | } | ||
50 | MacroCallKind::Derive { derive_attr_index, .. } => { | 23 | MacroCallKind::Derive { derive_attr_index, .. } => { |
51 | let item = match ast::Item::cast(node.clone()) { | 24 | let item = match ast::Item::cast(node.clone()) { |
52 | Some(item) => item, | 25 | Some(item) => item, |