diff --git a/Cargo.lock b/Cargo.lock index 1f69a91b24..56d5c65b9c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -610,6 +610,7 @@ dependencies = [ "ra_editor 0.1.0", "ra_hir 0.1.0", "ra_syntax 0.1.0", + "ra_text_edit 0.1.0", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -649,6 +650,7 @@ dependencies = [ "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "join_to_string 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", "ra_syntax 0.1.0", + "ra_text_edit 0.1.0", "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", "superslice 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "test_utils 0.1.0", @@ -687,6 +689,7 @@ dependencies = [ "ra_analysis 0.1.0", "ra_editor 0.1.0", "ra_syntax 0.1.0", + "ra_text_edit 0.1.0", "rayon 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)", "relative-path 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-hash 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", @@ -710,6 +713,7 @@ dependencies = [ "drop_bomb 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.7.8 (registry+https://github.com/rust-lang/crates.io-index)", "parking_lot 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ra_text_edit 0.1.0", "rowan 0.1.2 (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)", @@ -717,6 +721,14 @@ dependencies = [ "walkdir 2.2.6 (registry+https://github.com/rust-lang/crates.io-index)", ] +[[package]] +name = "ra_text_edit" +version = "0.1.0" +dependencies = [ + "test_utils 0.1.0", + "text_unit 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + [[package]] name = "rand" version = "0.4.3" diff --git a/crates/ra_analysis/Cargo.toml b/crates/ra_analysis/Cargo.toml index fe9765a666..4a7b99947e 100644 --- a/crates/ra_analysis/Cargo.toml +++ b/crates/ra_analysis/Cargo.toml @@ -14,6 +14,7 @@ rustc-hash = "1.0" parking_lot = "0.6.4" ra_syntax = { path = "../ra_syntax" } ra_editor = { path = "../ra_editor" } +ra_text_edit = { path = "../ra_text_edit" } ra_db = { path = "../ra_db" } hir = { path = "../ra_hir", package = "ra_hir" } test_utils = { path = "../test_utils" } diff --git a/crates/ra_analysis/src/completion.rs b/crates/ra_analysis/src/completion.rs index 0f154112a9..e833309666 100644 --- a/crates/ra_analysis/src/completion.rs +++ b/crates/ra_analysis/src/completion.rs @@ -1,10 +1,11 @@ mod reference_completion; use ra_editor::find_node_at_offset; +use ra_text_edit::AtomEdit; use ra_syntax::{ algo::visit::{visitor_ctx, VisitorCtx}, ast, - AstNode, AtomEdit, + AstNode, SyntaxNodeRef, }; use ra_db::SyntaxDatabase; diff --git a/crates/ra_analysis/src/lib.rs b/crates/ra_analysis/src/lib.rs index eaf24cb369..2f8f1dab5e 100644 --- a/crates/ra_analysis/src/lib.rs +++ b/crates/ra_analysis/src/lib.rs @@ -18,7 +18,8 @@ pub mod mock_analysis; use std::{fmt, sync::Arc}; -use ra_syntax::{AtomEdit, SourceFileNode, TextRange, TextUnit}; +use ra_syntax::{SourceFileNode, TextRange, TextUnit}; +use ra_text_edit::AtomEdit; use ra_db::FileResolverImp; use rayon::prelude::*; use relative_path::RelativePathBuf; diff --git a/crates/ra_editor/Cargo.toml b/crates/ra_editor/Cargo.toml index 7791da1562..c29be13509 100644 --- a/crates/ra_editor/Cargo.toml +++ b/crates/ra_editor/Cargo.toml @@ -12,6 +12,7 @@ join_to_string = "0.1.1" rustc-hash = "1.0" ra_syntax = { path = "../ra_syntax" } +ra_text_edit = { path = "../ra_text_edit" } [dev-dependencies] test_utils = { path = "../test_utils" } diff --git a/crates/ra_editor/src/lib.rs b/crates/ra_editor/src/lib.rs index ce080ee971..ddc44c7782 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 01acdda7c3..cf9af001b8 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}; diff --git a/crates/ra_lsp_server/Cargo.toml b/crates/ra_lsp_server/Cargo.toml index 5ee218b6b9..133decc525 100644 --- a/crates/ra_lsp_server/Cargo.toml +++ b/crates/ra_lsp_server/Cargo.toml @@ -28,6 +28,7 @@ rustc-hash = "1.0" ra_syntax = { path = "../ra_syntax" } ra_editor = { path = "../ra_editor" } +ra_text_edit = { path = "../ra_text_edit" } ra_analysis = { path = "../ra_analysis" } gen_lsp_server = { path = "../gen_lsp_server" } diff --git a/crates/ra_lsp_server/src/conv.rs b/crates/ra_lsp_server/src/conv.rs index 28368787c2..8bf8576be9 100644 --- a/crates/ra_lsp_server/src/conv.rs +++ b/crates/ra_lsp_server/src/conv.rs @@ -3,7 +3,8 @@ use languageserver_types::{ TextDocumentItem, TextDocumentPositionParams, TextEdit, Url, VersionedTextDocumentIdentifier, }; use ra_analysis::{FileId, FileSystemEdit, SourceChange, SourceFileNodeEdit, FilePosition}; -use ra_editor::{AtomEdit, Edit, LineCol, LineIndex}; +use ra_editor::{LineCol, LineIndex}; +use ra_text_edit::{AtomEdit, Edit}; use ra_syntax::{SyntaxKind, TextRange, TextUnit}; use crate::{req, server_world::ServerWorld, Result}; diff --git a/crates/ra_lsp_server/src/main_loop/handlers.rs b/crates/ra_lsp_server/src/main_loop/handlers.rs index 92e92f8363..21ca22c5c4 100644 --- a/crates/ra_lsp_server/src/main_loop/handlers.rs +++ b/crates/ra_lsp_server/src/main_loop/handlers.rs @@ -9,7 +9,8 @@ use languageserver_types::{ WorkspaceEdit, ParameterInformation, SignatureInformation, Hover, HoverContents, }; use ra_analysis::{FileId, FoldKind, Query, RunnableKind, FilePosition}; -use ra_syntax::{TextUnit, text_utils::{contains_offset_nonstrict, intersect}}; +use ra_syntax::{TextUnit, text_utils::intersect}; +use ra_text_edit::text_utils::contains_offset_nonstrict; use rustc_hash::FxHashMap; use serde_json::to_value; diff --git a/crates/ra_syntax/Cargo.toml b/crates/ra_syntax/Cargo.toml index 8ad8ed196c..8c9a7e238b 100644 --- a/crates/ra_syntax/Cargo.toml +++ b/crates/ra_syntax/Cargo.toml @@ -15,6 +15,7 @@ drop_bomb = "0.1.4" parking_lot = "0.6.0" rowan = "0.1.2" text_unit = "0.1.5" +ra_text_edit = { path = "../ra_text_edit" } [dev-dependencies] test_utils = { path = "../test_utils" } diff --git a/crates/ra_syntax/src/lib.rs b/crates/ra_syntax/src/lib.rs index 0e5c9baadd..7295fb2378 100644 --- a/crates/ra_syntax/src/lib.rs +++ b/crates/ra_syntax/src/lib.rs @@ -41,13 +41,13 @@ pub use rowan::{SmolStr, TextRange, TextUnit}; pub use crate::{ ast::AstNode, lexer::{tokenize, Token}, - reparsing::AtomEdit, syntax_kinds::SyntaxKind, yellow::{ Direction, OwnedRoot, RefRoot, SyntaxError, SyntaxNode, SyntaxNodeRef, TreeRoot, WalkEvent, Location, }, }; +use ra_text_edit::AtomEdit; use crate::yellow::GreenNode; /// `SourceFileNode` represents a parse tree for a single Rust file. diff --git a/crates/ra_syntax/src/reparsing.rs b/crates/ra_syntax/src/reparsing.rs index 732fb0e4ae..873809a5a3 100644 --- a/crates/ra_syntax/src/reparsing.rs +++ b/crates/ra_syntax/src/reparsing.rs @@ -6,29 +6,7 @@ use crate::parser_impl; use crate::text_utils::replace_range; use crate::yellow::{self, GreenNode, SyntaxError, SyntaxNodeRef}; use crate::{SyntaxKind::*, TextRange, TextUnit}; - -#[derive(Debug, Clone)] -pub struct AtomEdit { - pub delete: TextRange, - pub insert: String, -} - -impl AtomEdit { - pub fn replace(range: TextRange, replace_with: String) -> AtomEdit { - AtomEdit { - delete: range, - insert: replace_with, - } - } - - pub fn delete(range: TextRange) -> AtomEdit { - AtomEdit::replace(range, String::new()) - } - - pub fn insert(offset: TextUnit, text: String) -> AtomEdit { - AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text) - } -} +use ra_text_edit::AtomEdit; pub(crate) fn incremental_reparse( node: SyntaxNodeRef, diff --git a/crates/ra_syntax/src/text_utils.rs b/crates/ra_syntax/src/text_utils.rs index a90f8a083d..417d43e1ba 100644 --- a/crates/ra_syntax/src/text_utils.rs +++ b/crates/ra_syntax/src/text_utils.rs @@ -1,8 +1,4 @@ -use crate::{TextRange, TextUnit}; - -pub fn contains_offset_nonstrict(range: TextRange, offset: TextUnit) -> bool { - range.start() <= offset && offset <= range.end() -} +use crate::TextRange; pub fn intersect(r1: TextRange, r2: TextRange) -> Option { let start = r1.start().max(r2.start()); diff --git a/crates/ra_syntax/src/yellow/syntax_text.rs b/crates/ra_syntax/src/yellow/syntax_text.rs index 5395ca90b9..46bde9a086 100644 --- a/crates/ra_syntax/src/yellow/syntax_text.rs +++ b/crates/ra_syntax/src/yellow/syntax_text.rs @@ -1,7 +1,8 @@ use std::{fmt, ops}; +use ra_text_edit::text_utils::contains_offset_nonstrict; use crate::{ - text_utils::{contains_offset_nonstrict, intersect}, + text_utils::intersect, SyntaxNodeRef, TextRange, TextUnit, }; diff --git a/crates/ra_text_edit/Cargo.toml b/crates/ra_text_edit/Cargo.toml new file mode 100644 index 0000000000..3c4157a4e7 --- /dev/null +++ b/crates/ra_text_edit/Cargo.toml @@ -0,0 +1,12 @@ +[package] +edition = "2018" +name = "ra_text_edit" +version = "0.1.0" +authors = ["Aleksey Kladov "] +publish = false + +[dependencies] +text_unit = "0.1.5" + +[dev-dependencies] +test_utils = { path = "../test_utils" } diff --git a/crates/ra_editor/src/edit.rs b/crates/ra_text_edit/src/edit.rs similarity index 95% rename from crates/ra_editor/src/edit.rs rename to crates/ra_text_edit/src/edit.rs index 372b8d14cc..560cf2bbc9 100644 --- a/crates/ra_editor/src/edit.rs +++ b/crates/ra_text_edit/src/edit.rs @@ -1,5 +1,6 @@ -use crate::{TextRange, TextUnit}; -use ra_syntax::{text_utils::contains_offset_nonstrict, AtomEdit}; +use crate::AtomEdit; +use crate::text_utils::contains_offset_nonstrict; +use text_unit::{TextRange, TextUnit}; #[derive(Debug, Clone)] pub struct Edit { diff --git a/crates/ra_text_edit/src/lib.rs b/crates/ra_text_edit/src/lib.rs new file mode 100644 index 0000000000..789471e8a2 --- /dev/null +++ b/crates/ra_text_edit/src/lib.rs @@ -0,0 +1,29 @@ +mod edit; +pub mod text_utils; + +pub use crate::edit::{Edit, EditBuilder}; + +use text_unit::{TextRange, TextUnit}; + +#[derive(Debug, Clone)] +pub struct AtomEdit { + pub delete: TextRange, + pub insert: String, +} + +impl AtomEdit { + pub fn replace(range: TextRange, replace_with: String) -> AtomEdit { + AtomEdit { + delete: range, + insert: replace_with, + } + } + + pub fn delete(range: TextRange) -> AtomEdit { + AtomEdit::replace(range, String::new()) + } + + pub fn insert(offset: TextUnit, text: String) -> AtomEdit { + AtomEdit::replace(TextRange::offset_len(offset, 0.into()), text) + } +} diff --git a/crates/ra_text_edit/src/text_utils.rs b/crates/ra_text_edit/src/text_utils.rs new file mode 100644 index 0000000000..e3b4dc4fe3 --- /dev/null +++ b/crates/ra_text_edit/src/text_utils.rs @@ -0,0 +1,5 @@ +use text_unit::{TextRange, TextUnit}; + +pub fn contains_offset_nonstrict(range: TextRange, offset: TextUnit) -> bool { + range.start() <= offset && offset <= range.end() +}