A simple CPU rendered GUI IDE experience.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
use Default::default;
use lsp_types::*;
use serde_json::json;
pub fn get(workspace: WorkspaceFolder) -> InitializeParams {
    InitializeParams {
        process_id: Some(std::process::id()),

        capabilities: ClientCapabilities {
            window: Some(WindowClientCapabilities {
                work_done_progress: Some(true),
                ..default()
            }),
            workspace: Some(WorkspaceClientCapabilities {
                symbol: Some(WorkspaceSymbolClientCapabilities {
                    symbol_kind: Some(SymbolKindCapability {
                        value_set: Some(SymbolKind::ALL.to_vec()),
                    }),
                    tag_support: Some(TagSupport {
                        value_set: SymbolTag::ALL.to_vec(),
                    }),
                    resolve_support: Some(
                        WorkspaceSymbolResolveSupportCapability {
                            properties: vec!["location".into()],
                        },
                    ),
                    ..default()
                }),
                diagnostic: Some(DiagnosticWorkspaceClientCapabilities {
                    refresh_support: Some(true),
                }),
                inlay_hint: Some(InlayHintWorkspaceClientCapabilities {
                    refresh_support: Some(true),
                }),
                workspace_edit: Some(WorkspaceEditClientCapabilities {
                    document_changes: Some(true),
                    resource_operations: Some(vec![
                        ResourceOperationKind::Create,
                        ResourceOperationKind::Rename,
                        ResourceOperationKind::Delete,
                    ]),
                    failure_handling: Some(FailureHandlingKind::Abort),
                    normalizes_line_endings: Some(false),
                    change_annotation_support: Some(
                        ChangeAnnotationWorkspaceEditClientCapabilities {
                            groups_on_label: Some(false),
                        },
                    ),
                }),
                ..default()
            }),
            text_document: Some(TextDocumentClientCapabilities {
                on_type_formatting: Some(
                    DocumentOnTypeFormattingClientCapabilities {
                        dynamic_registration: Some(false),
                    },
                ),
                document_highlight: Some(default()),
                formatting: Some(DynamicRegistrationClientCapabilities {
                    dynamic_registration: Some(false),
                }),
                inlay_hint: Some(InlayHintClientCapabilities {
                    dynamic_registration: None,
                    resolve_support: Some(
                        InlayHintResolveClientCapabilities {
                            properties: vec![
                                "textEdits".into(),
                                "tooltip".into(),
                                "label.tooltip".into(),
                                "label.command".into(),
                            ],
                        },
                    ),
                }),
                document_symbol: Some(DocumentSymbolClientCapabilities {
                    tag_support: Some(TagSupport {
                        value_set: SymbolTag::ALL.to_vec(),
                    }),
                    symbol_kind: Some(SymbolKindCapability {
                        value_set: Some(SymbolKind::ALL.to_vec()),
                    }),
                    hierarchical_document_symbol_support: Some(true),
                    ..default()
                }),
                definition: Some(GotoCapability {
                    link_support: Some(true),
                    ..default()
                }),
                code_action: Some(CodeActionClientCapabilities {
                    data_support: Some(true),
                    resolve_support: Some(
                        CodeActionCapabilityResolveSupport {
                            properties: vec!["edit".to_string()],
                        },
                    ),
                    code_action_literal_support: Some(
                        CodeActionLiteralSupport {
                            code_action_kind:
                                CodeActionKindLiteralSupport {
                                    value_set: [
                                        "",
                                        "Empty",
                                        "QuickFix",
                                        "Refactor",
                                        "RefactorExtract",
                                        "RefactorInline",
                                        "RefactorRewrite",
                                        "Source",
                                        "SourceOrganizeImports",
                                        "quickfix",
                                        "refactor",
                                        "refactor.extract",
                                        "refactor.inline",
                                        "refactor.rewrite",
                                        "source",
                                        "source.organizeImports",
                                    ]
                                    .map(String::from)
                                    .into(),
                                },
                        },
                    ),
                    ..default()
                }),
                rename: Some(RenameClientCapabilities {
                    prepare_support: Some(true),
                    prepare_support_default_behavior: Some(
                        PrepareSupportDefaultBehavior::IDENTIFIER,
                    ),
                    honors_change_annotations: Some(false),
                    ..default()
                }),
                hover: Some(HoverClientCapabilities {
                    dynamic_registration: None,
                    content_format: Some(vec![
                        MarkupKind::PlainText,
                        MarkupKind::Markdown,
                    ]),
                }),
                diagnostic: Some(DiagnosticClientCapabilities {
                    dynamic_registration: None,
                    related_document_support: Some(true),
                }),
                publish_diagnostics: Some(
                    PublishDiagnosticsClientCapabilities {
                        related_information: Some(true),
                        code_description_support: Some(true),
                        data_support: Some(true),
                        ..default()
                    },
                ),
                signature_help: Some(SignatureHelpClientCapabilities {
                    dynamic_registration: None,
                    signature_information: Some(
                        SignatureInformationSettings {
                            documentation_format: Some(vec![
                                MarkupKind::Markdown,
                                MarkupKind::PlainText,
                            ]),
                            parameter_information: Some(
                                ParameterInformationSettings {
                                    label_offset_support: Some(true),
                                },
                            ),
                            active_parameter_support: Some(true),
                        },
                    ),
                    context_support: Some(false),
                }),
                completion: Some(CompletionClientCapabilities {
                    dynamic_registration: Some(false),
                    completion_item: Some(CompletionItemCapability {
                        snippet_support: Some(true),
                        commit_characters_support: Some(true),
                        documentation_format: Some(vec![
                            MarkupKind::Markdown,
                            MarkupKind::PlainText,
                        ]),
                        deprecated_support: None,
                        preselect_support: None,
                        tag_support: Some(TagSupport {
                            value_set: vec![CompletionItemTag::DEPRECATED],
                        }),

                        resolve_support: Some(
                            CompletionItemCapabilityResolveSupport {
                                properties: vec![
                                    "additionalTextEdits".into(),
                                    "documentation".into(),
                                ],
                            },
                        ),
                        insert_replace_support: Some(false),
                        insert_text_mode_support: Some(
                            InsertTextModeSupport {
                                value_set: vec![InsertTextMode::AS_IS],
                            },
                        ),
                        label_details_support: Some(true),
                        ..default()
                    }),
                    completion_item_kind: Some(
                        CompletionItemKindCapability {
                            value_set: Some(vec![
                                CompletionItemKind::TEXT,
                                CompletionItemKind::METHOD,
                                CompletionItemKind::FUNCTION,
                                CompletionItemKind::CONSTRUCTOR,
                                CompletionItemKind::FIELD,
                                CompletionItemKind::VARIABLE,
                                CompletionItemKind::CLASS,
                                CompletionItemKind::INTERFACE,
                                CompletionItemKind::MODULE,
                                CompletionItemKind::PROPERTY,
                                CompletionItemKind::UNIT,
                                CompletionItemKind::VALUE,
                                CompletionItemKind::ENUM,
                                CompletionItemKind::KEYWORD,
                                CompletionItemKind::SNIPPET,
                                CompletionItemKind::COLOR,
                                CompletionItemKind::FILE,
                                CompletionItemKind::REFERENCE,
                                CompletionItemKind::FOLDER,
                                CompletionItemKind::ENUM_MEMBER,
                                CompletionItemKind::CONSTANT,
                                CompletionItemKind::STRUCT,
                                CompletionItemKind::EVENT,
                                CompletionItemKind::OPERATOR,
                                CompletionItemKind::TYPE_PARAMETER,
                            ]),
                            // value_set: Some(vec![CompletionItemKind::]),
                        },
                    ),
                    context_support: None,
                    insert_text_mode: Some(InsertTextMode::AS_IS),
                    completion_list: Some(CompletionListCapability {
                        item_defaults: None,
                    }),
                }),
                semantic_tokens: Some(SemanticTokensClientCapabilities {
                    dynamic_registration: Some(false),
                    requests: SemanticTokensClientCapabilitiesRequests {
                        range: Some(true),
                        full: Some(
                            lsp_types::SemanticTokensFullOptions::Bool(
                                true,
                            ),
                        ),
                    },
                    token_modifiers: [
                        "associated",
                        "attribute",
                        "callable",
                        "constant",
                        "consuming",
                        "controlFlow",
                        "crateRoot",
                        "injected",
                        "intraDocLink",
                        "library",
                        "macro",
                        "mutable",
                        "procMacro",
                        "public",
                        "reference",
                        "trait",
                        "unsafe",
                    ]
                    .map(|x| x.into())
                    .to_vec(),
                    overlapping_token_support: Some(true),
                    multiline_token_support: Some(true),
                    server_cancel_support: Some(false),
                    augments_syntax_tokens: Some(false),
                    ..default()
                }),
                ..default()
            }),

            general: Some(GeneralClientCapabilities {
                markdown: Some(MarkdownClientCapabilities {
                    version: Some("1.0.0".into()),
                    parser: "markdown".into(),
                    allowed_tags: Some(vec![]),
                }),
                position_encodings: Some(vec![PositionEncodingKind::UTF8]),
                ..default()
            }),
            experimental: Some(json! {{
                "matchingBrace": true,
                "snippetTextEdit": true,
                "colorDiagnosticOutput": true,
                "codeActionGroup": true,
                "serverStatusNotification": true,
                "hoverActions": true,
                "workspaceSymbolScopeKindFiltering": true,
                "onEnter": true,
                "localDocs": true,
            }}),
            ..default()
        },
        client_info: Some(ClientInfo {
            name: "gracilaria".into(),
            version: Some(env!("CARGO_PKG_VERSION").into()),
        }),
        initialization_options: Some(ra_config()),
        trace: None,
        workspace_folders: Some(vec![workspace]),

        ..default()
    }
}
pub fn ra_config() -> serde_json::Value {
    json! {{
                "cargo": {
                    "buildScripts": { "enable": true }
                },
                "procMacro": {
                    "enable": true,
                    "attributes": { "enable": true }
                },
                "hover": {
                    "documentation": {
                        "keywords": { "enable": false },
                    },
                },
                "inlayHints": {
                    "closureReturnTypeHints": { "enable": "with_block" },
                    "closingBraceHints": { "minLines": 5 },
                    "closureStyle": "rust_analyzer",
                    "genericParameterHints": { "type": { "enable": true } },
                    "rangeExclusiveHints": { "enable": true },
                    "closureCaptureHints": { "enable": true },
                },
                "typing": { "triggerChars": ".=<>{(+" },
                "assist": { "preferSelf": true },
                "checkOnSave": true,
                "diagnostics": { "enable": true },
                "semanticHighlighting": {
                    "punctuation": {
                        "separate": {
                            "macroBang": true
                        },
                        "specialization": { "enable": true },
                        "enable": true
                    }
                },
                "workspace": {
                    "symbol": {
                        "search": { "limit": 1024 }
                    }
                },
                "showUnlinkedFileNotification": false,
                "completion": {
                    "fullFunctionSignatures": { "enable": true, },
                    "autoIter": { "enable": false, },
                    "autoImport": { "enable": true, },
                    "termSearch": { "enable": true, },
                    "autoself": { "enable": true, },
                    "privateEditable": { "enable": true },
                },
                "imports": {
                    "granularity": "group",
                },
            }
    }
}