]> git.lizzy.rs Git - rust.git/blobdiff - crates/syntax/src/ast/edit_in_place.rs
generate match arms with todo!() as placeholder body
[rust.git] / crates / syntax / src / ast / edit_in_place.rs
index ca8103668b8c474fd76bf73636aceb94afff9f33..f7ee29d14cc06f9769fd582ca411e2e7d56a2188 100644 (file)
@@ -356,13 +356,17 @@ pub fn remove(&self) {
 impl ast::MatchArmList {
     pub fn add_arm(&self, arm: ast::MatchArm) {
         normalize_ws_between_braces(self.syntax());
+        let mut elements = Vec::new();
         let position = match self.arms().last() {
             Some(last_arm) => {
-                let curly = last_arm
+                let comma = last_arm
                     .syntax()
                     .siblings_with_tokens(Direction::Next)
                     .find(|it| it.kind() == T![,]);
-                Position::after(curly.unwrap_or_else(|| last_arm.syntax().clone().into()))
+                if needs_comma(&last_arm) && comma.is_none() {
+                    elements.push(make::token(SyntaxKind::COMMA).into());
+                }
+                Position::after(comma.unwrap_or_else(|| last_arm.syntax().clone().into()))
             }
             None => match self.l_curly_token() {
                 Some(it) => Position::after(it),
@@ -370,11 +374,16 @@ pub fn add_arm(&self, arm: ast::MatchArm) {
             },
         };
         let indent = IndentLevel::from_node(self.syntax()) + 1;
-        let elements = vec![
-            make::tokens::whitespace(&format!("\n{}", indent)).into(),
-            arm.syntax().clone().into(),
-        ];
+        elements.push(make::tokens::whitespace(&format!("\n{}", indent)).into());
+        elements.push(arm.syntax().clone().into());
+        if needs_comma(&arm) {
+            elements.push(make::token(SyntaxKind::COMMA).into());
+        }
         ted::insert_all(position, elements);
+
+        fn needs_comma(arm: &ast::MatchArm) -> bool {
+            arm.expr().map_or(false, |e| !e.is_block_like())
+        }
     }
 }