From aa0d344581dcfd7f18c595688a4b2709b0f2421e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Wed, 15 Aug 2018 23:24:20 +0300 Subject: Edits with cursors --- crates/libeditor/src/code_actions.rs | 29 ++++++++++++++++++++++++----- crates/libeditor/src/edit.rs | 15 +++++++++++++++ crates/libeditor/src/lib.rs | 9 +-------- 3 files changed, 40 insertions(+), 13 deletions(-) (limited to 'crates/libeditor/src') diff --git a/crates/libeditor/src/code_actions.rs b/crates/libeditor/src/code_actions.rs index 6e2c73f29..88c348436 100644 --- a/crates/libeditor/src/code_actions.rs +++ b/crates/libeditor/src/code_actions.rs @@ -10,7 +10,17 @@ use libsyntax2::{ }, }; -pub fn flip_comma<'a>(file: &'a File, offset: TextUnit) -> Option Edit + 'a> { +pub struct ActionResult { + pub edit: Edit, + pub cursor_position: CursorPosition, +} + +pub enum CursorPosition { + Same, + Offset(TextUnit), +} + +pub fn flip_comma<'a>(file: &'a File, offset: TextUnit) -> Option ActionResult + 'a> { let syntax = file.syntax(); let syntax = syntax.as_ref(); @@ -21,18 +31,27 @@ pub fn flip_comma<'a>(file: &'a File, offset: TextUnit) -> Option(file: &'a File, offset: TextUnit) -> Option Edit + 'a> { +pub fn add_derive<'a>(file: &'a File, offset: TextUnit) -> Option ActionResult + 'a> { let syntax = file.syntax(); let syntax = syntax.as_ref(); let nominal = find_node::>(syntax, offset)?; Some(move || { let mut edit = EditBuilder::new(); - edit.insert(nominal.syntax().range().start(), "#[derive()]\n".to_string()); - edit.finish() + let node_start = nominal.syntax().range().start(); + edit.insert(node_start, "#[derive()]\n".to_string()); + ActionResult { + edit: edit.finish(), + cursor_position: CursorPosition::Offset( + node_start + TextUnit::of_str("#[derive(") + ), + } }) } diff --git a/crates/libeditor/src/edit.rs b/crates/libeditor/src/edit.rs index 15a2a904f..3edd0809d 100644 --- a/crates/libeditor/src/edit.rs +++ b/crates/libeditor/src/edit.rs @@ -67,6 +67,21 @@ impl Edit { assert_eq!(buf.len(), total_len); buf } + + pub fn apply_to_offset(&self, offset: TextUnit) -> Option { + let mut res = offset; + for atom in self.atoms.iter() { + if atom.delete.start() >= offset { + break; + } + if offset < atom.delete.end() { + return None + } + res += TextUnit::of_str(&atom.insert); + res -= atom.delete.len(); + } + Some(res) + } } impl AtomEdit { diff --git a/crates/libeditor/src/lib.rs b/crates/libeditor/src/lib.rs index 2c46ca45f..9e44f5d92 100644 --- a/crates/libeditor/src/lib.rs +++ b/crates/libeditor/src/lib.rs @@ -21,7 +21,7 @@ pub use self::{ extend_selection::extend_selection, symbols::{StructureNode, file_structure, FileSymbol, file_symbols}, edit::{EditBuilder, Edit, AtomEdit}, - code_actions::{flip_comma, add_derive}, + code_actions::{flip_comma, add_derive, ActionResult, CursorPosition}, }; #[derive(Debug)] @@ -36,13 +36,6 @@ pub struct Diagnostic { pub msg: String, } -#[derive(Debug)] -pub struct Symbol { - // pub parent: ???, - pub name: String, - pub range: TextRange, -} - #[derive(Debug)] pub struct Runnable { pub range: TextRange, -- cgit v1.2.3