use std::collections::HashMap;
use std::path::PathBuf;
use std::sync::Arc;
use tempfile::TempDir;
use super::Translator;
use super::dto::Position;
use super::encoding_ctx::{EncodingCtx, new_line_cache};
use crate::bridge::encoding::PositionEncoding;
use crate::bridge::state::ResourceLimits;
use crate::bridge::{DiagnosticInfo, DocumentTracker};
use crate::config::{ServerId, ToolRouter};
use crate::lsp::LspServer;
pub(super) use crate::test_lsp::{
FakeServer, fake_lsp_client, read_framed_message, write_error_response, write_response,
};
pub(super) const fn pos(line: u32, character: u32) -> Position {
Position { line, character }
}
pub(super) fn test_ctx() -> EncodingCtx {
test_ctx_with(PositionEncoding::Utf16)
}
pub(super) fn test_ctx_with(encoding: PositionEncoding) -> EncodingCtx {
test_ctx_with_roots(encoding, Vec::new())
}
pub(super) fn test_ctx_with_roots(
encoding: PositionEncoding,
workspace_roots: Vec<PathBuf>,
) -> EncodingCtx {
EncodingCtx {
encoding,
tracker: Arc::new(DocumentTracker::new(
ResourceLimits::default(),
HashMap::new(),
)),
workspace_roots: Arc::new(workspace_roots),
line_cache: new_line_cache(),
}
}
pub(super) fn test_uri() -> lsp_types::Uri {
lsp_types::Uri::from("file:///test.rs")
}
pub(super) fn test_tracker() -> Arc<DocumentTracker> {
Arc::new(DocumentTracker::new(
ResourceLimits::default(),
HashMap::new(),
))
}
pub(super) fn lsp_diag(
line: u32,
end_character: u32,
severity: lsp_types::DiagnosticSeverity,
message: &str,
code: Option<&str>,
) -> lsp_types::Diagnostic {
lsp_types::Diagnostic {
range: lsp_types::Range {
start: lsp_types::Position { line, character: 0 },
end: lsp_types::Position {
line,
character: end_character,
},
},
severity: Some(severity),
message: message.to_string().into(),
code: code.map(|c| lsp_types::Code::String(c.to_string())),
source: None,
code_description: None,
related_information: None,
tags: None,
data: None,
}
}
pub(super) fn diag_info(diagnostics: Vec<lsp_types::Diagnostic>) -> DiagnosticInfo {
DiagnosticInfo {
uri: lsp_types::Uri::from("file:///test.rs"),
version: Some(1),
diagnostics,
}
}
pub(super) fn translator_with_capabilities(
dir: &TempDir,
server_id: &ServerId,
capabilities: lsp_types::ServerCapabilities,
) -> (Translator, FakeServer) {
let mut extensions = HashMap::new();
extensions.insert("rs".to_string(), "rust".to_string());
let mut translator =
Translator::new()
.with_extensions(extensions)
.with_router(ToolRouter::catch_all([(
server_id.clone(),
"rust".to_string(),
)]));
translator.set_workspace_roots(vec![dir.path().to_path_buf()]);
let (client, server) = fake_lsp_client();
translator.register_client(server_id.clone(), client);
translator.register_server(server_id.clone(), LspServer::new_for_test(capabilities));
(translator, server)
}
pub(super) fn translator_with_capabilities_and_encoding(
dir: &TempDir,
server_id: &ServerId,
capabilities: lsp_types::ServerCapabilities,
position_encoding: lsp_types::PositionEncodingKind,
) -> (Translator, FakeServer) {
let mut extensions = HashMap::new();
extensions.insert("rs".to_string(), "rust".to_string());
let mut translator =
Translator::new()
.with_extensions(extensions)
.with_router(ToolRouter::catch_all([(
server_id.clone(),
"rust".to_string(),
)]));
translator.set_workspace_roots(vec![dir.path().to_path_buf()]);
let (client, server) = fake_lsp_client();
translator.register_client(server_id.clone(), client);
translator.register_server(
server_id.clone(),
LspServer::new_for_test_with_encoding(capabilities, position_encoding),
);
(translator, server)
}