generate match arms with todo!() as placeholder body

This commit is contained in:
Domantas Jadenkus 2021-05-24 21:53:42 +03:00
parent c139eff5b8
commit 22e5194396
2 changed files with 89 additions and 60 deletions

View File

@ -31,8 +31,8 @@ use crate::{
// //
// fn handle(action: Action) { // fn handle(action: Action) {
// match action { // match action {
// $0Action::Move { distance } => {} // $0Action::Move { distance } => todo!(),
// Action::Stop => {} // Action::Stop => todo!(),
// } // }
// } // }
// ``` // ```
@ -129,7 +129,7 @@ pub(crate) fn fill_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option<
|builder| { |builder| {
let new_match_arm_list = match_arm_list.clone_for_update(); let new_match_arm_list = match_arm_list.clone_for_update();
let missing_arms = missing_pats let missing_arms = missing_pats
.map(|pat| make::match_arm(iter::once(pat), make::expr_empty_block())) .map(|pat| make::match_arm(iter::once(pat), make::ext::expr_todo()))
.map(|it| it.clone_for_update()); .map(|it| it.clone_for_update());
let catch_all_arm = new_match_arm_list let catch_all_arm = new_match_arm_list
@ -350,8 +350,8 @@ fn foo(a: bool) {
r#" r#"
fn foo(a: bool) { fn foo(a: bool) {
match a { match a {
$0true => {} $0true => todo!(),
false => {} false => todo!(),
} }
} }
"#, "#,
@ -373,7 +373,7 @@ fn foo(a: bool) {
fn foo(a: bool) { fn foo(a: bool) {
match a { match a {
true => {} true => {}
$0false => {} $0false => todo!(),
} }
} }
"#, "#,
@ -410,10 +410,10 @@ fn foo(a: bool) {
r#" r#"
fn foo(a: bool) { fn foo(a: bool) {
match (a, a) { match (a, a) {
$0(true, true) => {} $0(true, true) => todo!(),
(true, false) => {} (true, false) => todo!(),
(false, true) => {} (false, true) => todo!(),
(false, false) => {} (false, false) => todo!(),
} }
} }
"#, "#,
@ -435,9 +435,9 @@ fn foo(a: bool) {
fn foo(a: bool) { fn foo(a: bool) {
match (a, a) { match (a, a) {
(false, true) => {} (false, true) => {}
$0(true, true) => {} $0(true, true) => todo!(),
(true, false) => {} (true, false) => todo!(),
(false, false) => {} (false, false) => todo!(),
} }
} }
"#, "#,
@ -471,7 +471,7 @@ fn main() {
match A::As { match A::As {
A::Bs { x, y: Some(_) } => {} A::Bs { x, y: Some(_) } => {}
A::Cs(_, Some(_)) => {} A::Cs(_, Some(_)) => {}
$0A::As => {} $0A::As => todo!(),
} }
} }
"#, "#,
@ -499,7 +499,7 @@ use Option::*;
fn main() { fn main() {
match None { match None {
None => {} None => {}
Some(${0:_}) => {} Some(${0:_}) => todo!(),
} }
} }
"#, "#,
@ -523,7 +523,7 @@ enum A { As, Bs, Cs(Option<i32>) }
fn main() { fn main() {
match A::As { match A::As {
A::Cs(_) | A::Bs => {} A::Cs(_) | A::Bs => {}
$0A::As => {} $0A::As => todo!(),
} }
} }
"#, "#,
@ -553,8 +553,8 @@ fn main() {
A::Bs if 0 < 1 => {} A::Bs if 0 < 1 => {}
A::Ds(_value) => { let x = 1; } A::Ds(_value) => { let x = 1; }
A::Es(B::Xs) => (), A::Es(B::Xs) => (),
$0A::As => {} $0A::As => todo!(),
A::Cs => {} A::Cs => todo!(),
} }
} }
"#, "#,
@ -580,7 +580,7 @@ fn main() {
match A::As { match A::As {
A::As(_) => {} A::As(_) => {}
a @ A::Bs(_) => {} a @ A::Bs(_) => {}
A::Cs(${0:_}) => {} A::Cs(${0:_}) => todo!(),
} }
} }
"#, "#,
@ -605,11 +605,11 @@ enum A { As, Bs, Cs(String), Ds(String, String), Es { x: usize, y: usize } }
fn main() { fn main() {
let a = A::As; let a = A::As;
match a { match a {
$0A::As => {} $0A::As => todo!(),
A::Bs => {} A::Bs => todo!(),
A::Cs(_) => {} A::Cs(_) => todo!(),
A::Ds(_, _) => {} A::Ds(_, _) => todo!(),
A::Es { x, y } => {} A::Es { x, y } => todo!(),
} }
} }
"#, "#,
@ -638,10 +638,10 @@ fn main() {
let a = A::One; let a = A::One;
let b = B::One; let b = B::One;
match (a, b) { match (a, b) {
$0(A::One, B::One) => {} $0(A::One, B::One) => todo!(),
(A::One, B::Two) => {} (A::One, B::Two) => todo!(),
(A::Two, B::One) => {} (A::Two, B::One) => todo!(),
(A::Two, B::Two) => {} (A::Two, B::Two) => todo!(),
} }
} }
"#, "#,
@ -670,10 +670,10 @@ fn main() {
let a = A::One; let a = A::One;
let b = B::One; let b = B::One;
match (&a, &b) { match (&a, &b) {
$0(A::One, B::One) => {} $0(A::One, B::One) => todo!(),
(A::One, B::Two) => {} (A::One, B::Two) => todo!(),
(A::Two, B::One) => {} (A::Two, B::One) => todo!(),
(A::Two, B::Two) => {} (A::Two, B::Two) => todo!(),
} }
} }
"#, "#,
@ -705,9 +705,9 @@ fn main() {
let b = B::One; let b = B::One;
match (a, b) { match (a, b) {
(A::Two, B::One) => {} (A::Two, B::One) => {}
$0(A::One, B::One) => {} $0(A::One, B::One) => todo!(),
(A::One, B::Two) => {} (A::One, B::Two) => todo!(),
(A::Two, B::Two) => {} (A::Two, B::Two) => todo!(),
} }
} }
"#, "#,
@ -736,7 +736,7 @@ fn main() {
match (a, b) { match (a, b) {
(Some(_), _) => {} (Some(_), _) => {}
(None, Some(_)) => {} (None, Some(_)) => {}
$0(None, None) => {} $0(None, None) => todo!(),
} }
} }
"#, "#,
@ -801,8 +801,8 @@ enum A { One, Two }
fn main() { fn main() {
let a = A::One; let a = A::One;
match (a, ) { match (a, ) {
$0(A::One,) => {} $0(A::One,) => todo!(),
(A::Two,) => {} (A::Two,) => todo!(),
} }
} }
"#, "#,
@ -826,7 +826,7 @@ enum A { As }
fn foo(a: &A) { fn foo(a: &A) {
match a { match a {
$0A::As => {} $0A::As => todo!(),
} }
} }
"#, "#,
@ -851,7 +851,7 @@ enum A {
fn foo(a: &mut A) { fn foo(a: &mut A) {
match a { match a {
$0A::Es { x, y } => {} $0A::Es { x, y } => todo!(),
} }
} }
"#, "#,
@ -891,8 +891,8 @@ enum E { X, Y }
fn main() { fn main() {
match E::X { match E::X {
$0E::X => {} $0E::X => todo!(),
E::Y => {} E::Y => todo!(),
} }
} }
"#, "#,
@ -919,8 +919,8 @@ use foo::E::X;
fn main() { fn main() {
match X { match X {
$0X => {} $0X => todo!(),
foo::E::Y => {} foo::E::Y => todo!(),
} }
} }
"#, "#,
@ -947,7 +947,7 @@ fn foo(a: A) {
match a { match a {
// foo bar baz // foo bar baz
A::One => {} A::One => {}
$0A::Two => {} $0A::Two => todo!(),
// This is where the rest should be // This is where the rest should be
} }
} }
@ -971,8 +971,8 @@ fn foo(a: A) {
enum A { One, Two } enum A { One, Two }
fn foo(a: A) { fn foo(a: A) {
match a { match a {
$0A::One => {} $0A::One => todo!(),
A::Two => {} A::Two => todo!(),
// foo bar baz // foo bar baz
} }
} }
@ -996,8 +996,8 @@ fn foo(a: A) {
enum A { One, Two, } enum A { One, Two, }
fn foo(a: A) { fn foo(a: A) {
match a { match a {
$0A::One => {} $0A::One => todo!(),
A::Two => {} A::Two => todo!(),
} }
} }
"#, "#,
@ -1021,8 +1021,8 @@ fn foo(opt: Option<i32>) {
r#" r#"
fn foo(opt: Option<i32>) { fn foo(opt: Option<i32>) {
match opt { match opt {
Some(${0:_}) => {} Some(${0:_}) => todo!(),
None => {} None => todo!(),
} }
} }
"#, "#,
@ -1054,9 +1054,9 @@ enum Test {
fn foo(t: Test) { fn foo(t: Test) {
m!(match t { m!(match t {
$0Test::A => {} $0Test::A => todo!(),
Test::B => {} Test::B => todo!(),
Test::C => {} Test::C => todo!(),
}); });
}"#, }"#,
); );
@ -1076,4 +1076,24 @@ fn foo(tuple: (A, A)) {
"#, "#,
); );
} }
#[test]
fn adds_comma_before_new_arms() {
check_assist(
fill_match_arms,
r#"
fn foo(t: bool) {
match $0t {
true => 1 + 2
}
}"#,
r#"
fn foo(t: bool) {
match t {
true => 1 + 2,
$0false => todo!(),
}
}"#,
);
}
} }

