tinymist_query/
lib.rs

1//! # tinymist-query
2//!
3//! **Note: this crate is under development. it currently doesn't ensure stable
4//! APIs, and heavily depending on some unstable crates.**
5//!
6//! This crate provides a set of APIs to query the information about the source
7//! code. Currently it provides:
8//! + language queries defined by the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/).
9
10pub 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
53/// The physical position in a document.
54pub 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
95/// A reference to the interned string
96pub(crate) type StrRef = Interned<str>;
97
98/// A request handler with given syntax information.
99pub trait SyntaxRequest {
100    /// The response type of the request.
101    type Response;
102
103    /// Request the information from the given source.
104    fn request(
105        self,
106        source: &Source,
107        positing_encoding: PositionEncoding,
108    ) -> Option<Self::Response>;
109}
110
111/// A request handler with given (semantic) analysis context.
112pub trait SemanticRequest {
113    /// The response type of the request.
114    type Response;
115
116    /// Request the information from the given context.
117    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    /// A request to run an export task.
131    #[derive(Debug, Clone)]
132    pub struct OnExportRequest {
133        /// The path of the document to export.
134        pub path: PathBuf,
135        /// The export task to run.
136        pub task: ProjectTask,
137        /// Whether to write to file.
138        pub write: bool,
139        /// Whether to open the exported file(s) after the export is done.
140        pub open: bool,
141    }
142
143    /// A request to run an export markdown task.
144    #[derive(Debug, Clone)]
145    pub struct OnExportMdRequest {
146        /// The path of the document to export.
147        pub path: PathBuf,
148        /// The processor package to use for the export.
149        pub processor: Option<String>,
150        /// The export task to run.
151        pub task: ProjectTask,
152        /// Whether to write to file.
153        pub write: bool,
154        /// Whether to open the exported file(s) after the export is done.
155        pub open: bool,
156    }
157
158    /// The response to an export request.
159    #[derive(Debug, Clone, Serialize, Deserialize)]
160    #[serde(untagged, rename_all = "camelCase")]
161    pub enum OnExportResponse {
162        /// Non-page or a single page exported.
163        Single {
164            /// The path of the exported file. None if not written to file.
165            path: Option<PathBuf>,
166            /// The data of the exported file. None if written to file.
167            data: Option<String>,
168        },
169        /// Multiple pages exported.
170        Paged {
171            /// The total number of pages of the document.
172            total_pages: usize,
173            /// The exported pages.
174            items: Vec<PagedExportResponse>,
175        },
176    }
177
178    /// The response to a single page export.
179    #[derive(Debug, Clone, Serialize, Deserialize)]
180    #[serde(rename_all = "camelCase")]
181    pub struct PagedExportResponse {
182        /// The page number of the exported page (0-based).
183        pub page: usize,
184        /// The path of the exported file. None if not written to file.
185        pub path: Option<PathBuf>,
186        /// The data of the exported file. None if written to file.
187        pub data: Option<String>,
188    }
189
190    /// A request to format the document.
191    #[derive(Debug, Clone)]
192    pub struct FormattingRequest {
193        /// The path of the document to get semantic tokens for.
194        pub path: PathBuf,
195    }
196
197    /// A request to get the server info.
198    #[derive(Debug, Clone)]
199    pub struct ServerInfoRequest {}
200
201    /// The response to the server info request.
202    #[derive(Debug, Clone, Serialize, Deserialize)]
203    #[serde(rename_all = "camelCase")]
204    pub struct ServerInfoResponse {
205        /// The root path of the server.
206        pub root: Option<PathBuf>,
207        /// The font paths of the server.
208        pub font_paths: Vec<PathBuf>,
209        /// The inputs of the server.
210        pub inputs: Dict,
211        /// The statistics of the server.
212        pub stats: HashMap<String, String>,
213    }
214
215    /// The feature of the fold request.
216    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
217    pub enum FoldRequestFeature {
218        /// Serves the request with the first pinned entry.
219        PinnedFirst,
220        /// Makes the items unique.
221        Unique,
222        /// Merges the items.
223        Mergeable,
224        /// Makes the items unique without context.
225        ContextFreeUnique,
226    }
227
228    /// The analysis request.
229    #[derive(Debug, Clone, strum::IntoStaticStr)]
230    pub enum CompilerQueryRequest {
231        /// A request to run an export task.
232        OnExport(OnExportRequest),
233        /// A request to run an export markdown task.
234        OnExportMd(OnExportMdRequest),
235        /// A request to get the hover information.
236        Hover(HoverRequest),
237        /// A request to go to the definition.
238        GotoDefinition(GotoDefinitionRequest),
239        /// A request to go to the declaration.
240        GotoDeclaration(GotoDeclarationRequest),
241        /// A request to get the references.
242        References(ReferencesRequest),
243        /// A request to get the inlay hints.
244        InlayHint(InlayHintRequest),
245        /// A request to get the document colors.
246        DocumentColor(DocumentColorRequest),
247        /// A request to get the document links.
248        DocumentLink(DocumentLinkRequest),
249        /// A request to get the document highlights.
250        DocumentHighlight(DocumentHighlightRequest),
251        /// A request to get the color presentations.
252        ColorPresentation(ColorPresentationRequest),
253        /// A request to get the code actions.
254        CodeAction(CodeActionRequest),
255        /// A request to get the code lenses.
256        CodeLens(CodeLensRequest),
257        /// A request to get the completions.
258        Completion(CompletionRequest),
259        /// A request to get the signature helps.
260        SignatureHelp(SignatureHelpRequest),
261        /// A request to rename.
262        Rename(RenameRequest),
263        /// A request to determine the files to be renamed.
264        WillRenameFiles(WillRenameFilesRequest),
265        /// A request to prepare the rename.
266        PrepareRename(PrepareRenameRequest),
267        /// A request to get the document symbols.
268        DocumentSymbol(DocumentSymbolRequest),
269        /// A request to get the symbols.
270        Symbol(SymbolRequest),
271        /// A request to get the semantic tokens full.
272        SemanticTokensFull(SemanticTokensFullRequest),
273        /// A request to get the semantic tokens delta.
274        SemanticTokensDelta(SemanticTokensDeltaRequest),
275        /// A request to format the document.
276        Formatting(FormattingRequest),
277        /// A request to get the folding ranges.
278        FoldingRange(FoldingRangeRequest),
279        /// A request to get the selection ranges.
280        SelectionRange(SelectionRangeRequest),
281        /// A request to interact with the code context.
282        InteractCodeContext(InteractCodeContextRequest),
283
284        /// A request to get extra text edits on enter.
285        OnEnter(OnEnterRequest),
286
287        /// A request to get the document metrics.
288        DocumentMetrics(DocumentMetricsRequest),
289        /// A request to get the workspace labels.
290        WorkspaceLabel(WorkspaceLabelRequest),
291        /// A request to get the server info.
292        ServerInfo(ServerInfoRequest),
293    }
294
295    impl CompilerQueryRequest {
296        /// Gets the feature of the fold request.
297        pub fn fold_feature(&self) -> FoldRequestFeature {
298            use FoldRequestFeature::*;
299            match self {
300                Self::OnExport(..) => Mergeable,
301                Self::OnExportMd(..) => Mergeable,
302                Self::Hover(..) => PinnedFirst,
303                Self::GotoDefinition(..) => PinnedFirst,
304                Self::GotoDeclaration(..) => PinnedFirst,
305                Self::References(..) => PinnedFirst,
306                Self::InlayHint(..) => Unique,
307                Self::DocumentColor(..) => PinnedFirst,
308                Self::DocumentLink(..) => PinnedFirst,
309                Self::DocumentHighlight(..) => PinnedFirst,
310                Self::ColorPresentation(..) => ContextFreeUnique,
311                Self::CodeAction(..) => Unique,
312                Self::CodeLens(..) => Unique,
313                Self::Completion(..) => Mergeable,
314                Self::SignatureHelp(..) => PinnedFirst,
315                Self::Rename(..) => Mergeable,
316                Self::WillRenameFiles(..) => Mergeable,
317                Self::PrepareRename(..) => Mergeable,
318                Self::DocumentSymbol(..) => ContextFreeUnique,
319                Self::WorkspaceLabel(..) => Mergeable,
320                Self::Symbol(..) => Mergeable,
321                Self::SemanticTokensFull(..) => PinnedFirst,
322                Self::SemanticTokensDelta(..) => PinnedFirst,
323                Self::Formatting(..) => ContextFreeUnique,
324                Self::FoldingRange(..) => ContextFreeUnique,
325                Self::SelectionRange(..) => ContextFreeUnique,
326                Self::InteractCodeContext(..) => PinnedFirst,
327
328                Self::OnEnter(..) => ContextFreeUnique,
329
330                Self::DocumentMetrics(..) => PinnedFirst,
331                Self::ServerInfo(..) => Mergeable,
332            }
333        }
334
335        /// Gets the associated path of the request.
336        pub fn associated_path(&self) -> Option<&Path> {
337            Some(match self {
338                Self::OnExport(..) => return None,
339                Self::OnExportMd(..) => return None,
340                Self::Hover(req) => &req.path,
341                Self::GotoDefinition(req) => &req.path,
342                Self::GotoDeclaration(req) => &req.path,
343                Self::References(req) => &req.path,
344                Self::InlayHint(req) => &req.path,
345                Self::DocumentColor(req) => &req.path,
346                Self::DocumentLink(req) => &req.path,
347                Self::DocumentHighlight(req) => &req.path,
348                Self::ColorPresentation(req) => &req.path,
349                Self::CodeAction(req) => &req.path,
350                Self::CodeLens(req) => &req.path,
351                Self::Completion(req) => &req.path,
352                Self::SignatureHelp(req) => &req.path,
353                Self::Rename(req) => &req.path,
354                Self::WillRenameFiles(..) => return None,
355                Self::PrepareRename(req) => &req.path,
356                Self::DocumentSymbol(req) => &req.path,
357                Self::Symbol(..) => return None,
358                Self::WorkspaceLabel(..) => return None,
359                Self::SemanticTokensFull(req) => &req.path,
360                Self::SemanticTokensDelta(req) => &req.path,
361                Self::Formatting(req) => &req.path,
362                Self::FoldingRange(req) => &req.path,
363                Self::SelectionRange(req) => &req.path,
364                Self::InteractCodeContext(req) => &req.path,
365
366                Self::OnEnter(req) => &req.path,
367
368                Self::DocumentMetrics(req) => &req.path,
369                Self::ServerInfo(..) => return None,
370            })
371        }
372    }
373
374    /// The response to the compiler query request.
375    #[derive(Debug, Clone, Serialize, Deserialize)]
376    #[serde(untagged)]
377    pub enum CompilerQueryResponse {
378        /// The response to the on export request.
379        OnExport(Option<OnExportResponse>),
380        /// The response to the hover request.
381        Hover(Option<Hover>),
382        /// The response to the goto definition request.
383        GotoDefinition(Option<GotoDefinitionResponse>),
384        /// The response to the goto declaration request.
385        GotoDeclaration(Option<GotoDeclarationResponse>),
386        /// The response to the references request.
387        References(Option<Vec<LspLocation>>),
388        /// The response to the inlay hint request.
389        InlayHint(Option<Vec<InlayHint>>),
390        /// The response to the document color request.
391        DocumentColor(Option<Vec<ColorInformation>>),
392        /// The response to the document link request.
393        DocumentLink(Option<Vec<DocumentLink>>),
394        /// The response to the document highlight request.
395        DocumentHighlight(Option<Vec<DocumentHighlight>>),
396        /// The response to the color presentation request.
397        ColorPresentation(Option<Vec<ColorPresentation>>),
398        /// The response to the code action request.
399        CodeAction(Option<Vec<CodeAction>>),
400        /// The response to the code lens request.
401        CodeLens(Option<Vec<CodeLens>>),
402        /// The response to the completion request.
403        Completion(Option<CompletionList>),
404        /// The response to the signature help request.
405        SignatureHelp(Option<SignatureHelp>),
406        /// The response to the prepare rename request.
407        PrepareRename(Option<PrepareRenameResponse>),
408        /// The response to the rename request.
409        Rename(Option<WorkspaceEdit>),
410        /// The response to the will rename files request.
411        WillRenameFiles(Option<WorkspaceEdit>),
412        /// The response to the document symbol request.
413        DocumentSymbol(Option<DocumentSymbolResponse>),
414        /// The response to the symbol request.
415        Symbol(Option<Vec<SymbolInformation>>),
416        /// The response to the workspace label request.
417        WorkspaceLabel(Option<Vec<SymbolInformation>>),
418        /// The response to the semantic tokens full request.
419        SemanticTokensFull(Option<SemanticTokensResult>),
420        /// The response to the semantic tokens delta request.
421        SemanticTokensDelta(Option<SemanticTokensFullDeltaResult>),
422        /// The response to the formatting request.
423        Formatting(Option<Vec<TextEdit>>),
424        /// The response to the folding range request.
425        FoldingRange(Option<Vec<FoldingRange>>),
426        /// The response to the selection range request.
427        SelectionRange(Option<Vec<SelectionRange>>),
428        /// The response to the interact code context request.
429        InteractCodeContext(Option<Vec<Option<InteractCodeContextResponse>>>),
430
431        /// The response to the on enter request.
432        OnEnter(Option<Vec<TextEdit>>),
433
434        /// The response to the document metrics request.
435        DocumentMetrics(Option<DocumentMetricsResponse>),
436        /// The response to the server info request.
437        ServerInfo(Option<HashMap<String, ServerInfoResponse>>),
438    }
439}
440
441pub use polymorphic::*;
442
443#[cfg(test)]
444mod tests;