use std::path::PathBuf;
use crossbeam_channel::Sender;
use lsp_server::{Message, RequestId, Response};
use lsp_types::{DocumentSymbolResponse, Position, Range};
use crate::formatter::FormatStyle;
use crate::incremental::Analysis;
use crate::text::PositionEncoding;
use super::folding::folding_ranges_via_db;
use super::format::{format_edits_via_db, format_range_edits_via_db};
use super::selection::selection_ranges_via_db;
use super::semantic_tokens::semantic_tokens_via_db;
use super::symbols::document_symbols_via_db;
pub(crate) enum ReadJob {
Format {
id: RequestId,
path: PathBuf,
text: String,
style: FormatStyle,
sender: Sender<Message>,
},
FormatRange {
id: RequestId,
path: PathBuf,
text: String,
range: Range,
style: FormatStyle,
sender: Sender<Message>,
},
DocumentSymbols {
id: RequestId,
path: PathBuf,
text: String,
sender: Sender<Message>,
},
FoldingRanges {
id: RequestId,
path: PathBuf,
text: String,
sender: Sender<Message>,
},
SelectionRanges {
id: RequestId,
path: PathBuf,
text: String,
positions: Vec<Position>,
sender: Sender<Message>,
},
SemanticTokensFull {
id: RequestId,
path: PathBuf,
text: String,
sender: Sender<Message>,
},
}
impl ReadJob {
pub(crate) fn into_reply_parts(self) -> (RequestId, Sender<Message>) {
match self {
ReadJob::Format { id, sender, .. } => (id, sender),
ReadJob::FormatRange { id, sender, .. } => (id, sender),
ReadJob::DocumentSymbols { id, sender, .. } => (id, sender),
ReadJob::FoldingRanges { id, sender, .. } => (id, sender),
ReadJob::SelectionRanges { id, sender, .. } => (id, sender),
ReadJob::SemanticTokensFull { id, sender, .. } => (id, sender),
}
}
}
pub(crate) fn run_read(snapshot: Analysis, job: ReadJob, encoding: PositionEncoding) {
match job {
ReadJob::Format {
id,
path,
text,
style,
sender,
} => {
let result = format_edits_via_db(&snapshot, &path, &text, style, encoding);
let _ = sender.send(Message::Response(Response::new_ok(id, result)));
}
ReadJob::FormatRange {
id,
path,
text,
range,
style,
sender,
} => {
let result = format_range_edits_via_db(&snapshot, &path, &text, range, style, encoding);
let _ = sender.send(Message::Response(Response::new_ok(id, result)));
}
ReadJob::DocumentSymbols {
id,
path,
text,
sender,
} => {
let symbols = document_symbols_via_db(&snapshot, &path, &text, encoding);
let result = DocumentSymbolResponse::Nested(symbols);
let _ = sender.send(Message::Response(Response::new_ok(id, result)));
}
ReadJob::FoldingRanges {
id,
path,
text,
sender,
} => {
let folds = folding_ranges_via_db(&snapshot, &path, &text);
let _ = sender.send(Message::Response(Response::new_ok(id, folds)));
}
ReadJob::SelectionRanges {
id,
path,
text,
positions,
sender,
} => {
let ranges = selection_ranges_via_db(&snapshot, &path, &text, &positions, encoding);
let _ = sender.send(Message::Response(Response::new_ok(id, ranges)));
}
ReadJob::SemanticTokensFull {
id,
path,
text,
sender,
} => {
let tokens = semantic_tokens_via_db(&snapshot, &path, &text, encoding);
let _ = sender.send(Message::Response(Response::new_ok(id, tokens)));
}
}
}