Better caret placement when filling match arms

This commit is contained in:
Aleksey Kladov 2020-07-10 18:22:04 +02:00
parent a6ac5ac742
commit a482eb0cd8

View File

@ -115,11 +115,19 @@ pub(crate) fn fill_match_arms(acc: &mut Assists, ctx: &AssistContext) -> Option<
let old_range = match_arm_list.syntax().text_range(); let old_range = match_arm_list.syntax().text_range();
match (first_new_arm, ctx.config.snippet_cap) { match (first_new_arm, ctx.config.snippet_cap) {
(Some(first_new_arm), Some(cap)) => { (Some(first_new_arm), Some(cap)) => {
let snippet = render_snippet( let extend_lifetime;
cap, let cursor = match first_new_arm
new_arm_list.syntax(), .syntax()
Cursor::Before(first_new_arm.syntax()), .descendants()
); .find_map(ast::PlaceholderPat::cast)
{
Some(it) => {
extend_lifetime = it.syntax().clone();
Cursor::Replace(&extend_lifetime)
}
None => Cursor::Before(first_new_arm.syntax()),
};
let snippet = render_snippet(cap, new_arm_list.syntax(), cursor);
builder.replace_snippet(cap, old_range, snippet); builder.replace_snippet(cap, old_range, snippet);
} }
_ => builder.replace(old_range, new_arm_list.to_string()), _ => builder.replace(old_range, new_arm_list.to_string()),
@ -291,30 +299,22 @@ mod tests {
check_assist( check_assist(
fill_match_arms, fill_match_arms,
r#" r#"
enum A { enum A { As, Bs, Cs(Option<i32>) }
As, fn main() {
Bs, match A::As<|> {
Cs(Option<i32>), A::Cs(_) | A::Bs => {}
} }
fn main() { }
match A::As<|> { "#,
A::Cs(_) | A::Bs => {}
}
}
"#,
r#" r#"
enum A { enum A { As, Bs, Cs(Option<i32>) }
As, fn main() {
Bs, match A::As {
Cs(Option<i32>), A::Cs(_) | A::Bs => {}
} $0A::As => {}
fn main() { }
match A::As { }
A::Cs(_) | A::Bs => {} "#,
$0A::As => {}
}
}
"#,
); );
} }
@ -323,47 +323,29 @@ mod tests {
check_assist( check_assist(
fill_match_arms, fill_match_arms,
r#" r#"
enum A { enum A { As, Bs, Cs, Ds(String), Es(B) }
As, enum B { Xs, Ys }
Bs, fn main() {
Cs, match A::As<|> {
Ds(String), A::Bs if 0 < 1 => {}
Es(B), A::Ds(_value) => { let x = 1; }
} A::Es(B::Xs) => (),
enum B { }
Xs, }
Ys, "#,
}
fn main() {
match A::As<|> {
A::Bs if 0 < 1 => {}
A::Ds(_value) => { let x = 1; }
A::Es(B::Xs) => (),
}
}
"#,
r#" r#"
enum A { enum A { As, Bs, Cs, Ds(String), Es(B) }
As, enum B { Xs, Ys }
Bs, fn main() {
Cs, match A::As {
Ds(String), A::Bs if 0 < 1 => {}
Es(B), A::Ds(_value) => { let x = 1; }
} A::Es(B::Xs) => (),
enum B { $0A::As => {}
Xs, A::Cs => {}
Ys, }
} }
fn main() { "#,
match A::As {
A::Bs if 0 < 1 => {}
A::Ds(_value) => { let x = 1; }
A::Es(B::Xs) => (),
$0A::As => {}
A::Cs => {}
}
}
"#,
); );
} }
@ -372,32 +354,24 @@ mod tests {
check_assist( check_assist(
fill_match_arms, fill_match_arms,
r#" r#"
enum A { enum A { As, Bs, Cs(Option<i32>) }
As, fn main() {
Bs, match A::As<|> {
Cs(Option<i32>), A::As(_) => {}
} a @ A::Bs(_) => {}
fn main() { }
match A::As<|> { }
A::As(_) => {} "#,
a @ A::Bs(_) => {}
}
}
"#,
r#" r#"
enum A { enum A { As, Bs, Cs(Option<i32>) }
As, fn main() {
Bs, match A::As {
Cs(Option<i32>), A::As(_) => {}
} a @ A::Bs(_) => {}
fn main() { A::Cs(${0:_}) => {}
match A::As { }
A::As(_) => {} }
a @ A::Bs(_) => {} "#,
$0A::Cs(_) => {}
}
}
"#,
); );
} }
@ -406,39 +380,27 @@ mod tests {
check_assist( check_assist(
fill_match_arms, fill_match_arms,
r#" r#"
enum A { enum A { As, Bs, Cs(String), Ds(String, String), Es { x: usize, y: usize } }
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<|> {}
} }
"#, "#,
r#" r#"
enum A { enum A { As, Bs, Cs(String), Ds(String, String), Es { x: usize, y: usize } }
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 => {}
A::Bs => {} A::Bs => {}
A::Cs(_) => {} A::Cs(_) => {}
A::Ds(_, _) => {} A::Ds(_, _) => {}
A::Es { x, y } => {} A::Es { x, y } => {}
} }
} }
"#, "#,
); );
} }
@ -778,7 +740,7 @@ fn foo(opt: Option<i32>) {
r#" r#"
fn foo(opt: Option<i32>) { fn foo(opt: Option<i32>) {
match opt { match opt {
$0Some(_) => {} Some(${0:_}) => {}
None => {} None => {}
} }
} }