mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-15 13:52:59 +00:00
Better caret placement when filling match arms
This commit is contained in:
parent
a6ac5ac742
commit
a482eb0cd8
@ -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 => {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user