Move some stuff
This commit is contained in:
parent
bee4926ae7
commit
e219ac64c0
@ -34,9 +34,9 @@
|
||||
use vfs::{AbsPath, AbsPathBuf, VfsPath};
|
||||
|
||||
use crate::{
|
||||
capabilities::ClientCapabilities,
|
||||
diagnostics::DiagnosticsMapConfig,
|
||||
flycheck::{CargoOptions, FlycheckConfig},
|
||||
lsp::capabilities::ClientCapabilities,
|
||||
lsp_ext::{WorkspaceSymbolSearchKind, WorkspaceSymbolSearchScope},
|
||||
};
|
||||
|
||||
|
@ -1,53 +0,0 @@
|
||||
//! Generate minimal `TextEdit`s from different text versions
|
||||
use dissimilar::Chunk;
|
||||
use ide::{TextEdit, TextRange, TextSize};
|
||||
|
||||
pub(crate) fn diff(left: &str, right: &str) -> TextEdit {
|
||||
let chunks = dissimilar::diff(left, right);
|
||||
textedit_from_chunks(chunks)
|
||||
}
|
||||
|
||||
fn textedit_from_chunks(chunks: Vec<dissimilar::Chunk<'_>>) -> TextEdit {
|
||||
let mut builder = TextEdit::builder();
|
||||
let mut pos = TextSize::default();
|
||||
|
||||
let mut chunks = chunks.into_iter().peekable();
|
||||
while let Some(chunk) = chunks.next() {
|
||||
if let (Chunk::Delete(deleted), Some(&Chunk::Insert(inserted))) = (chunk, chunks.peek()) {
|
||||
chunks.next().unwrap();
|
||||
let deleted_len = TextSize::of(deleted);
|
||||
builder.replace(TextRange::at(pos, deleted_len), inserted.into());
|
||||
pos += deleted_len;
|
||||
continue;
|
||||
}
|
||||
|
||||
match chunk {
|
||||
Chunk::Equal(text) => {
|
||||
pos += TextSize::of(text);
|
||||
}
|
||||
Chunk::Delete(deleted) => {
|
||||
let deleted_len = TextSize::of(deleted);
|
||||
builder.delete(TextRange::at(pos, deleted_len));
|
||||
pos += deleted_len;
|
||||
}
|
||||
Chunk::Insert(inserted) => {
|
||||
builder.insert(pos, inserted.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
builder.finish()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn diff_applies() {
|
||||
let mut original = String::from("fn foo(a:u32){\n}");
|
||||
let result = "fn foo(a: u32) {}";
|
||||
let edit = diff(&original, result);
|
||||
edit.apply(&mut original);
|
||||
assert_eq!(original, result);
|
||||
}
|
||||
}
|
@ -36,7 +36,6 @@
|
||||
|
||||
use crate::{
|
||||
config::{Config, RustfmtConfig, WorkspaceSymbolConfig},
|
||||
diff::diff,
|
||||
global_state::{FetchWorkspaceRequest, GlobalState, GlobalStateSnapshot},
|
||||
hack_recover_crate_name,
|
||||
line_index::LineEndings,
|
||||
@ -2370,3 +2369,47 @@ fn resolve_resource_op(op: &ResourceOp) -> ResourceOperationKind {
|
||||
ResourceOp::Delete(_) => ResourceOperationKind::Delete,
|
||||
}
|
||||
}
|
||||
|
||||
pub(crate) fn diff(left: &str, right: &str) -> TextEdit {
|
||||
use dissimilar::Chunk;
|
||||
|
||||
let chunks = dissimilar::diff(left, right);
|
||||
|
||||
let mut builder = TextEdit::builder();
|
||||
let mut pos = TextSize::default();
|
||||
|
||||
let mut chunks = chunks.into_iter().peekable();
|
||||
while let Some(chunk) = chunks.next() {
|
||||
if let (Chunk::Delete(deleted), Some(&Chunk::Insert(inserted))) = (chunk, chunks.peek()) {
|
||||
chunks.next().unwrap();
|
||||
let deleted_len = TextSize::of(deleted);
|
||||
builder.replace(TextRange::at(pos, deleted_len), inserted.into());
|
||||
pos += deleted_len;
|
||||
continue;
|
||||
}
|
||||
|
||||
match chunk {
|
||||
Chunk::Equal(text) => {
|
||||
pos += TextSize::of(text);
|
||||
}
|
||||
Chunk::Delete(deleted) => {
|
||||
let deleted_len = TextSize::of(deleted);
|
||||
builder.delete(TextRange::at(pos, deleted_len));
|
||||
pos += deleted_len;
|
||||
}
|
||||
Chunk::Insert(inserted) => {
|
||||
builder.insert(pos, inserted.into());
|
||||
}
|
||||
}
|
||||
}
|
||||
builder.finish()
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn diff_smoke_test() {
|
||||
let mut original = String::from("fn foo(a:u32){\n}");
|
||||
let result = "fn foo(a: u32) {}";
|
||||
let edit = diff(&original, result);
|
||||
edit.apply(&mut original);
|
||||
assert_eq!(original, result);
|
||||
}
|
||||
|
@ -11,12 +11,9 @@
|
||||
|
||||
pub mod cli;
|
||||
|
||||
mod capabilities;
|
||||
mod command;
|
||||
mod diagnostics;
|
||||
mod diff;
|
||||
mod discover;
|
||||
mod dispatch;
|
||||
mod flycheck;
|
||||
mod hack_recover_crate_name;
|
||||
mod line_index;
|
||||
@ -30,6 +27,7 @@
|
||||
mod version;
|
||||
|
||||
mod handlers {
|
||||
pub(crate) mod dispatch;
|
||||
pub(crate) mod notification;
|
||||
pub(crate) mod request;
|
||||
}
|
||||
@ -51,7 +49,7 @@ pub mod tracing {
|
||||
use serde::de::DeserializeOwned;
|
||||
|
||||
pub use crate::{
|
||||
capabilities::server_capabilities, main_loop::main_loop, reload::ws_to_crate_graph,
|
||||
lsp::capabilities::server_capabilities, main_loop::main_loop, reload::ws_to_crate_graph,
|
||||
version::version,
|
||||
};
|
||||
|
||||
|
@ -3,6 +3,8 @@
|
||||
use core::fmt;
|
||||
|
||||
pub mod ext;
|
||||
|
||||
pub(crate) mod capabilities;
|
||||
pub(crate) mod from_proto;
|
||||
pub(crate) mod semantic_tokens;
|
||||
pub(crate) mod to_proto;
|
||||
|
@ -20,10 +20,10 @@
|
||||
config::Config,
|
||||
diagnostics::{fetch_native_diagnostics, DiagnosticsGeneration, NativeDiagnosticsFetchKind},
|
||||
discover::{DiscoverArgument, DiscoverCommand, DiscoverProjectMessage},
|
||||
dispatch::{NotificationDispatcher, RequestDispatcher},
|
||||
flycheck::{self, FlycheckMessage},
|
||||
global_state::{file_id_to_url, url_to_file_id, FetchWorkspaceRequest, GlobalState},
|
||||
hack_recover_crate_name,
|
||||
handlers::dispatch::{NotificationDispatcher, RequestDispatcher},
|
||||
lsp::{
|
||||
from_proto, to_proto,
|
||||
utils::{notification_is, Progress},
|
||||
|
Loading…
Reference in New Issue
Block a user