Skip to content

Commit

Permalink
Auto merge of rust-lang#12851 - DorianListens:dscheidt/if-completion-…
Browse files Browse the repository at this point in the history
…match-guard, r=Veykril

fix: Don't add braces to 'if' completion in match guard position

fixes rust-lang#12823

Is this what you were thinking of here, `@Veykril` ? I haven't done any work on completions before, so I could definitely be misunderstanding the issue.
  • Loading branch information
bors committed Jul 23, 2022
2 parents f3a46f6 + 13c83f9 commit 2be0062
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 1 deletion.
7 changes: 6 additions & 1 deletion crates/ide-completion/src/completions/expr.rs
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ pub(crate) fn complete_expr_path(
ref is_func_update,
ref innermost_ret_ty,
ref impl_,
in_match_guard,
..
}: &ExprCtx,
) {
Expand Down Expand Up @@ -195,7 +196,11 @@ pub(crate) fn complete_expr_path(
add_keyword("while", "while $1 {\n $0\n}");
add_keyword("while let", "while let $1 = $2 {\n $0\n}");
add_keyword("loop", "loop {\n $0\n}");
add_keyword("if", "if $1 {\n $0\n}");
if in_match_guard {
add_keyword("if", "if $0");
} else {
add_keyword("if", "if $1 {\n $0\n}");
}
add_keyword("if let", "if let $1 = $2 {\n $0\n}");
add_keyword("for", "for $1 in $2 {\n $0\n}");
add_keyword("true", "true");
Expand Down
71 changes: 71 additions & 0 deletions crates/ide-completion/src/completions/keyword.rs
Original file line number Diff line number Diff line change
Expand Up @@ -163,4 +163,75 @@ fn main() {
"#,
);
}

#[test]
fn if_completion_in_match_guard() {
check_edit(
"if",
r"
fn main() {
match () {
() $0
}
}
",
r"
fn main() {
match () {
() if $0
}
}
",
)
}

#[test]
fn if_completion_in_match_arm_expr() {
check_edit(
"if",
r"
fn main() {
match () {
() => $0
}
}
",
r"
fn main() {
match () {
() => if $1 {
$0
}
}
}
",
)
}

#[test]
fn if_completion_in_match_arm_expr_block() {
check_edit(
"if",
r"
fn main() {
match () {
() => {
$0
}
}
}
",
r"
fn main() {
match () {
() => {
if $1 {
$0
}
}
}
}
",
)
}
}
3 changes: 3 additions & 0 deletions crates/ide-completion/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,9 @@ pub(crate) struct ExprCtx {
pub(crate) self_param: Option<hir::SelfParam>,
pub(crate) innermost_ret_ty: Option<hir::Type>,
pub(crate) impl_: Option<ast::Impl>,
/// Whether this expression occurs in match arm guard position: before the
/// fat arrow token
pub(crate) in_match_guard: bool,
}

/// Original file ast nodes
Expand Down
8 changes: 8 additions & 0 deletions crates/ide-completion/src/context/analysis.rs
Original file line number Diff line number Diff line change
Expand Up @@ -763,6 +763,13 @@ impl<'a> CompletionContext<'a> {
.map_or(false, |it| it.semicolon_token().is_none());
let impl_ = fetch_immediate_impl(sema, original_file, expr.syntax());

let in_match_guard = match it.parent().and_then(ast::MatchArm::cast) {
Some(arm) => arm
.fat_arrow_token()
.map_or(true, |arrow| it.text_range().start() < arrow.text_range().start()),
None => false,
};

PathKind::Expr {
expr_ctx: ExprCtx {
in_block_expr,
Expand All @@ -775,6 +782,7 @@ impl<'a> CompletionContext<'a> {
self_param,
incomplete_let,
impl_,
in_match_guard,
},
}
};
Expand Down

0 comments on commit 2be0062

Please sign in to comment.