mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-04 19:29:07 +00:00
generate match arms with todo!() as placeholder body
This commit is contained in:
parent
c139eff5b8
commit
22e5194396
@ -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!(),
|
||||||
|
}
|
||||||
|
}"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user