Skip to main content

sh_layer3/lsp/
types.rs

1//! LSP 类型定义
2//!
3//! 定义 LSP 协议中使用的所有类型。
4
5use serde::{Deserialize, Serialize};
6
7// ============================================================================
8// 基础类型
9// ============================================================================
10
11/// 文档 URI
12pub type DocumentUri = String;
13
14/// 位置
15#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
16pub struct Position {
17    /// 行号(0-based)
18    pub line: u32,
19    /// 列号(0-based, UTF-16 code units)
20    pub character: u32,
21}
22
23impl Position {
24    pub fn new(line: u32, character: u32) -> Self {
25        Self { line, character }
26    }
27}
28
29/// 范围
30#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
31pub struct Range {
32    pub start: Position,
33    pub end: Position,
34}
35
36impl Range {
37    pub fn new(start: Position, end: Position) -> Self {
38        Self { start, end }
39    }
40}
41
42/// 文本编辑
43#[derive(Debug, Clone, Serialize, Deserialize)]
44pub struct TextEdit {
45    pub range: Range,
46    pub new_text: String,
47}
48
49/// 文档位置
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct Location {
52    pub uri: DocumentUri,
53    pub range: Range,
54}
55
56/// 文档链接位置(带额外信息)
57#[derive(Debug, Clone, Serialize, Deserialize)]
58pub struct LocationLink {
59    pub origin_selection_range: Option<Range>,
60    pub target_uri: DocumentUri,
61    pub target_range: Range,
62    pub target_selection_range: Range,
63}
64
65// ============================================================================
66// 文档同步
67// ============================================================================
68
69/// 文本文档内容变更事件
70#[derive(Debug, Clone, Serialize, Deserialize)]
71pub struct TextDocumentContentChangeEvent {
72    #[serde(skip_serializing_if = "Option::is_none")]
73    pub range: Option<Range>,
74    #[serde(skip_serializing_if = "Option::is_none")]
75    pub range_length: Option<u32>,
76    pub text: String,
77}
78
79/// 文本文档项
80#[derive(Debug, Clone, Serialize, Deserialize)]
81pub struct TextDocumentItem {
82    pub uri: DocumentUri,
83    pub language_id: String,
84    pub version: i32,
85    pub text: String,
86}
87
88/// 文本文档标识符
89#[derive(Debug, Clone, Serialize, Deserialize)]
90pub struct TextDocumentIdentifier {
91    pub uri: DocumentUri,
92}
93
94/// 版本化文本文档标识符
95#[derive(Debug, Clone, Serialize, Deserialize)]
96pub struct VersionedTextDocumentIdentifier {
97    pub uri: DocumentUri,
98    pub version: i32,
99}
100
101// ============================================================================
102// 诊断
103// ============================================================================
104
105/// 诊断严重程度
106#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
107#[serde(rename_all = "camelCase")]
108pub enum DiagnosticSeverity {
109    Error = 1,
110    Warning = 2,
111    Information = 3,
112    Hint = 4,
113}
114
115/// 诊断相关标签
116#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
117#[serde(rename_all = "camelCase")]
118pub enum DiagnosticTag {
119    Unnecessary = 1,
120    Deprecated = 2,
121}
122
123/// 诊断信息
124#[derive(Debug, Clone, Serialize, Deserialize)]
125pub struct Diagnostic {
126    pub range: Range,
127    pub severity: Option<DiagnosticSeverity>,
128    pub code: Option<serde_json::Value>,
129    #[serde(skip_serializing_if = "Option::is_none")]
130    pub code_description: Option<CodeDescription>,
131    pub source: Option<String>,
132    pub message: String,
133    #[serde(skip_serializing_if = "Option::is_none")]
134    pub tags: Option<Vec<DiagnosticTag>>,
135    #[serde(skip_serializing_if = "Option::is_none")]
136    pub related_information: Option<Vec<DiagnosticRelatedInformation>>,
137    #[serde(skip_serializing_if = "Option::is_none")]
138    pub data: Option<serde_json::Value>,
139}
140
141/// 代码描述
142#[derive(Debug, Clone, Serialize, Deserialize)]
143pub struct CodeDescription {
144    pub href: String,
145}
146
147/// 诊断相关信息
148#[derive(Debug, Clone, Serialize, Deserialize)]
149pub struct DiagnosticRelatedInformation {
150    pub location: Location,
151    pub message: String,
152}
153
154// ============================================================================
155// Hover
156// ============================================================================
157
158/// 标记内容
159#[derive(Debug, Clone, Serialize, Deserialize)]
160pub struct MarkupContent {
161    pub kind: MarkupKind,
162    pub value: String,
163}
164
165/// 标记类型
166#[derive(Debug, Clone, Serialize, Deserialize)]
167#[serde(rename_all = "camelCase")]
168pub enum MarkupKind {
169    PlainText,
170    Markdown,
171}
172
173/// Hover 结果
174#[derive(Debug, Clone, Serialize, Deserialize)]
175pub struct Hover {
176    pub contents: HoverContents,
177    #[serde(skip_serializing_if = "Option::is_none")]
178    pub range: Option<Range>,
179}
180
181/// Hover 内容
182#[derive(Debug, Clone, Serialize, Deserialize)]
183#[serde(untagged)]
184pub enum HoverContents {
185    Markup(MarkupContent),
186    String(String),
187    Array(Vec<MarkedString>),
188}
189
190/// 标记字符串
191#[derive(Debug, Clone, Serialize, Deserialize)]
192#[serde(untagged)]
193pub enum MarkedString {
194    String(String),
195    LanguageString(LanguageString),
196}
197
198/// 语言字符串
199#[derive(Debug, Clone, Serialize, Deserialize)]
200pub struct LanguageString {
201    pub language: String,
202    pub value: String,
203}
204
205// ============================================================================
206// Definition / References
207// ============================================================================
208
209/// 定义结果
210#[derive(Debug, Clone, Serialize, Deserialize)]
211#[serde(untagged)]
212pub enum DefinitionResult {
213    Single(Location),
214    Multiple(Vec<Location>),
215    Link(LocationLink),
216    Links(Vec<LocationLink>),
217}
218
219impl DefinitionResult {
220    /// 转换为位置列表
221    pub fn to_locations(&self) -> Vec<Location> {
222        match self {
223            DefinitionResult::Single(loc) => vec![loc.clone()],
224            DefinitionResult::Multiple(locs) => locs.clone(),
225            DefinitionResult::Link(link) => vec![Location {
226                uri: link.target_uri.clone(),
227                range: link.target_selection_range.clone(),
228            }],
229            DefinitionResult::Links(links) => links
230                .iter()
231                .map(|link| Location {
232                    uri: link.target_uri.clone(),
233                    range: link.target_selection_range.clone(),
234                })
235                .collect(),
236        }
237    }
238}
239
240/// 引用上下文
241#[derive(Debug, Clone, Serialize, Deserialize)]
242pub struct ReferenceContext {
243    /// 是否包含声明
244    pub include_declaration: bool,
245}
246
247/// 引用结果
248pub type ReferenceResult = Vec<Location>;
249
250// ============================================================================
251// Rename
252// ============================================================================
253
254/// 工作区编辑
255#[derive(Debug, Clone, Serialize, Deserialize)]
256pub struct WorkspaceEdit {
257    #[serde(skip_serializing_if = "Option::is_none")]
258    pub changes: Option<std::collections::HashMap<DocumentUri, Vec<TextEdit>>>,
259    #[serde(skip_serializing_if = "Option::is_none")]
260    pub document_changes: Option<Vec<DocumentChange>>,
261}
262
263/// 文档变更
264#[derive(Debug, Clone, Serialize, Deserialize)]
265pub struct DocumentChange {
266    pub text_document: VersionedTextDocumentIdentifier,
267    pub edits: Vec<TextEdit>,
268}
269
270/// 重命名结果
271pub type RenameResult = WorkspaceEdit;
272
273/// 准备重命名结果
274#[derive(Debug, Clone, Serialize, Deserialize)]
275#[serde(untagged)]
276pub enum PrepareRenameResult {
277    Range(Range),
278    RangeWithPlaceholder { range: Range, placeholder: String },
279}
280
281// ============================================================================
282// 符号
283// ============================================================================
284
285/// 符号类型
286#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
287#[serde(rename_all = "camelCase")]
288pub enum SymbolKind {
289    File = 1,
290    Module = 2,
291    Namespace = 3,
292    Package = 4,
293    Class = 5,
294    Method = 6,
295    Property = 7,
296    Field = 8,
297    Constructor = 9,
298    Enum = 10,
299    Interface = 11,
300    Function = 12,
301    Variable = 13,
302    Constant = 14,
303    String = 15,
304    Number = 16,
305    Boolean = 17,
306    Array = 18,
307    Object = 19,
308    Key = 20,
309    Null = 21,
310    EnumMember = 22,
311    Struct = 23,
312    Event = 24,
313    Operator = 25,
314    TypeParameter = 26,
315}
316
317/// 符号标签
318#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
319#[serde(rename_all = "camelCase")]
320pub enum SymbolTag {
321    Deprecated = 1,
322}
323
324/// 文档符号信息
325#[derive(Debug, Clone, Serialize, Deserialize)]
326pub struct DocumentSymbol {
327    pub name: String,
328    #[serde(skip_serializing_if = "Option::is_none")]
329    pub detail: Option<String>,
330    pub kind: SymbolKind,
331    #[serde(skip_serializing_if = "Option::is_none")]
332    pub tags: Option<Vec<SymbolTag>>,
333    pub deprecated: Option<bool>,
334    pub range: Range,
335    pub selection_range: Range,
336    #[serde(skip_serializing_if = "Option::is_none")]
337    pub children: Option<Vec<DocumentSymbol>>,
338}
339
340/// 符号信息
341#[derive(Debug, Clone, Serialize, Deserialize)]
342pub struct SymbolInformation {
343    pub name: String,
344    pub kind: SymbolKind,
345    #[serde(skip_serializing_if = "Option::is_none")]
346    pub tags: Option<Vec<SymbolTag>>,
347    pub deprecated: Option<bool>,
348    pub location: Location,
349    #[serde(skip_serializing_if = "Option::is_none")]
350    pub container_name: Option<String>,
351}
352
353// ============================================================================
354// 完成提示
355// ============================================================================
356
357/// 完成项类型
358#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
359#[serde(rename_all = "camelCase")]
360pub enum CompletionItemKind {
361    Text = 1,
362    Method = 2,
363    Function = 3,
364    Constructor = 4,
365    Field = 5,
366    Variable = 6,
367    Class = 7,
368    Interface = 8,
369    Module = 9,
370    Property = 10,
371    Unit = 11,
372    Value = 12,
373    Enum = 13,
374    Keyword = 14,
375    Snippet = 15,
376    Color = 16,
377    File = 17,
378    Reference = 18,
379    Folder = 19,
380    EnumMember = 20,
381    Constant = 21,
382    Struct = 22,
383    Event = 23,
384    Operator = 24,
385    TypeParameter = 25,
386}
387
388/// 完成项
389#[derive(Debug, Clone, Serialize, Deserialize)]
390pub struct CompletionItem {
391    pub label: String,
392    #[serde(skip_serializing_if = "Option::is_none")]
393    pub kind: Option<CompletionItemKind>,
394    #[serde(skip_serializing_if = "Option::is_none")]
395    pub detail: Option<String>,
396    #[serde(skip_serializing_if = "Option::is_none")]
397    pub documentation: Option<MarkupContent>,
398    #[serde(skip_serializing_if = "Option::is_none")]
399    pub deprecated: Option<bool>,
400    #[serde(skip_serializing_if = "Option::is_none")]
401    pub insert_text: Option<String>,
402}
403
404/// 完成列表
405#[derive(Debug, Clone, Serialize, Deserialize)]
406pub struct CompletionList {
407    pub is_incomplete: bool,
408    pub items: Vec<CompletionItem>,
409}
410
411/// 完成结果
412#[derive(Debug, Clone, Serialize, Deserialize)]
413#[serde(untagged)]
414pub enum CompletionResult {
415    List(CompletionList),
416    Items(Vec<CompletionItem>),
417}
418
419// ============================================================================
420// 服务端能力
421// ============================================================================
422
423/// 服务端能力
424#[derive(Debug, Clone, Default, Serialize, Deserialize)]
425pub struct ServerCapabilities {
426    #[serde(skip_serializing_if = "Option::is_none")]
427    pub text_document_sync: Option<TextDocumentSyncCapability>,
428    #[serde(skip_serializing_if = "Option::is_none")]
429    pub completion_provider: Option<CompletionOptions>,
430    #[serde(skip_serializing_if = "Option::is_none")]
431    pub hover_provider: Option<bool>,
432    #[serde(skip_serializing_if = "Option::is_none")]
433    pub definition_provider: Option<bool>,
434    #[serde(skip_serializing_if = "Option::is_none")]
435    pub references_provider: Option<bool>,
436    #[serde(skip_serializing_if = "Option::is_none")]
437    pub document_symbol_provider: Option<bool>,
438    #[serde(skip_serializing_if = "Option::is_none")]
439    pub rename_provider: Option<RenameOptions>,
440    #[serde(skip_serializing_if = "Option::is_none")]
441    pub workspace_symbol_provider: Option<bool>,
442    #[serde(skip_serializing_if = "Option::is_none")]
443    pub code_action_provider: Option<bool>,
444    #[serde(skip_serializing_if = "Option::is_none")]
445    pub signature_help_provider: Option<SignatureHelpOptions>,
446    #[serde(skip_serializing_if = "Option::is_none")]
447    pub document_formatting_provider: Option<bool>,
448    #[serde(skip_serializing_if = "Option::is_none")]
449    pub document_range_formatting_provider: Option<bool>,
450    #[serde(skip_serializing_if = "Option::is_none")]
451    pub document_highlight_provider: Option<bool>,
452    #[serde(skip_serializing_if = "Option::is_none")]
453    pub implementation_provider: Option<bool>,
454    #[serde(skip_serializing_if = "Option::is_none")]
455    pub type_definition_provider: Option<bool>,
456}
457
458/// 签名帮助选项
459#[derive(Debug, Clone, Serialize, Deserialize)]
460pub struct SignatureHelpOptions {
461    #[serde(skip_serializing_if = "Option::is_none")]
462    pub trigger_characters: Option<Vec<String>>,
463    #[serde(skip_serializing_if = "Option::is_none")]
464    pub retrigger_characters: Option<Vec<String>>,
465}
466
467/// 文档同步能力
468#[derive(Debug, Clone, Serialize, Deserialize)]
469pub struct TextDocumentSyncCapability {
470    #[serde(skip_serializing_if = "Option::is_none")]
471    pub open_close: Option<bool>,
472    #[serde(skip_serializing_if = "Option::is_none")]
473    pub change: Option<i32>,
474    #[serde(skip_serializing_if = "Option::is_none")]
475    pub will_save: Option<bool>,
476    #[serde(skip_serializing_if = "Option::is_none")]
477    pub will_save_wait_until: Option<bool>,
478    #[serde(skip_serializing_if = "Option::is_none")]
479    pub save: Option<bool>,
480}
481
482/// 完成选项
483#[derive(Debug, Clone, Serialize, Deserialize)]
484pub struct CompletionOptions {
485    #[serde(skip_serializing_if = "Option::is_none")]
486    pub trigger_characters: Option<Vec<String>>,
487    #[serde(skip_serializing_if = "Option::is_none")]
488    pub resolve_provider: Option<bool>,
489}
490
491/// 重命名选项
492#[derive(Debug, Clone, Serialize, Deserialize)]
493pub struct RenameOptions {
494    #[serde(skip_serializing_if = "Option::is_none")]
495    pub prepare_provider: Option<bool>,
496}
497
498/// 初始化结果
499#[derive(Debug, Clone, Serialize, Deserialize)]
500pub struct InitializeResult {
501    pub capabilities: ServerCapabilities,
502    #[serde(skip_serializing_if = "Option::is_none")]
503    pub server_info: Option<ServerInfo>,
504}
505
506/// 服务端信息
507#[derive(Debug, Clone, Serialize, Deserialize)]
508pub struct ServerInfo {
509    pub name: String,
510    #[serde(skip_serializing_if = "Option::is_none")]
511    pub version: Option<String>,
512}
513
514/// 初始化参数
515#[derive(Debug, Clone, Serialize, Deserialize)]
516pub struct InitializeParams {
517    pub process_id: Option<u32>,
518    pub client_info: Option<ClientInfo>,
519    pub root_uri: Option<DocumentUri>,
520    pub capabilities: ClientCapabilities,
521}
522
523/// 客户端信息
524#[derive(Debug, Clone, Serialize, Deserialize)]
525pub struct ClientInfo {
526    pub name: String,
527    #[serde(skip_serializing_if = "Option::is_none")]
528    pub version: Option<String>,
529}
530
531/// 客户端能力
532#[derive(Debug, Clone, Serialize, Deserialize)]
533pub struct ClientCapabilities {
534    #[serde(skip_serializing_if = "Option::is_none")]
535    pub text_document: Option<TextDocumentClientCapabilities>,
536}
537
538/// 文档客户端能力
539#[derive(Debug, Clone, Serialize, Deserialize)]
540pub struct TextDocumentClientCapabilities {
541    #[serde(skip_serializing_if = "Option::is_none")]
542    pub completion: Option<CompletionClientCapabilities>,
543    #[serde(skip_serializing_if = "Option::is_none")]
544    pub hover: Option<HoverClientCapabilities>,
545}
546
547/// 完成客户端能力
548#[derive(Debug, Clone, Serialize, Deserialize)]
549pub struct CompletionClientCapabilities {
550    #[serde(skip_serializing_if = "Option::is_none")]
551    pub completion_item: Option<CompletionItemCapability>,
552}
553
554/// 完成项能力
555#[derive(Debug, Clone, Serialize, Deserialize)]
556pub struct CompletionItemCapability {
557    #[serde(skip_serializing_if = "Option::is_none")]
558    pub documentation_format: Option<Vec<String>>,
559}
560
561/// Hover 客户端能力
562#[derive(Debug, Clone, Serialize, Deserialize)]
563pub struct HoverClientCapabilities {
564    #[serde(skip_serializing_if = "Option::is_none")]
565    pub content_format: Option<Vec<String>>,
566}
567
568// ============================================================================
569// Code Actions
570// ============================================================================
571
572/// 代码动作种类
573#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
574#[serde(rename_all = "camelCase")]
575pub enum CodeActionKind {
576    Empty,
577    QuickFix,
578    Refactor,
579    RefactorExtract,
580    RefactorInline,
581    RefactorRewrite,
582    Source,
583    SourceOrganizeImports,
584    SourceFixAll,
585}
586
587/// 代码动作上下文
588#[derive(Debug, Clone, Serialize, Deserialize)]
589pub struct CodeActionContext {
590    pub diagnostics: Vec<Diagnostic>,
591    #[serde(skip_serializing_if = "Option::is_none")]
592    pub only: Option<Vec<CodeActionKind>>,
593}
594
595/// 代码动作
596#[derive(Debug, Clone, Serialize, Deserialize)]
597pub struct CodeAction {
598    pub title: String,
599    #[serde(skip_serializing_if = "Option::is_none")]
600    pub kind: Option<CodeActionKind>,
601    #[serde(skip_serializing_if = "Option::is_none")]
602    pub diagnostics: Option<Vec<Diagnostic>>,
603    #[serde(skip_serializing_if = "Option::is_none")]
604    pub edit: Option<WorkspaceEdit>,
605    #[serde(skip_serializing_if = "Option::is_none")]
606    pub command: Option<Command>,
607}
608
609/// 命令
610#[derive(Debug, Clone, Serialize, Deserialize)]
611pub struct Command {
612    pub title: String,
613    pub command: String,
614    #[serde(skip_serializing_if = "Option::is_none")]
615    pub arguments: Option<Vec<serde_json::Value>>,
616}
617
618// ============================================================================
619// Signature Help
620// ============================================================================
621
622/// 签名信息
623#[derive(Debug, Clone, Serialize, Deserialize)]
624pub struct SignatureInformation {
625    pub label: String,
626    #[serde(skip_serializing_if = "Option::is_none")]
627    pub documentation: Option<MarkupContent>,
628    #[serde(skip_serializing_if = "Option::is_none")]
629    pub parameters: Option<Vec<ParameterInformation>>,
630}
631
632/// 参数信息
633#[derive(Debug, Clone, Serialize, Deserialize)]
634pub struct ParameterInformation {
635    pub label: ParameterLabel,
636    #[serde(skip_serializing_if = "Option::is_none")]
637    pub documentation: Option<MarkupContent>,
638}
639
640/// 参数标签
641#[derive(Debug, Clone, Serialize, Deserialize)]
642#[serde(untagged)]
643pub enum ParameterLabel {
644    String(String),
645    Range([u32; 2]),
646}
647
648/// 签名帮助
649#[derive(Debug, Clone, Serialize, Deserialize)]
650pub struct SignatureHelp {
651    pub signatures: Vec<SignatureInformation>,
652    #[serde(skip_serializing_if = "Option::is_none")]
653    pub active_signature: Option<u32>,
654    #[serde(skip_serializing_if = "Option::is_none")]
655    pub active_parameter: Option<u32>,
656}
657
658// ============================================================================
659// Document Highlight
660// ============================================================================
661
662/// 文档高亮种类
663#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
664#[serde(rename_all = "camelCase")]
665pub enum DocumentHighlightKind {
666    Text = 1,
667    Read = 2,
668    Write = 3,
669}
670
671/// 文档高亮
672#[derive(Debug, Clone, Serialize, Deserialize)]
673pub struct DocumentHighlight {
674    pub range: Range,
675    #[serde(skip_serializing_if = "Option::is_none")]
676    pub kind: Option<DocumentHighlightKind>,
677}
678
679// ============================================================================
680// Formatting
681// ============================================================================
682
683/// 格式化选项
684#[derive(Debug, Clone, Serialize, Deserialize)]
685pub struct FormattingOptions {
686    pub tab_size: u32,
687    pub insert_spaces: bool,
688    #[serde(skip_serializing_if = "Option::is_none")]
689    pub trim_trailing_whitespace: Option<bool>,
690    #[serde(skip_serializing_if = "Option::is_none")]
691    pub insert_final_newline: Option<bool>,
692    #[serde(skip_serializing_if = "Option::is_none")]
693    pub trim_final_newlines: Option<bool>,
694}
695
696// ============================================================================
697// Publish Diagnostics
698// ============================================================================
699
700/// 发布诊断参数
701#[derive(Debug, Clone, Serialize, Deserialize)]
702pub struct PublishDiagnosticsParams {
703    pub uri: DocumentUri,
704    pub diagnostics: Vec<Diagnostic>,
705    #[serde(skip_serializing_if = "Option::is_none")]
706    pub version: Option<i32>,
707}