mirror of
https://github.com/astral-sh/ruff.git
synced 2025-10-27 02:16:54 +00:00
58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use lsp_server::ErrorCode;
|
|
use lsp_types::notification::DidChangeTextDocument;
|
|
use lsp_types::{DidChangeTextDocumentParams, VersionedTextDocumentIdentifier};
|
|
|
|
use crate::server::Result;
|
|
use crate::server::api::LSPResult;
|
|
use crate::server::api::diagnostics::publish_diagnostics;
|
|
use crate::server::api::traits::{NotificationHandler, SyncNotificationHandler};
|
|
use crate::session::Session;
|
|
use crate::session::client::Client;
|
|
use crate::system::AnySystemPath;
|
|
use ty_project::watch::ChangeEvent;
|
|
|
|
pub(crate) struct DidChangeTextDocumentHandler;
|
|
|
|
impl NotificationHandler for DidChangeTextDocumentHandler {
|
|
type NotificationType = DidChangeTextDocument;
|
|
}
|
|
|
|
impl SyncNotificationHandler for DidChangeTextDocumentHandler {
|
|
fn run(
|
|
session: &mut Session,
|
|
client: &Client,
|
|
params: DidChangeTextDocumentParams,
|
|
) -> Result<()> {
|
|
let DidChangeTextDocumentParams {
|
|
text_document: VersionedTextDocumentIdentifier { uri, version },
|
|
content_changes,
|
|
} = params;
|
|
|
|
let key = match session.key_from_url(uri) {
|
|
Ok(key) => key,
|
|
Err(uri) => {
|
|
tracing::debug!("Failed to create document key from URI: {}", uri);
|
|
return Ok(());
|
|
}
|
|
};
|
|
|
|
session
|
|
.update_text_document(&key, content_changes, version)
|
|
.with_failure_code(ErrorCode::InternalError)?;
|
|
|
|
let changes = match key.path() {
|
|
AnySystemPath::System(path) => {
|
|
vec![ChangeEvent::file_content_changed(path.clone())]
|
|
}
|
|
AnySystemPath::SystemVirtual(virtual_path) => {
|
|
vec![ChangeEvent::ChangedVirtual(virtual_path.clone())]
|
|
}
|
|
};
|
|
|
|
session.apply_changes(key.path(), changes);
|
|
|
|
publish_diagnostics(session, &key, client);
|
|
|
|
Ok(())
|
|
}
|
|
}
|