1pub use analysis::{CompletionFeat, LocalContext, LocalContextGuard, LspWorldExt};
11pub use completion::{CompletionRequest, PostfixSnippet};
12pub use typlite::ColorTheme;
13pub use upstream::with_vm;
14
15pub use check::*;
16pub use code_action::*;
17pub use code_context::*;
18pub use code_lens::*;
19pub use color_presentation::*;
20pub use diagnostics::*;
21pub use document_color::*;
22pub use document_highlight::*;
23pub use document_link::*;
24pub use document_metrics::*;
25pub use document_symbol::*;
26pub use folding_range::*;
27pub use goto_declaration::*;
28pub use goto_definition::*;
29pub use hover::*;
30pub use inlay_hint::*;
31pub use jump::*;
32pub use lsp_typst_boundary::*;
33pub use on_enter::*;
34pub use prepare_rename::*;
35pub use references::*;
36pub use rename::*;
37pub use selection_range::*;
38pub use semantic_tokens_delta::*;
39pub use semantic_tokens_full::*;
40pub use signature_help::*;
41pub use symbol::*;
42pub use will_rename_files::*;
43pub use workspace_label::*;
44
45pub mod analysis;
46pub mod docs;
47pub mod index;
48pub mod package;
49pub mod syntax;
50pub mod testing;
51pub use tinymist_analysis::{stats::GLOBAL_STATS, ty, upstream};
52
53pub type FramePosition = typst::introspection::PagedPosition;
55
56mod adt;
57mod lsp_typst_boundary;
58mod prelude;
59
60mod bib;
61mod check;
62mod code_action;
63mod code_context;
64mod code_lens;
65mod color_presentation;
66mod completion;
67mod diagnostics;
68mod document_color;
69mod document_highlight;
70mod document_link;
71mod document_metrics;
72mod document_symbol;
73mod folding_range;
74mod goto_declaration;
75mod goto_definition;
76mod hover;
77mod inlay_hint;
78mod jump;
79mod on_enter;
80mod prepare_rename;
81mod references;
82mod rename;
83mod selection_range;
84mod semantic_tokens_delta;
85mod semantic_tokens_full;
86mod signature_help;
87mod symbol;
88mod will_rename_files;
89mod workspace_label;
90
91use typst::syntax::Source;
92
93use tinymist_analysis::{adt::interner::Interned, log_debug_ct};
94
95pub(crate) type StrRef = Interned<str>;
97
98pub trait SyntaxRequest {
100 type Response;
102
103 fn request(
105 self,
106 source: &Source,
107 positing_encoding: PositionEncoding,
108 ) -> Option<Self::Response>;
109}
110
111pub trait SemanticRequest {
113 type Response;
115
116 fn request(self, ctx: &mut LocalContext) -> Option<Self::Response>;
118}
119
120mod polymorphic {
121 use completion::CompletionList;
122 use lsp_types::TextEdit;
123 use serde::{Deserialize, Serialize};
124 use tinymist_project::ProjectTask;
125 use typst::foundations::Dict;
126
127 use super::prelude::*;
128 use super::*;
129
130 #[derive(Debug, Clone)]
132 pub struct OnExportRequest {
133 pub path: PathBuf,
135 pub task: ProjectTask,
137 pub write: bool,
139 pub open: bool,
141 }
142
143 #[derive(Debug, Clone)]
145 pub struct OnExportMdRequest {
146 pub path: PathBuf,
148 pub processor: Option<String>,
150 pub task: ProjectTask,
152 pub write: bool,
154 pub open: bool,
156 }
157
158 #[derive(Debug, Clone, Serialize, Deserialize)]
160 #[serde(untagged, rename_all = "camelCase")]
161 pub enum OnExportResponse {
162 Single {
164 path: Option<PathBuf>,
166 data: Option<String>,
168 },
169 Paged {
171 total_pages: usize,
173 items: Vec<PagedExportResponse>,
175 },
176 }
177
178 #[derive(Debug, Clone, Serialize, Deserialize)]
180 #[serde(rename_all = "camelCase")]
181 pub struct PagedExportResponse {
182 pub page: usize,
184 pub path: Option<PathBuf>,
186 pub data: Option<String>,
188 }
189
190 #[derive(Debug, Clone)]
192 pub struct FormattingRequest {
193 pub path: PathBuf,
195 }
196
197 #[derive(Debug, Clone)]
199 pub struct ServerInfoRequest {}
200
201 #[derive(Debug, Clone, Serialize, Deserialize)]
203 #[serde(rename_all = "camelCase")]
204 pub struct ServerInfoResponse {
205 pub root: Option<PathBuf>,
207 pub font_paths: Vec<PathBuf>,
209 pub inputs: Dict,
211 pub stats: HashMap<String, String>,
213 }
214
215 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
217 pub enum FoldRequestFeature {
218 PinnedFirst,
220 Unique,
222 Mergeable,
224 ContextFreeUnique,
226 }
227
228 #[derive(Debug, Clone, strum::IntoStaticStr)]
230 pub enum CompilerQueryRequest {
231 OnExport(OnExportRequest),
233 OnExportMd(OnExportMdRequest),
235 Hover(HoverRequest),
237 HoverSymbol(String),
239 GotoDefinition(GotoDefinitionRequest),
241 GotoDefinitionSymbol(String),
243 GotoDeclaration(GotoDeclarationRequest),
245 References(ReferencesRequest),
247 InlayHint(InlayHintRequest),
249 DocumentColor(DocumentColorRequest),
251 DocumentLink(DocumentLinkRequest),
253 DocumentHighlight(DocumentHighlightRequest),
255 ColorPresentation(ColorPresentationRequest),
257 CodeAction(CodeActionRequest),
259 CodeLens(CodeLensRequest),
261 Completion(CompletionRequest),
263 SignatureHelp(SignatureHelpRequest),
265 Rename(RenameRequest),
267 WillRenameFiles(WillRenameFilesRequest),
269 PrepareRename(PrepareRenameRequest),
271 DocumentSymbol(DocumentSymbolRequest),
273 Symbol(SymbolRequest),
275 SemanticTokensFull(SemanticTokensFullRequest),
277 SemanticTokensDelta(SemanticTokensDeltaRequest),
279 Formatting(FormattingRequest),
281 FoldingRange(FoldingRangeRequest),
283 SelectionRange(SelectionRangeRequest),
285 InteractCodeContext(InteractCodeContextRequest),
287
288 OnEnter(OnEnterRequest),
290
291 DocumentMetrics(DocumentMetricsRequest),
293 WorkspaceLabel(WorkspaceLabelRequest),
295 ServerInfo(ServerInfoRequest),
297 }
298
299 impl CompilerQueryRequest {
300 pub fn fold_feature(&self) -> FoldRequestFeature {
302 use FoldRequestFeature::*;
303 match self {
304 Self::OnExport(..) => Mergeable,
305 Self::OnExportMd(..) => Mergeable,
306 Self::Hover(..) => PinnedFirst,
307 Self::HoverSymbol(..) => PinnedFirst,
308 Self::GotoDefinition(..) => PinnedFirst,
309 Self::GotoDefinitionSymbol(..) => PinnedFirst,
310 Self::GotoDeclaration(..) => PinnedFirst,
311 Self::References(..) => PinnedFirst,
312 Self::InlayHint(..) => Unique,
313 Self::DocumentColor(..) => PinnedFirst,
314 Self::DocumentLink(..) => PinnedFirst,
315 Self::DocumentHighlight(..) => PinnedFirst,
316 Self::ColorPresentation(..) => ContextFreeUnique,
317 Self::CodeAction(..) => Unique,
318 Self::CodeLens(..) => Unique,
319 Self::Completion(..) => Mergeable,
320 Self::SignatureHelp(..) => PinnedFirst,
321 Self::Rename(..) => Mergeable,
322 Self::WillRenameFiles(..) => Mergeable,
323 Self::PrepareRename(..) => Mergeable,
324 Self::DocumentSymbol(..) => ContextFreeUnique,
325 Self::WorkspaceLabel(..) => Mergeable,
326 Self::Symbol(..) => Mergeable,
327 Self::SemanticTokensFull(..) => PinnedFirst,
328 Self::SemanticTokensDelta(..) => PinnedFirst,
329 Self::Formatting(..) => ContextFreeUnique,
330 Self::FoldingRange(..) => ContextFreeUnique,
331 Self::SelectionRange(..) => ContextFreeUnique,
332 Self::InteractCodeContext(..) => PinnedFirst,
333
334 Self::OnEnter(..) => ContextFreeUnique,
335
336 Self::DocumentMetrics(..) => PinnedFirst,
337 Self::ServerInfo(..) => Mergeable,
338 }
339 }
340
341 pub fn associated_path(&self) -> Option<&Path> {
343 Some(match self {
344 Self::OnExport(..) => return None,
345 Self::OnExportMd(..) => return None,
346 Self::Hover(req) => &req.path,
347 Self::HoverSymbol(..) => return None,
348 Self::GotoDefinition(req) => &req.path,
349 Self::GotoDefinitionSymbol(..) => return None,
350 Self::GotoDeclaration(req) => &req.path,
351 Self::References(req) => &req.path,
352 Self::InlayHint(req) => &req.path,
353 Self::DocumentColor(req) => &req.path,
354 Self::DocumentLink(req) => &req.path,
355 Self::DocumentHighlight(req) => &req.path,
356 Self::ColorPresentation(req) => &req.path,
357 Self::CodeAction(req) => &req.path,
358 Self::CodeLens(req) => &req.path,
359 Self::Completion(req) => &req.path,
360 Self::SignatureHelp(req) => &req.path,
361 Self::Rename(req) => &req.path,
362 Self::WillRenameFiles(..) => return None,
363 Self::PrepareRename(req) => &req.path,
364 Self::DocumentSymbol(req) => &req.path,
365 Self::Symbol(..) => return None,
366 Self::WorkspaceLabel(..) => return None,
367 Self::SemanticTokensFull(req) => &req.path,
368 Self::SemanticTokensDelta(req) => &req.path,
369 Self::Formatting(req) => &req.path,
370 Self::FoldingRange(req) => &req.path,
371 Self::SelectionRange(req) => &req.path,
372 Self::InteractCodeContext(req) => &req.path,
373
374 Self::OnEnter(req) => &req.path,
375
376 Self::DocumentMetrics(req) => &req.path,
377 Self::ServerInfo(..) => return None,
378 })
379 }
380 }
381
382 #[derive(Debug, Clone, Serialize, Deserialize)]
384 #[serde(untagged)]
385 pub enum CompilerQueryResponse {
386 OnExport(Option<OnExportResponse>),
388 Hover(Option<Hover>),
390 GotoDefinition(Option<GotoDefinitionResponse>),
392 GotoDeclaration(Option<GotoDeclarationResponse>),
394 References(Option<Vec<LspLocation>>),
396 InlayHint(Option<Vec<InlayHint>>),
398 DocumentColor(Option<Vec<ColorInformation>>),
400 DocumentLink(Option<Vec<DocumentLink>>),
402 DocumentHighlight(Option<Vec<DocumentHighlight>>),
404 ColorPresentation(Option<Vec<ColorPresentation>>),
406 CodeAction(Option<Vec<CodeAction>>),
408 CodeLens(Option<Vec<CodeLens>>),
410 Completion(Option<CompletionList>),
412 SignatureHelp(Option<SignatureHelp>),
414 PrepareRename(Option<PrepareRenameResponse>),
416 Rename(Option<WorkspaceEdit>),
418 WillRenameFiles(Option<WorkspaceEdit>),
420 DocumentSymbol(Option<DocumentSymbolResponse>),
422 Symbol(Option<Vec<SymbolInformation>>),
424 WorkspaceLabel(Option<Vec<SymbolInformation>>),
426 SemanticTokensFull(Option<SemanticTokensResult>),
428 SemanticTokensDelta(Option<SemanticTokensFullDeltaResult>),
430 Formatting(Option<Vec<TextEdit>>),
432 FoldingRange(Option<Vec<FoldingRange>>),
434 SelectionRange(Option<Vec<SelectionRange>>),
436 InteractCodeContext(Option<Vec<Option<InteractCodeContextResponse>>>),
438
439 OnEnter(Option<Vec<TextEdit>>),
441
442 DocumentMetrics(Option<DocumentMetricsResponse>),
444 ServerInfo(Option<HashMap<String, ServerInfoResponse>>),
446 }
447}
448
449pub use polymorphic::*;
450
451#[cfg(test)]
452mod tests;