From 895a16265cd83522e1dc796dce1170f823e55c80 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Sun, 17 Apr 2022 13:46:00 +0200 Subject: [PATCH] Fix macro patterns not getting formatted properly --- crates/ide/src/expand_macro.rs | 43 ++++++++++++++++++++-------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/crates/ide/src/expand_macro.rs b/crates/ide/src/expand_macro.rs index 41984a55c6f..c93d0561a87 100644 --- a/crates/ide/src/expand_macro.rs +++ b/crates/ide/src/expand_macro.rs @@ -69,32 +69,34 @@ pub(crate) fn expand_macro(db: &RootDatabase, position: FilePosition) -> Option< // FIXME: Intermix attribute and bang! expansions // currently we only recursively expand one of the two types - let mut expanded = None; - let mut name = None; - let mut kind = SyntaxKind::ERROR; - for node in tok.ancestors() { + let mut anc = tok.ancestors(); + let (name, expanded, kind) = loop { + let node = anc.next()?; + if let Some(item) = ast::Item::cast(node.clone()) { if let Some(def) = sema.resolve_attr_macro_call(&item) { - name = Some(def.name(db).to_string()); - expanded = expand_attr_macro_recur(&sema, &item); - kind = SyntaxKind::MACRO_ITEMS; - break; + break ( + def.name(db).to_string(), + expand_attr_macro_recur(&sema, &item)?, + SyntaxKind::MACRO_ITEMS, + ); } } if let Some(mac) = ast::MacroCall::cast(node) { - name = Some(mac.path()?.segment()?.name_ref()?.to_string()); - expanded = expand_macro_recur(&sema, &mac); - kind = mac.syntax().parent().map(|it| it.kind()).unwrap_or(SyntaxKind::MACRO_ITEMS); - break; + break ( + mac.path()?.segment()?.name_ref()?.to_string(), + expand_macro_recur(&sema, &mac)?, + mac.syntax().parent().map(|it| it.kind()).unwrap_or(SyntaxKind::MACRO_ITEMS), + ); } - } + }; // FIXME: // macro expansion may lose all white space information // But we hope someday we can use ra_fmt for that - let expansion = format(db, kind, position.file_id, expanded?); + let expansion = format(db, kind, position.file_id, expanded); - Some(ExpandedMacro { name: name.unwrap_or_else(|| "???".to_owned()), expansion }) + Some(ExpandedMacro { name, expansion }) } fn expand_macro_recur( @@ -188,8 +190,15 @@ fn _format( let captured_stdout = String::from_utf8(output.stdout).ok()?; if output.status.success() && !captured_stdout.trim().is_empty() { - let foo = captured_stdout.replace(DOLLAR_CRATE_REPLACE, "$crate"); - let trim_indent = stdx::trim_indent(foo.trim().strip_prefix(prefix)?.strip_suffix(suffix)?); + let output = captured_stdout.replace(DOLLAR_CRATE_REPLACE, "$crate"); + let output = output.trim().strip_prefix(prefix)?; + let output = match kind { + SyntaxKind::MACRO_PAT => { + output.strip_suffix(suffix).or_else(|| output.strip_suffix(": u32,\n);"))? + } + _ => output.strip_suffix(suffix)?, + }; + let trim_indent = stdx::trim_indent(output); tracing::debug!("expand_macro: formatting succeeded"); Some(trim_indent) } else {