View File

@ -356,13 +356,17 @@ impl ast::MatchArm {
impl ast::MatchArmList { impl ast::MatchArmList {
pub fn add_arm(&self, arm: ast::MatchArm) { pub fn add_arm(&self, arm: ast::MatchArm) {
normalize_ws_between_braces(self.syntax()); normalize_ws_between_braces(self.syntax());
let mut elements = Vec::new();
let position = match self.arms().last() { let position = match self.arms().last() {
Some(last_arm) => { Some(last_arm) => {
let curly = last_arm let comma = last_arm
.syntax() .syntax()
.siblings_with_tokens(Direction::Next) .siblings_with_tokens(Direction::Next)
.find(|it| it.kind() == T![,]); .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() { None => match self.l_curly_token() {
Some(it) => Position::after(it), Some(it) => Position::after(it),
@ -370,11 +374,16 @@ impl ast::MatchArmList {
}, },
}; };
let indent = IndentLevel::from_node(self.syntax()) + 1; let indent = IndentLevel::from_node(self.syntax()) + 1;
let elements = vec![ elements.push(make::tokens::whitespace(&format!("\n{}", indent)).into());
make::tokens::whitespace(&format!("\n{}", indent)).into(), elements.push(arm.syntax().clone().into());
arm.syntax().clone().into(), if needs_comma(&arm) {
]; elements.push(make::token(SyntaxKind::COMMA).into());
}
ted::insert_all(position, elements); ted::insert_all(position, elements);
fn needs_comma(arm: &ast::MatchArm) -> bool {
arm.expr().map_or(false, |e| !e.is_block_like())
}
} }
} }