#![allow(unused)]
mod event;
mod init;
mod request;
pub use init::*;
use reflexo_typst::vfs::PathResolution;
use serde::{Deserialize, Serialize};
use sync_ls::{invalid_request, LspResult};
use tinymist_query::PositionEncoding;
use typst::syntax::{FileId, Source};
use crate::project::LspCompileSnapshot;
use crate::{ConstDapConfig, ServerState};
#[derive(Default)]
pub(crate) struct DebugState {
pub(crate) session: Option<DebugSession>,
}
impl DebugState {
pub(crate) fn session(&self) -> LspResult<&DebugSession> {
self.session
.as_ref()
.ok_or_else(|| invalid_request("No active debug session"))
}
}
pub(crate) struct DebugSession {
config: ConstDapConfig,
snapshot: LspCompileSnapshot,
thread_id: u64,
stop_on_entry: bool,
source: Source,
position: usize,
}
const DAP_POS_ENCODING: PositionEncoding = PositionEncoding::Utf16;
impl DebugSession {
pub fn to_dap_source(&self, id: FileId) -> dapts::Source {
use dapts::Source;
Source {
path: match self.snapshot.world.path_for_id(id).ok() {
Some(PathResolution::Resolved(path)) => Some(path.display().to_string()),
None | Some(PathResolution::Rootless(..)) => None,
},
..Source::default()
}
}
pub fn to_dap_position(&self, pos: usize, source: &Source) -> DapPosition {
let mut lsp_pos = tinymist_query::to_lsp_position(pos, DAP_POS_ENCODING, source);
if self.config.lines_start_at1 {
lsp_pos.line += 1;
}
if self.config.columns_start_at1 {
lsp_pos.character += 1;
}
DapPosition {
line: lsp_pos.line as u64,
character: lsp_pos.character as u64,
}
}
}
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Copy, Clone, Default, Deserialize, Serialize)]
pub struct DapPosition {
pub line: u64,
pub character: u64,
}