From 2fa90e736b026ee979d9eb59178dc1f792228250 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 28 Aug 2018 11:12:42 +0300 Subject: better recovery for exprs --- crates/libeditor/src/lib.rs | 2 +- crates/libeditor/src/typing.rs | 24 ++++++++++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) (limited to 'crates/libeditor/src') diff --git a/crates/libeditor/src/lib.rs b/crates/libeditor/src/lib.rs index d39e56d81..34056b3c0 100644 --- a/crates/libeditor/src/lib.rs +++ b/crates/libeditor/src/lib.rs @@ -27,7 +27,7 @@ pub use self::{ ActionResult, flip_comma, add_derive, add_impl, }, - typing::join_lines, + typing::{join_lines, on_eq_typed}, completion::scope_completion, }; diff --git a/crates/libeditor/src/typing.rs b/crates/libeditor/src/typing.rs index 060095f28..48a8d6bb0 100644 --- a/crates/libeditor/src/typing.rs +++ b/crates/libeditor/src/typing.rs @@ -7,11 +7,11 @@ use libsyntax2::{ walk::preorder, find_covering_node, }, - text_utils::intersect, + text_utils::{intersect, contains_offset_nonstrict}, SyntaxKind::*, }; -use {ActionResult, EditBuilder}; +use {ActionResult, EditBuilder, find_node_at_offset}; pub fn join_lines(file: &File, range: TextRange) -> ActionResult { let range = if range.is_empty() { @@ -56,6 +56,26 @@ pub fn join_lines(file: &File, range: TextRange) -> ActionResult { } } +pub fn on_eq_typed(file: &File, offset: TextUnit) -> Option { + let let_stmt: ast::LetStmt = find_node_at_offset(file.syntax(), offset)?; + if let_stmt.has_semi() { + return None; + } + if let Some(expr) = let_stmt.initializer() { + let expr_range = expr.syntax().range(); + if contains_offset_nonstrict(expr_range, offset) && offset != expr_range.start() { + return None; + } + } + let offset = let_stmt.syntax().range().end(); + let mut edit = EditBuilder::new(); + edit.insert(offset, ";".to_string()); + Some(ActionResult { + edit: edit.finish(), + cursor_position: None, + }) +} + fn remove_newline( edit: &mut EditBuilder, node: SyntaxNodeRef, -- cgit v1.2.3