diff options
-rw-r--r-- | crates/ra_ide/src/completion/complete_keyword.rs | 36 | ||||
-rw-r--r-- | crates/ra_ide/src/completion/completion_context.rs | 4 |
2 files changed, 28 insertions, 12 deletions
diff --git a/crates/ra_ide/src/completion/complete_keyword.rs b/crates/ra_ide/src/completion/complete_keyword.rs index 2dc401f57..fe873527f 100644 --- a/crates/ra_ide/src/completion/complete_keyword.rs +++ b/crates/ra_ide/src/completion/complete_keyword.rs | |||
@@ -88,24 +88,22 @@ pub(super) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte | |||
88 | 88 | ||
89 | if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent { | 89 | if ctx.has_item_list_or_source_file_parent && !has_trait_or_impl_parent { |
90 | add_keyword(ctx, acc, "enum", "enum $0 {}"); | 90 | add_keyword(ctx, acc, "enum", "enum $0 {}"); |
91 | add_keyword(ctx, acc, "struct", "struct $0 {}"); | 91 | add_keyword(ctx, acc, "struct", "struct $0"); |
92 | add_keyword(ctx, acc, "union", "union $0 {}"); | 92 | add_keyword(ctx, acc, "union", "union $0 {}"); |
93 | } | 93 | } |
94 | 94 | ||
95 | if ctx.block_expr_parent || ctx.is_match_arm { | 95 | if ctx.can_be_expr { |
96 | add_keyword(ctx, acc, "match", "match $0 {}"); | 96 | add_keyword(ctx, acc, "match", "match $0 {}"); |
97 | add_keyword(ctx, acc, "loop", "loop {$0}"); | ||
98 | } | ||
99 | if ctx.block_expr_parent { | ||
100 | add_keyword(ctx, acc, "while", "while $0 {}"); | 97 | add_keyword(ctx, acc, "while", "while $0 {}"); |
98 | add_keyword(ctx, acc, "loop", "loop {$0}"); | ||
99 | add_keyword(ctx, acc, "if", "if "); | ||
100 | add_keyword(ctx, acc, "if let", "if let "); | ||
101 | } | 101 | } |
102 | |||
102 | if ctx.if_is_prev || ctx.block_expr_parent { | 103 | if ctx.if_is_prev || ctx.block_expr_parent { |
103 | add_keyword(ctx, acc, "let", "let "); | 104 | add_keyword(ctx, acc, "let", "let "); |
104 | } | 105 | } |
105 | if ctx.if_is_prev || ctx.block_expr_parent || ctx.is_match_arm { | 106 | |
106 | add_keyword(ctx, acc, "if", "if "); | ||
107 | add_keyword(ctx, acc, "if let", "if let "); | ||
108 | } | ||
109 | if ctx.after_if { | 107 | if ctx.after_if { |
110 | add_keyword(ctx, acc, "else", "else {$0}"); | 108 | add_keyword(ctx, acc, "else", "else {$0}"); |
111 | add_keyword(ctx, acc, "else if", "else if $0 {}"); | 109 | add_keyword(ctx, acc, "else if", "else if $0 {}"); |
@@ -343,9 +341,7 @@ mod tests { | |||
343 | check( | 341 | check( |
344 | r#" | 342 | r#" |
345 | fn quux() -> i32 { | 343 | fn quux() -> i32 { |
346 | match () { | 344 | match () { () => <|> } |
347 | () => <|> | ||
348 | } | ||
349 | } | 345 | } |
350 | "#, | 346 | "#, |
351 | expect![[r#" | 347 | expect![[r#" |
@@ -355,6 +351,7 @@ fn quux() -> i32 { | |||
355 | kw match | 351 | kw match |
356 | kw return | 352 | kw return |
357 | kw unsafe | 353 | kw unsafe |
354 | kw while | ||
358 | "#]], | 355 | "#]], |
359 | ); | 356 | ); |
360 | } | 357 | } |
@@ -525,4 +522,19 @@ pub mod future { | |||
525 | "#]], | 522 | "#]], |
526 | ) | 523 | ) |
527 | } | 524 | } |
525 | |||
526 | #[test] | ||
527 | fn after_let() { | ||
528 | check( | ||
529 | r#"fn main() { let _ = <|> }"#, | ||
530 | expect![[r#" | ||
531 | kw if | ||
532 | kw if let | ||
533 | kw loop | ||
534 | kw match | ||
535 | kw return | ||
536 | kw while | ||
537 | "#]], | ||
538 | ) | ||
539 | } | ||
528 | } | 540 | } |
diff --git a/crates/ra_ide/src/completion/completion_context.rs b/crates/ra_ide/src/completion/completion_context.rs index 7688a1483..8e1f6dd98 100644 --- a/crates/ra_ide/src/completion/completion_context.rs +++ b/crates/ra_ide/src/completion/completion_context.rs | |||
@@ -53,6 +53,8 @@ pub(crate) struct CompletionContext<'a> { | |||
53 | pub(super) after_if: bool, | 53 | pub(super) after_if: bool, |
54 | /// `true` if we are a statement or a last expr in the block. | 54 | /// `true` if we are a statement or a last expr in the block. |
55 | pub(super) can_be_stmt: bool, | 55 | pub(super) can_be_stmt: bool, |
56 | /// `true` if we expect an expression at the cursor position. | ||
57 | pub(super) can_be_expr: bool, | ||
56 | /// Something is typed at the "top" level, in module or impl/trait. | 58 | /// Something is typed at the "top" level, in module or impl/trait. |
57 | pub(super) is_new_item: bool, | 59 | pub(super) is_new_item: bool, |
58 | /// The receiver if this is a field or method access, i.e. writing something.<|> | 60 | /// The receiver if this is a field or method access, i.e. writing something.<|> |
@@ -127,6 +129,7 @@ impl<'a> CompletionContext<'a> { | |||
127 | path_prefix: None, | 129 | path_prefix: None, |
128 | after_if: false, | 130 | after_if: false, |
129 | can_be_stmt: false, | 131 | can_be_stmt: false, |
132 | can_be_expr: false, | ||
130 | is_new_item: false, | 133 | is_new_item: false, |
131 | dot_receiver: None, | 134 | dot_receiver: None, |
132 | is_call: false, | 135 | is_call: false, |
@@ -403,6 +406,7 @@ impl<'a> CompletionContext<'a> { | |||
403 | None | 406 | None |
404 | }) | 407 | }) |
405 | .unwrap_or(false); | 408 | .unwrap_or(false); |
409 | self.can_be_expr = path.syntax().parent().and_then(ast::PathExpr::cast).is_some(); | ||
406 | 410 | ||
407 | if let Some(off) = name_ref.syntax().text_range().start().checked_sub(2.into()) { | 411 | if let Some(off) = name_ref.syntax().text_range().start().checked_sub(2.into()) { |
408 | if let Some(if_expr) = | 412 | if let Some(if_expr) = |