diff --git a/Cargo.lock b/Cargo.lock index c445439b10..f1d8e5462c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -745,7 +745,7 @@ dependencies = [ "smol_str 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", "tempfile 3.0.5 (registry+https://github.com/rust-lang/crates.io-index)", "test_utils 0.1.0", - "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "thread_worker 0.1.0", "threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "tools 0.1.0", @@ -764,7 +764,7 @@ dependencies = [ "ra_text_edit 0.1.0", "rowan 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "test_utils 0.1.0", - "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "walkdir 2.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -775,7 +775,7 @@ version = "0.1.0" dependencies = [ "proptest 0.8.7 (registry+https://github.com/rust-lang/crates.io-index)", "test_utils 0.1.0", - "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -972,7 +972,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", "smol_str 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] @@ -1218,12 +1218,12 @@ dependencies = [ "difference 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", "serde_json 1.0.34 (registry+https://github.com/rust-lang/crates.io-index)", - "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "text_unit" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "serde 1.0.84 (registry+https://github.com/rust-lang/crates.io-index)", @@ -1597,7 +1597,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum tera 0.11.20 (registry+https://github.com/rust-lang/crates.io-index)" = "4b505279e19d8f7d24b1a9dc58327c9c36174b1a2c7ebdeac70792d017cb64f3" "checksum teraron 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0d89ad4617d1dec55331067fadaa041e813479e1779616f3d3ce9308bf46184e" "checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" -"checksum text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "8009d7bdbd896a7e09b595f8f9325a19047fc708653e60d0895202b82135048f" +"checksum text_unit 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "158bb1c22b638b1da3c95a8ad9f061ea40d4d39fd0301be3a520f92efeeb189e" "checksum textwrap 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "307686869c93e71f94da64286f9a9524c0f308a9e1c87a583de8e9c9039ad3f6" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum threadpool 1.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "e2f0c90a5f3459330ac8bc0d2f879c693bb7a2f59689c1083fc4ef83834da865" diff --git a/crates/ra_editor/src/typing.rs b/crates/ra_editor/src/typing.rs index 576caf6bec..d8177f245e 100644 --- a/crates/ra_editor/src/typing.rs +++ b/crates/ra_editor/src/typing.rs @@ -4,12 +4,10 @@ use itertools::Itertools; use ra_syntax::{ algo::{find_node_at_offset, find_covering_node, find_leaf_at_offset, LeafAtOffset}, ast, - text_utils::intersect, AstNode, Direction, SourceFile, SyntaxKind, SyntaxKind::*, SyntaxNode, TextRange, TextUnit, }; -use ra_text_edit::text_utils::contains_offset_nonstrict; use crate::{LocalEdit, TextEditBuilder}; @@ -39,7 +37,7 @@ pub fn join_lines(file: &SourceFile, range: TextRange) -> LocalEdit { Some(text) => text, None => continue, }; - let range = match intersect(range, node.range()) { + let range = match range.intersection(&node.range()) { Some(range) => range, None => continue, } - node.range().start(); @@ -112,7 +110,7 @@ pub fn on_eq_typed(file: &SourceFile, offset: TextUnit) -> Option { } if let Some(expr) = let_stmt.initializer() { let expr_range = expr.syntax().range(); - if contains_offset_nonstrict(expr_range, offset) && offset != expr_range.start() { + if expr_range.contains(offset) && offset != expr_range.start() { return None; } if file diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index b9b42f1b39..b7777bfc39 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -11,8 +11,7 @@ use languageserver_types::{ use ra_analysis::{ FileId, FilePosition, FileRange, FoldKind, Query, RunnableKind, Severity, SourceChange, }; -use ra_syntax::{text_utils::intersect, TextUnit, AstNode}; -use ra_text_edit::text_utils::contains_offset_nonstrict; +use ra_syntax::{TextUnit, AstNode}; use rustc_hash::FxHashMap; use serde_json::to_value; use std::io::Write; @@ -248,7 +247,7 @@ pub fn handle_runnables( let mut res = Vec::new(); for runnable in world.analysis().runnables(file_id)? { if let Some(offset) = offset { - if !contains_offset_nonstrict(runnable.range, offset) { + if !runnable.range.contains_inclusive(offset) { continue; } } @@ -650,7 +649,7 @@ pub fn handle_code_action( .diagnostics(file_id)? .into_iter() .filter_map(|d| Some((d.range, d.fix?))) - .filter(|(diag_range, _fix)| intersect(*diag_range, range).is_some()) + .filter(|(diag_range, _fix)| diag_range.intersection(&range).is_some()) .map(|(_range, fix)| fix); let mut res = Vec::new(); diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index eea0e251a8..7c8e5b6962 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml @@ -14,7 +14,7 @@ itertools = "0.8.0" drop_bomb = "0.1.4" parking_lot = "0.7.0" rowan = "0.2.0" -text_unit = "0.1.5" +text_unit = "0.1.6" ra_text_edit = { path = "../ra_text_edit" } [dev-dependencies] diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index a75e641ead..1dbfca91b2 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -31,7 +31,6 @@ mod parser_impl; mod reparsing; mod string_lexing; mod syntax_kinds; -pub mod text_utils; /// Utilities for simple uses of the parser. pub mod utils; mod validation; @@ -75,8 +74,7 @@ impl SourceFile { .map(|(green_node, errors)| SourceFile::new(green_node, errors)) } fn full_reparse(&self, edit: &AtomTextEdit) -> TreePtr { - let text = - text_utils::replace_range(self.syntax().text().to_string(), edit.delete, &edit.insert); + let text = edit.apply(self.syntax().text().to_string()); SourceFile::parse(&text) } pub fn errors(&self) -> Vec { diff --git a/crates/ra_syntax/src/reparsing.rs b/crates/ra_syntax/src/reparsing.rs index d5d72e1f8e..2f1de6b02d 100644 --- a/crates/ra_syntax/src/reparsing.rs +++ b/crates/ra_syntax/src/reparsing.rs @@ -3,7 +3,6 @@ use crate::grammar; use crate::lexer::{tokenize, Token}; use crate::parser_api::Parser; use crate::parser_impl; -use crate::text_utils::replace_range; use crate::yellow::{self, GreenNode, SyntaxError, SyntaxNode}; use crate::{SyntaxKind::*, TextRange, TextUnit}; use ra_text_edit::AtomTextEdit; @@ -62,11 +61,8 @@ fn reparse_block<'node>( } fn get_text_after_edit(node: &SyntaxNode, edit: &AtomTextEdit) -> String { - replace_range( - node.text().to_string(), - edit.delete - node.range().start(), - &edit.insert, - ) + let edit = AtomTextEdit::replace(edit.delete - node.range().start(), edit.insert.clone()); + edit.apply(node.text().to_string()) } fn is_contextual_kw(text: &str) -> bool { @@ -156,7 +152,7 @@ fn merge_errors( mod tests { use test_utils::{extract_range, assert_eq_text}; - use crate::{SourceFile, AstNode, text_utils::replace_range, utils::dump_tree}; + use crate::{SourceFile, AstNode, utils::dump_tree}; use super::*; fn do_check(before: &str, replace_with: &str, reparser: F) @@ -167,7 +163,8 @@ mod tests { ) -> Option<(&'a SyntaxNode, GreenNode, Vec)>, { let (range, before) = extract_range(before); - let after = replace_range(before.clone(), range, replace_with); + let edit = AtomTextEdit::replace(range, replace_with.to_owned()); + let after = edit.apply(before.clone()); let fully_reparsed = SourceFile::parse(&after); let incrementally_reparsed = { diff --git a/crates/ra_syntax/src/text_utils.rs b/crates/ra_syntax/src/text_utils.rs deleted file mode 100644 index 417d43e1ba..0000000000 --- a/crates/ra_syntax/src/text_utils.rs +++ /dev/null @@ -1,18 +0,0 @@ -use crate::TextRange; - -pub fn intersect(r1: TextRange, r2: TextRange) -> Option { - let start = r1.start().max(r2.start()); - let end = r1.end().min(r2.end()); - if start <= end { - Some(TextRange::from_to(start, end)) - } else { - None - } -} - -pub fn replace_range(mut text: String, range: TextRange, replace_with: &str) -> String { - let start = u32::from(range.start()) as usize; - let end = u32::from(range.end()) as usize; - text.replace_range(start..end, replace_with); - text -} diff --git a/crates/ra_syntax/src/yellow/syntax_text.rs b/crates/ra_syntax/src/yellow/syntax_text.rs index 31db0fdab3..08dbe57a2b 100644 --- a/crates/ra_syntax/src/yellow/syntax_text.rs +++ b/crates/ra_syntax/src/yellow/syntax_text.rs @@ -1,10 +1,6 @@ use std::{fmt, ops}; -use ra_text_edit::text_utils::contains_offset_nonstrict; -use crate::{ - text_utils::intersect, - SyntaxNode, TextRange, TextUnit, -}; +use crate::{SyntaxNode, TextRange, TextUnit}; #[derive(Clone)] pub struct SyntaxText<'a> { @@ -23,7 +19,7 @@ impl<'a> SyntaxText<'a> { let range = self.range; self.node.descendants().filter_map(move |node| { let text = node.leaf_text()?; - let range = intersect(range, node.range())?; + let range = range.intersection(&node.range())?; let range = range - node.range().start(); Some(&text[range]) }) @@ -92,13 +88,13 @@ pub trait SyntaxTextSlice: fmt::Debug { impl SyntaxTextSlice for TextRange { fn restrict(&self, range: TextRange) -> Option { - intersect(*self, range) + self.intersection(&range) } } impl SyntaxTextSlice for ops::RangeTo { fn restrict(&self, range: TextRange) -> Option { - if !contains_offset_nonstrict(range, self.end) { + if !range.contains_inclusive(self.end) { return None; } Some(TextRange::from_to(range.start(), self.end)) @@ -107,7 +103,7 @@ impl SyntaxTextSlice for ops::RangeTo { impl SyntaxTextSlice for ops::RangeFrom { fn restrict(&self, range: TextRange) -> Option { - if !contains_offset_nonstrict(range, self.start) { + if !range.contains_inclusive(self.start) { return None; } Some(TextRange::from_to(self.start, range.end())) diff --git a/crates/ra_text_edit/Cargo.toml b/crates/ra_text_edit/Cargo.toml index e0db49688e..71f6ce1adc 100644 --- a/crates/ra_text_edit/Cargo.toml +++ b/crates/ra_text_edit/Cargo.toml @@ -6,7 +6,7 @@ authors = ["Aleksey Kladov "] publish = false [dependencies] -text_unit = "0.1.5" +text_unit = "0.1.6" proptest = "0.8.7" [dev-dependencies] diff --git a/crates/ra_text_edit/src/lib.rs b/crates/ra_text_edit/src/lib.rs index 8acf104484..fb693b3ae0 100644 --- a/crates/ra_text_edit/src/lib.rs +++ b/crates/ra_text_edit/src/lib.rs @@ -1,5 +1,4 @@ mod text_edit; -pub mod text_utils; pub mod test_utils; pub use crate::text_edit::{TextEdit, TextEditBuilder}; @@ -29,4 +28,11 @@ impl AtomTextEdit { pub fn insert(offset: TextUnit, text: String) -> AtomTextEdit { AtomTextEdit::replace(TextRange::offset_len(offset, 0.into()), text) } + + pub fn apply(&self, mut text: String) -> String { + let start = u32::from(self.delete.start()) as usize; + let end = u32::from(self.delete.end()) as usize; + text.replace_range(start..end, &self.insert); + text + } } diff --git a/crates/ra_text_edit/src/text_edit.rs b/crates/ra_text_edit/src/text_edit.rs index a288a990db..363b3d8c05 100644 --- a/crates/ra_text_edit/src/text_edit.rs +++ b/crates/ra_text_edit/src/text_edit.rs @@ -1,5 +1,4 @@ use crate::AtomTextEdit; -use crate::text_utils::contains_offset_nonstrict; use text_unit::{TextRange, TextUnit}; #[derive(Debug, Clone)] @@ -28,7 +27,7 @@ impl TextEditBuilder { pub fn invalidates_offset(&self, offset: TextUnit) -> bool { self.atoms .iter() - .any(|atom| contains_offset_nonstrict(atom.delete, offset)) + .any(|atom| atom.delete.contains_inclusive(offset)) } } diff --git a/crates/ra_text_edit/src/text_utils.rs b/crates/ra_text_edit/src/text_utils.rs deleted file mode 100644 index e3b4dc4fe3..0000000000 --- a/crates/ra_text_edit/src/text_utils.rs +++ /dev/null @@ -1,5 +0,0 @@ -use text_unit::{TextRange, TextUnit}; - -pub fn contains_offset_nonstrict(range: TextRange, offset: TextUnit) -> bool { - range.start() <= offset && offset <= range.end() -}