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::layout::Position;
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, Serialize, Deserialize)]
145 #[serde(untagged, rename_all = "camelCase")]
146 pub enum OnExportResponse {
147 Single {
149 path: Option<PathBuf>,
151 data: Option<String>,
153 },
154 Paged {
156 total_pages: usize,
158 items: Vec<PagedExportResponse>,
160 },
161 }
162
163 #[derive(Debug, Clone, Serialize, Deserialize)]
165 #[serde(rename_all = "camelCase")]
166 pub struct PagedExportResponse {
167 pub page: usize,
169 pub path: Option<PathBuf>,
171 pub data: Option<String>,
173 }
174
175 #[derive(Debug, Clone)]
177 pub struct FormattingRequest {
178 pub path: PathBuf,
180 }
181
182 #[derive(Debug, Clone)]
184 pub struct ServerInfoRequest {}
185
186 #[derive(Debug, Clone, Serialize, Deserialize)]
188 #[serde(rename_all = "camelCase")]
189 pub struct ServerInfoResponse {
190 pub root: Option<PathBuf>,
192 pub font_paths: Vec<PathBuf>,
194 pub inputs: Dict,
196 pub stats: HashMap<String, String>,
198 }
199
200 #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
202 pub enum FoldRequestFeature {
203 PinnedFirst,
205 Unique,
207 Mergeable,
209 ContextFreeUnique,
211 }
212
213 #[derive(Debug, Clone, strum::IntoStaticStr)]
215 pub enum CompilerQueryRequest {
216 OnExport(OnExportRequest),
218 Hover(HoverRequest),
220 GotoDefinition(GotoDefinitionRequest),
222 GotoDeclaration(GotoDeclarationRequest),
224 References(ReferencesRequest),
226 InlayHint(InlayHintRequest),
228 DocumentColor(DocumentColorRequest),
230 DocumentLink(DocumentLinkRequest),
232 DocumentHighlight(DocumentHighlightRequest),
234 ColorPresentation(ColorPresentationRequest),
236 CodeAction(CodeActionRequest),
238 CodeLens(CodeLensRequest),
240 Completion(CompletionRequest),
242 SignatureHelp(SignatureHelpRequest),
244 Rename(RenameRequest),
246 WillRenameFiles(WillRenameFilesRequest),
248 PrepareRename(PrepareRenameRequest),
250 DocumentSymbol(DocumentSymbolRequest),
252 Symbol(SymbolRequest),
254 SemanticTokensFull(SemanticTokensFullRequest),
256 SemanticTokensDelta(SemanticTokensDeltaRequest),
258 Formatting(FormattingRequest),
260 FoldingRange(FoldingRangeRequest),
262 SelectionRange(SelectionRangeRequest),
264 InteractCodeContext(InteractCodeContextRequest),
266
267 OnEnter(OnEnterRequest),
269
270 DocumentMetrics(DocumentMetricsRequest),
272 WorkspaceLabel(WorkspaceLabelRequest),
274 ServerInfo(ServerInfoRequest),
276 }
277
278 impl CompilerQueryRequest {
279 pub fn fold_feature(&self) -> FoldRequestFeature {
281 use FoldRequestFeature::*;
282 match self {
283 Self::OnExport(..) => Mergeable,
284 Self::Hover(..) => PinnedFirst,
285 Self::GotoDefinition(..) => PinnedFirst,
286 Self::GotoDeclaration(..) => PinnedFirst,
287 Self::References(..) => PinnedFirst,
288 Self::InlayHint(..) => Unique,
289 Self::DocumentColor(..) => PinnedFirst,
290 Self::DocumentLink(..) => PinnedFirst,
291 Self::DocumentHighlight(..) => PinnedFirst,
292 Self::ColorPresentation(..) => ContextFreeUnique,
293 Self::CodeAction(..) => Unique,
294 Self::CodeLens(..) => Unique,
295 Self::Completion(..) => Mergeable,
296 Self::SignatureHelp(..) => PinnedFirst,
297 Self::Rename(..) => Mergeable,
298 Self::WillRenameFiles(..) => Mergeable,
299 Self::PrepareRename(..) => Mergeable,
300 Self::DocumentSymbol(..) => ContextFreeUnique,
301 Self::WorkspaceLabel(..) => Mergeable,
302 Self::Symbol(..) => Mergeable,
303 Self::SemanticTokensFull(..) => PinnedFirst,
304 Self::SemanticTokensDelta(..) => PinnedFirst,
305 Self::Formatting(..) => ContextFreeUnique,
306 Self::FoldingRange(..) => ContextFreeUnique,
307 Self::SelectionRange(..) => ContextFreeUnique,
308 Self::InteractCodeContext(..) => PinnedFirst,
309
310 Self::OnEnter(..) => ContextFreeUnique,
311
312 Self::DocumentMetrics(..) => PinnedFirst,
313 Self::ServerInfo(..) => Mergeable,
314 }
315 }
316
317 pub fn associated_path(&self) -> Option<&Path> {
319 Some(match self {
320 Self::OnExport(..) => return None,
321 Self::Hover(req) => &req.path,
322 Self::GotoDefinition(req) => &req.path,
323 Self::GotoDeclaration(req) => &req.path,
324 Self::References(req) => &req.path,
325 Self::InlayHint(req) => &req.path,
326 Self::DocumentColor(req) => &req.path,
327 Self::DocumentLink(req) => &req.path,
328 Self::DocumentHighlight(req) => &req.path,
329 Self::ColorPresentation(req) => &req.path,
330 Self::CodeAction(req) => &req.path,
331 Self::CodeLens(req) => &req.path,
332 Self::Completion(req) => &req.path,
333 Self::SignatureHelp(req) => &req.path,
334 Self::Rename(req) => &req.path,
335 Self::WillRenameFiles(..) => return None,
336 Self::PrepareRename(req) => &req.path,
337 Self::DocumentSymbol(req) => &req.path,
338 Self::Symbol(..) => return None,
339 Self::WorkspaceLabel(..) => return None,
340 Self::SemanticTokensFull(req) => &req.path,
341 Self::SemanticTokensDelta(req) => &req.path,
342 Self::Formatting(req) => &req.path,
343 Self::FoldingRange(req) => &req.path,
344 Self::SelectionRange(req) => &req.path,
345 Self::InteractCodeContext(req) => &req.path,
346
347 Self::OnEnter(req) => &req.path,
348
349 Self::DocumentMetrics(req) => &req.path,
350 Self::ServerInfo(..) => return None,
351 })
352 }
353 }
354
355 #[derive(Debug, Clone, Serialize, Deserialize)]
357 #[serde(untagged)]
358 pub enum CompilerQueryResponse {
359 OnExport(Option<OnExportResponse>),
361 Hover(Option<Hover>),
363 GotoDefinition(Option<GotoDefinitionResponse>),
365 GotoDeclaration(Option<GotoDeclarationResponse>),
367 References(Option<Vec<LspLocation>>),
369 InlayHint(Option<Vec<InlayHint>>),
371 DocumentColor(Option<Vec<ColorInformation>>),
373 DocumentLink(Option<Vec<DocumentLink>>),
375 DocumentHighlight(Option<Vec<DocumentHighlight>>),
377 ColorPresentation(Option<Vec<ColorPresentation>>),
379 CodeAction(Option<Vec<CodeAction>>),
381 CodeLens(Option<Vec<CodeLens>>),
383 Completion(Option<CompletionList>),
385 SignatureHelp(Option<SignatureHelp>),
387 PrepareRename(Option<PrepareRenameResponse>),
389 Rename(Option<WorkspaceEdit>),
391 WillRenameFiles(Option<WorkspaceEdit>),
393 DocumentSymbol(Option<DocumentSymbolResponse>),
395 Symbol(Option<Vec<SymbolInformation>>),
397 WorkspaceLabel(Option<Vec<SymbolInformation>>),
399 SemanticTokensFull(Option<SemanticTokensResult>),
401 SemanticTokensDelta(Option<SemanticTokensFullDeltaResult>),
403 Formatting(Option<Vec<TextEdit>>),
405 FoldingRange(Option<Vec<FoldingRange>>),
407 SelectionRange(Option<Vec<SelectionRange>>),
409 InteractCodeContext(Option<Vec<Option<InteractCodeContextResponse>>>),
411
412 OnEnter(Option<Vec<TextEdit>>),
414
415 DocumentMetrics(Option<DocumentMetricsResponse>),
417 ServerInfo(Option<HashMap<String, ServerInfoResponse>>),
419 }
420}
421
422pub use polymorphic::*;
423
424#[cfg(test)]
425mod tests;