From 7344d28768c43d8955bf23c183d606be08f27c64 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Mon, 10 Dec 2018 22:09:12 +0100 Subject: extract AtomEdit and Edit into new ra_text_edit crate --- crates/ra_editor/src/edit.rs | 83 ------------------------------------------ crates/ra_editor/src/lib.rs | 4 +- crates/ra_editor/src/typing.rs | 3 +- 3 files changed, 3 insertions(+), 87 deletions(-) delete mode 100644 crates/ra_editor/src/edit.rs (limited to 'crates/ra_editor/src') diff --git a/crates/ra_editor/src/edit.rs b/crates/ra_editor/src/edit.rs deleted file mode 100644 index 372b8d14c..000000000 --- a/crates/ra_editor/src/edit.rs +++ /dev/null @@ -1,83 +0,0 @@ -use crate::{TextRange, TextUnit}; -use ra_syntax::{text_utils::contains_offset_nonstrict, AtomEdit}; - -#[derive(Debug, Clone)] -pub struct Edit { - atoms: Vec, -} - -#[derive(Debug)] -pub struct EditBuilder { - atoms: Vec, -} - -impl EditBuilder { - pub fn new() -> EditBuilder { - EditBuilder { atoms: Vec::new() } - } - pub fn replace(&mut self, range: TextRange, replace_with: String) { - self.atoms.push(AtomEdit::replace(range, replace_with)) - } - pub fn delete(&mut self, range: TextRange) { - self.atoms.push(AtomEdit::delete(range)) - } - pub fn insert(&mut self, offset: TextUnit, text: String) { - self.atoms.push(AtomEdit::insert(offset, text)) - } - pub fn finish(self) -> Edit { - let mut atoms = self.atoms; - atoms.sort_by_key(|a| (a.delete.start(), a.delete.end())); - for (a1, a2) in atoms.iter().zip(atoms.iter().skip(1)) { - assert!(a1.delete.end() <= a2.delete.start()) - } - Edit { atoms } - } - pub fn invalidates_offset(&self, offset: TextUnit) -> bool { - self.atoms - .iter() - .any(|atom| contains_offset_nonstrict(atom.delete, offset)) - } -} - -impl Edit { - pub fn into_atoms(self) -> Vec { - self.atoms - } - - pub fn apply(&self, text: &str) -> String { - let mut total_len = text.len(); - for atom in self.atoms.iter() { - total_len += atom.insert.len(); - total_len -= u32::from(atom.delete.end() - atom.delete.start()) as usize; - } - let mut buf = String::with_capacity(total_len); - let mut prev = 0; - for atom in self.atoms.iter() { - let start = u32::from(atom.delete.start()) as usize; - let end = u32::from(atom.delete.end()) as usize; - if start > prev { - buf.push_str(&text[prev..start]); - } - buf.push_str(&atom.insert); - prev = end; - } - buf.push_str(&text[prev..text.len()]); - 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) - } -} diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs index ce080ee97..ddc44c778 100644 --- a/crates/ra_editor/src/lib.rs +++ b/crates/ra_editor/src/lib.rs @@ -1,5 +1,4 @@ mod code_actions; -mod edit; mod extend_selection; mod folding_ranges; mod line_index; @@ -10,14 +9,13 @@ mod typing; pub use self::{ code_actions::{add_derive, add_impl, flip_comma, introduce_variable, LocalEdit}, - edit::{Edit, EditBuilder}, extend_selection::extend_selection, folding_ranges::{folding_ranges, Fold, FoldKind}, line_index::{LineCol, LineIndex}, symbols::{file_structure, file_symbols, FileSymbol, StructureNode}, typing::{join_lines, on_enter, on_eq_typed}, }; -pub use ra_syntax::AtomEdit; +use ra_text_edit::{Edit, EditBuilder}; use ra_syntax::{ algo::find_leaf_at_offset, ast::{self, AstNode, NameOwner}, diff --git a/crates/ra_editor/src/typing.rs b/crates/ra_editor/src/typing.rs index 01acdda7c..cf9af001b 100644 --- a/crates/ra_editor/src/typing.rs +++ b/crates/ra_editor/src/typing.rs @@ -3,11 +3,12 @@ use std::mem; use ra_syntax::{ algo::{find_covering_node, find_leaf_at_offset, LeafAtOffset}, ast, - text_utils::{contains_offset_nonstrict, intersect}, + text_utils::intersect, AstNode, SourceFileNode, SyntaxKind, SyntaxKind::*, SyntaxNodeRef, TextRange, TextUnit, }; +use ra_text_edit::text_utils::contains_offset_nonstrict; use crate::{find_node_at_offset, EditBuilder, LocalEdit}; -- cgit v1.2.3 From 0527e3b283af0153cf13fa64fe73862a5b7655c8 Mon Sep 17 00:00:00 2001 From: Bernardo Date: Tue, 11 Dec 2018 19:07:17 +0100 Subject: rename Edit to TextEdit and AtomEdit to AtomTextEdit --- crates/ra_editor/src/code_actions.rs | 12 ++++++------ crates/ra_editor/src/lib.rs | 2 +- crates/ra_editor/src/typing.rs | 23 ++++++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) (limited to 'crates/ra_editor/src') diff --git a/crates/ra_editor/src/code_actions.rs b/crates/ra_editor/src/code_actions.rs index 6979251d1..688a89c3d 100644 --- a/crates/ra_editor/src/code_actions.rs +++ b/crates/ra_editor/src/code_actions.rs @@ -8,11 +8,11 @@ use ra_syntax::{ SyntaxNodeRef, TextRange, TextUnit, }; -use crate::{find_node_at_offset, Edit, EditBuilder}; +use crate::{find_node_at_offset, TextEdit, TextEditBuilder}; #[derive(Debug)] pub struct LocalEdit { - pub edit: Edit, + pub edit: TextEdit, pub cursor_position: Option, } @@ -26,7 +26,7 @@ pub fn flip_comma<'a>( let prev = non_trivia_sibling(comma, Direction::Prev)?; let next = non_trivia_sibling(comma, Direction::Next)?; Some(move || { - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); edit.replace(prev.range(), next.text().to_string()); edit.replace(next.range(), prev.text().to_string()); LocalEdit { @@ -49,7 +49,7 @@ pub fn add_derive<'a>( .filter(|(name, _arg)| name == "derive") .map(|(_name, arg)| arg) .next(); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); let offset = match derive_attr { None => { edit.insert(node_start, "#[derive()]\n".to_string()); @@ -82,7 +82,7 @@ pub fn add_impl<'a>( Some(move || { let type_params = nominal.type_param_list(); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); let start_offset = nominal.syntax().range().end(); let mut buf = String::new(); buf.push_str("\n\nimpl"); @@ -129,7 +129,7 @@ pub fn introduce_variable<'a>( } return Some(move || { let mut buf = String::new(); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); buf.push_str("let var_name = "); expr.syntax().text().push_to(&mut buf); diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs index ddc44c778..36cabed25 100644 --- a/crates/ra_editor/src/lib.rs +++ b/crates/ra_editor/src/lib.rs @@ -15,7 +15,7 @@ pub use self::{ symbols::{file_structure, file_symbols, FileSymbol, StructureNode}, typing::{join_lines, on_enter, on_eq_typed}, }; -use ra_text_edit::{Edit, EditBuilder}; +use ra_text_edit::{TextEdit, TextEditBuilder}; use ra_syntax::{ algo::find_leaf_at_offset, ast::{self, AstNode, NameOwner}, diff --git a/crates/ra_editor/src/typing.rs b/crates/ra_editor/src/typing.rs index cf9af001b..46a6e2d62 100644 --- a/crates/ra_editor/src/typing.rs +++ b/crates/ra_editor/src/typing.rs @@ -10,7 +10,7 @@ use ra_syntax::{ }; use ra_text_edit::text_utils::contains_offset_nonstrict; -use crate::{find_node_at_offset, EditBuilder, LocalEdit}; +use crate::{find_node_at_offset, TextEditBuilder, LocalEdit}; pub fn join_lines(file: &SourceFileNode, range: TextRange) -> LocalEdit { let range = if range.is_empty() { @@ -19,7 +19,7 @@ pub fn join_lines(file: &SourceFileNode, range: TextRange) -> LocalEdit { let pos = match text.find('\n') { None => { return LocalEdit { - edit: EditBuilder::new().finish(), + edit: TextEditBuilder::new().finish(), cursor_position: None, }; } @@ -31,7 +31,7 @@ pub fn join_lines(file: &SourceFileNode, range: TextRange) -> LocalEdit { }; let node = find_covering_node(file.syntax(), range); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); for node in node.descendants() { let text = match node.leaf_text() { Some(text) => text, @@ -73,7 +73,7 @@ pub fn on_enter(file: &SourceFileNode, offset: TextUnit) -> Option { let indent = node_indent(file, comment.syntax())?; let inserted = format!("\n{}{} ", indent, prefix); let cursor_position = offset + TextUnit::of_str(&inserted); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); edit.insert(offset, inserted); Some(LocalEdit { edit: edit.finish(), @@ -123,7 +123,7 @@ pub fn on_eq_typed(file: &SourceFileNode, offset: TextUnit) -> Option return None; } let offset = let_stmt.syntax().range().end(); - let mut edit = EditBuilder::new(); + let mut edit = TextEditBuilder::new(); edit.insert(offset, ";".to_string()); Some(LocalEdit { edit: edit.finish(), @@ -131,7 +131,12 @@ pub fn on_eq_typed(file: &SourceFileNode, offset: TextUnit) -> Option }) } -fn remove_newline(edit: &mut EditBuilder, node: SyntaxNodeRef, node_text: &str, offset: TextUnit) { +fn remove_newline( + edit: &mut TextEditBuilder, + node: SyntaxNodeRef, + node_text: &str, + offset: TextUnit, +) { if node.kind() != WHITESPACE || node_text.bytes().filter(|&b| b == b'\n').count() != 1 { // The node is either the first or the last in the file let suff = &node_text[TextRange::from_to( @@ -192,7 +197,7 @@ fn is_trailing_comma(left: SyntaxKind, right: SyntaxKind) -> bool { } } -fn join_single_expr_block(edit: &mut EditBuilder, node: SyntaxNodeRef) -> Option<()> { +fn join_single_expr_block(edit: &mut TextEditBuilder, node: SyntaxNodeRef) -> Option<()> { let block = ast::Block::cast(node.parent()?)?; let block_expr = ast::BlockExpr::cast(block.syntax().parent()?)?; let expr = single_expr(block)?; @@ -270,14 +275,14 @@ fn foo() { fn test_join_lines_lambda_block() { check_join_lines( r" -pub fn reparse(&self, edit: &AtomEdit) -> File { +pub fn reparse(&self, edit: &AtomTextEdit) -> File { <|>self.incremental_reparse(edit).unwrap_or_else(|| { self.full_reparse(edit) }) } ", r" -pub fn reparse(&self, edit: &AtomEdit) -> File { +pub fn reparse(&self, edit: &AtomTextEdit) -> File { <|>self.incremental_reparse(edit).unwrap_or_else(|| self.full_reparse(edit)) } ", -- cgit v1.2.3