From 29a52f8d56e8fa45727c9f38df819a9f82a4eb6f Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sun, 30 Dec 2018 22:14:35 +0300 Subject: refine semi completion --- .../ra_analysis/src/completion/complete_keyword.rs | 18 ++++++++++++ .../src/completion/completion_context.rs | 32 +++++++++++----------- 2 files changed, 34 insertions(+), 16 deletions(-) (limited to 'crates/ra_analysis') diff --git a/crates/ra_analysis/src/completion/complete_keyword.rs b/crates/ra_analysis/src/completion/complete_keyword.rs index b2486104a..d70fdaada 100644 --- a/crates/ra_analysis/src/completion/complete_keyword.rs +++ b/crates/ra_analysis/src/completion/complete_keyword.rs @@ -191,6 +191,24 @@ mod tests { return "return $0;" "#, ); + check_keyword_completion( + r" + fn quux() -> i32 { + if condition { + <|> + } + let x = 92; + x + } + ", + r#" + if "if $0 {}" + match "match $0 {}" + while "while $0 {}" + loop "loop {$0}" + return "return $0;" + "#, + ); } #[test] diff --git a/crates/ra_analysis/src/completion/completion_context.rs b/crates/ra_analysis/src/completion/completion_context.rs index 4685c9328..4584f355d 100644 --- a/crates/ra_analysis/src/completion/completion_context.rs +++ b/crates/ra_analysis/src/completion/completion_context.rs @@ -148,24 +148,24 @@ impl<'a> CompletionContext<'a> { if path.qualifier().is_none() { self.is_trivial_path = true; - self.can_be_stmt = match name_ref + // Find either enclosing expr statement (thing with `;`) or a + // block. If block, check that we are the last expr. + self.can_be_stmt = name_ref .syntax() .ancestors() - .filter_map(ast::ExprStmt::cast) - .next() - { - None => { - name_ref - .syntax() - .ancestors() - .filter_map(ast::Block::cast) - .next() - .and_then(|block| block.expr()) - .map(|e| e.syntax().range()) - == Some(name_ref.syntax().range()) - } - Some(expr_stmt) => expr_stmt.syntax().range() == name_ref.syntax().range(), - }; + .find_map(|node| { + if let Some(stmt) = ast::ExprStmt::cast(node) { + return Some(stmt.syntax().range() == name_ref.syntax().range()); + } + if let Some(block) = ast::Block::cast(node) { + return Some( + block.expr().map(|e| e.syntax().range()) + == Some(name_ref.syntax().range()), + ); + } + None + }) + .unwrap_or(false); if let Some(off) = name_ref.syntax().range().start().checked_sub(2.into()) { if let Some(if_expr) = -- cgit v1.2.3