about summary refs log tree commit diff
diff options
context:
space:
mode:
authorShoyu Vanilla (Flint) <modulo641@gmail.com>2025-08-26 05:55:08 +0000
committerGitHub <noreply@github.com>2025-08-26 05:55:08 +0000
commit36d8f4e954d99a1dd68a0e9c85cda638da811f74 (patch)
treeee81036ab5633c741366a8c08d6305d550a76561
parent3b0352eaeb70c93573c3d239a4e001519454dcf6 (diff)
parent56bc9c35b9f625154f42f53f4b1e7843f02533ad (diff)
Merge pull request #20534 from A4-Tacks/tog-macro-delim-semicolon
Fix ExprStmt delete semicolon for toggle_macro_delimiter
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs36
1 files changed, 33 insertions, 3 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs
index 504e12f93df..bf1546986ed 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/toggle_macro_delimiter.rs
@@ -1,6 +1,6 @@
 use ide_db::assists::AssistId;
 use syntax::{
-    AstNode, T,
+    AstNode, SyntaxToken, T,
     ast::{self, syntax_factory::SyntaxFactory},
 };
 
@@ -39,7 +39,7 @@ pub(crate) fn toggle_macro_delimiter(acc: &mut Assists, ctx: &AssistContext<'_>)
     let makro = ctx.find_node_at_offset::<ast::MacroCall>()?;
 
     let cursor_offset = ctx.offset();
-    let semicolon = makro.semicolon_token();
+    let semicolon = macro_semicolon(&makro);
     let token_tree = makro.token_tree()?;
 
     let ltoken = token_tree.left_delimiter_token()?;
@@ -95,6 +95,14 @@ pub(crate) fn toggle_macro_delimiter(acc: &mut Assists, ctx: &AssistContext<'_>)
     )
 }
 
+fn macro_semicolon(makro: &ast::MacroCall) -> Option<SyntaxToken> {
+    makro.semicolon_token().or_else(|| {
+        let macro_expr = ast::MacroExpr::cast(makro.syntax().parent()?)?;
+        let expr_stmt = ast::ExprStmt::cast(macro_expr.syntax().parent()?)?;
+        expr_stmt.semicolon_token()
+    })
+}
+
 #[cfg(test)]
 mod tests {
     use crate::tests::{check_assist, check_assist_not_applicable};
@@ -119,7 +127,29 @@ macro_rules! sth {
 
 sth!{ }
             "#,
-        )
+        );
+
+        check_assist(
+            toggle_macro_delimiter,
+            r#"
+macro_rules! sth {
+    () => {};
+}
+
+fn foo() {
+    sth!$0( );
+}
+            "#,
+            r#"
+macro_rules! sth {
+    () => {};
+}
+
+fn foo() {
+    sth!{ }
+}
+            "#,
+        );
     }
 
     #[test]