Bump version to 19.1.0git
[llvm-project.git] / clang-tools-extra / clangd / Protocol.h
bloba0f8b04bc4ffdb043212d13861d78e7dbc8ecdd2
1 //===--- Protocol.h - Language Server Protocol Implementation ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 //
9 // This file contains structs based on the LSP specification at
10 // https://github.com/Microsoft/language-server-protocol/blob/main/protocol.md
12 // This is not meant to be a complete implementation, new interfaces are added
13 // when they're needed.
15 // Each struct has a toJSON and fromJSON function, that converts between
16 // the struct and a JSON representation. (See JSON.h)
18 // Some structs also have operator<< serialization. This is for debugging and
19 // tests, and is not generally machine-readable.
21 //===----------------------------------------------------------------------===//
23 #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROTOCOL_H
24 #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_PROTOCOL_H
26 #include "URI.h"
27 #include "index/SymbolID.h"
28 #include "support/MemoryTree.h"
29 #include "clang/Index/IndexSymbol.h"
30 #include "llvm/ADT/SmallVector.h"
31 #include "llvm/Support/JSON.h"
32 #include "llvm/Support/raw_ostream.h"
33 #include <bitset>
34 #include <memory>
35 #include <optional>
36 #include <string>
37 #include <vector>
39 // This file is using the LSP syntax for identifier names which is different
40 // from the LLVM coding standard. To avoid the clang-tidy warnings, we're
41 // disabling one check here.
42 // NOLINTBEGIN(readability-identifier-naming)
44 namespace clang {
45 namespace clangd {
47 enum class ErrorCode {
48 // Defined by JSON RPC.
49 ParseError = -32700,
50 InvalidRequest = -32600,
51 MethodNotFound = -32601,
52 InvalidParams = -32602,
53 InternalError = -32603,
55 ServerNotInitialized = -32002,
56 UnknownErrorCode = -32001,
58 // Defined by the protocol.
59 RequestCancelled = -32800,
60 ContentModified = -32801,
62 // Models an LSP error as an llvm::Error.
63 class LSPError : public llvm::ErrorInfo<LSPError> {
64 public:
65 std::string Message;
66 ErrorCode Code;
67 static char ID;
69 LSPError(std::string Message, ErrorCode Code)
70 : Message(std::move(Message)), Code(Code) {}
72 void log(llvm::raw_ostream &OS) const override {
73 OS << int(Code) << ": " << Message;
75 std::error_code convertToErrorCode() const override {
76 return llvm::inconvertibleErrorCode();
80 bool fromJSON(const llvm::json::Value &, SymbolID &, llvm::json::Path);
81 llvm::json::Value toJSON(const SymbolID &);
83 // URI in "file" scheme for a file.
84 struct URIForFile {
85 URIForFile() = default;
87 /// Canonicalizes \p AbsPath via URI.
88 ///
89 /// File paths in URIForFile can come from index or local AST. Path from
90 /// index goes through URI transformation, and the final path is resolved by
91 /// URI scheme and could potentially be different from the original path.
92 /// Hence, we do the same transformation for all paths.
93 ///
94 /// Files can be referred to by several paths (e.g. in the presence of links).
95 /// Which one we prefer may depend on where we're coming from. \p TUPath is a
96 /// hint, and should usually be the main entrypoint file we're processing.
97 static URIForFile canonicalize(llvm::StringRef AbsPath,
98 llvm::StringRef TUPath);
100 static llvm::Expected<URIForFile> fromURI(const URI &U,
101 llvm::StringRef HintPath);
103 /// Retrieves absolute path to the file.
104 llvm::StringRef file() const { return File; }
106 explicit operator bool() const { return !File.empty(); }
107 std::string uri() const { return URI::createFile(File).toString(); }
109 friend bool operator==(const URIForFile &LHS, const URIForFile &RHS) {
110 return LHS.File == RHS.File;
113 friend bool operator!=(const URIForFile &LHS, const URIForFile &RHS) {
114 return !(LHS == RHS);
117 friend bool operator<(const URIForFile &LHS, const URIForFile &RHS) {
118 return LHS.File < RHS.File;
121 private:
122 explicit URIForFile(std::string &&File) : File(std::move(File)) {}
124 std::string File;
127 /// Serialize/deserialize \p URIForFile to/from a string URI.
128 llvm::json::Value toJSON(const URIForFile &U);
129 bool fromJSON(const llvm::json::Value &, URIForFile &, llvm::json::Path);
131 struct TextDocumentIdentifier {
132 /// The text document's URI.
133 URIForFile uri;
135 llvm::json::Value toJSON(const TextDocumentIdentifier &);
136 bool fromJSON(const llvm::json::Value &, TextDocumentIdentifier &,
137 llvm::json::Path);
139 struct VersionedTextDocumentIdentifier : public TextDocumentIdentifier {
140 /// The version number of this document. If a versioned text document
141 /// identifier is sent from the server to the client and the file is not open
142 /// in the editor (the server has not received an open notification before)
143 /// the server can send `null` to indicate that the version is known and the
144 /// content on disk is the master (as speced with document content ownership).
146 /// The version number of a document will increase after each change,
147 /// including undo/redo. The number doesn't need to be consecutive.
149 /// clangd extension: versions are optional, and synthesized if missing.
150 std::optional<std::int64_t> version;
152 llvm::json::Value toJSON(const VersionedTextDocumentIdentifier &);
153 bool fromJSON(const llvm::json::Value &, VersionedTextDocumentIdentifier &,
154 llvm::json::Path);
156 struct Position {
157 /// Line position in a document (zero-based).
158 int line = 0;
160 /// Character offset on a line in a document (zero-based).
161 /// WARNING: this is in UTF-16 codepoints, not bytes or characters!
162 /// Use the functions in SourceCode.h to construct/interpret Positions.
163 int character = 0;
165 friend bool operator==(const Position &LHS, const Position &RHS) {
166 return std::tie(LHS.line, LHS.character) ==
167 std::tie(RHS.line, RHS.character);
169 friend bool operator!=(const Position &LHS, const Position &RHS) {
170 return !(LHS == RHS);
172 friend bool operator<(const Position &LHS, const Position &RHS) {
173 return std::tie(LHS.line, LHS.character) <
174 std::tie(RHS.line, RHS.character);
176 friend bool operator<=(const Position &LHS, const Position &RHS) {
177 return std::tie(LHS.line, LHS.character) <=
178 std::tie(RHS.line, RHS.character);
181 bool fromJSON(const llvm::json::Value &, Position &, llvm::json::Path);
182 llvm::json::Value toJSON(const Position &);
183 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Position &);
185 struct Range {
186 /// The range's start position.
187 Position start;
189 /// The range's end position.
190 Position end;
192 friend bool operator==(const Range &LHS, const Range &RHS) {
193 return std::tie(LHS.start, LHS.end) == std::tie(RHS.start, RHS.end);
195 friend bool operator!=(const Range &LHS, const Range &RHS) {
196 return !(LHS == RHS);
198 friend bool operator<(const Range &LHS, const Range &RHS) {
199 return std::tie(LHS.start, LHS.end) < std::tie(RHS.start, RHS.end);
202 bool contains(Position Pos) const { return start <= Pos && Pos < end; }
203 bool contains(Range Rng) const {
204 return start <= Rng.start && Rng.end <= end;
207 bool fromJSON(const llvm::json::Value &, Range &, llvm::json::Path);
208 llvm::json::Value toJSON(const Range &);
209 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Range &);
211 struct Location {
212 /// The text document's URI.
213 URIForFile uri;
214 Range range;
216 friend bool operator==(const Location &LHS, const Location &RHS) {
217 return LHS.uri == RHS.uri && LHS.range == RHS.range;
220 friend bool operator!=(const Location &LHS, const Location &RHS) {
221 return !(LHS == RHS);
224 friend bool operator<(const Location &LHS, const Location &RHS) {
225 return std::tie(LHS.uri, LHS.range) < std::tie(RHS.uri, RHS.range);
228 llvm::json::Value toJSON(const Location &);
229 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Location &);
231 /// Extends Locations returned by textDocument/references with extra info.
232 /// This is a clangd extension: LSP uses `Location`.
233 struct ReferenceLocation : Location {
234 /// clangd extension: contains the name of the function or class in which the
235 /// reference occurs
236 std::optional<std::string> containerName;
238 llvm::json::Value toJSON(const ReferenceLocation &);
239 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const ReferenceLocation &);
241 using ChangeAnnotationIdentifier = std::string;
242 // A combination of a LSP standard TextEdit and AnnotatedTextEdit.
243 struct TextEdit {
244 /// The range of the text document to be manipulated. To insert
245 /// text into a document create a range where start === end.
246 Range range;
248 /// The string to be inserted. For delete operations use an
249 /// empty string.
250 std::string newText;
252 /// The actual annotation identifier (optional)
253 /// If empty, then this field is nullopt.
254 ChangeAnnotationIdentifier annotationId = "";
256 inline bool operator==(const TextEdit &L, const TextEdit &R) {
257 return std::tie(L.newText, L.range, L.annotationId) ==
258 std::tie(R.newText, R.range, L.annotationId);
260 bool fromJSON(const llvm::json::Value &, TextEdit &, llvm::json::Path);
261 llvm::json::Value toJSON(const TextEdit &);
262 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const TextEdit &);
264 struct ChangeAnnotation {
265 /// A human-readable string describing the actual change. The string
266 /// is rendered prominent in the user interface.
267 std::string label;
269 /// A flag which indicates that user confirmation is needed
270 /// before applying the change.
271 std::optional<bool> needsConfirmation;
273 /// A human-readable string which is rendered less prominent in
274 /// the user interface.
275 std::string description;
277 bool fromJSON(const llvm::json::Value &, ChangeAnnotation &, llvm::json::Path);
278 llvm::json::Value toJSON(const ChangeAnnotation &);
280 struct TextDocumentEdit {
281 /// The text document to change.
282 VersionedTextDocumentIdentifier textDocument;
284 /// The edits to be applied.
285 /// FIXME: support the AnnotatedTextEdit variant.
286 std::vector<TextEdit> edits;
288 bool fromJSON(const llvm::json::Value &, TextDocumentEdit &, llvm::json::Path);
289 llvm::json::Value toJSON(const TextDocumentEdit &);
291 struct TextDocumentItem {
292 /// The text document's URI.
293 URIForFile uri;
295 /// The text document's language identifier.
296 std::string languageId;
298 /// The version number of this document (it will strictly increase after each
299 /// change, including undo/redo.
301 /// clangd extension: versions are optional, and synthesized if missing.
302 std::optional<int64_t> version;
304 /// The content of the opened text document.
305 std::string text;
307 bool fromJSON(const llvm::json::Value &, TextDocumentItem &, llvm::json::Path);
309 enum class TraceLevel {
310 Off = 0,
311 Messages = 1,
312 Verbose = 2,
314 bool fromJSON(const llvm::json::Value &E, TraceLevel &Out, llvm::json::Path);
316 struct NoParams {};
317 inline llvm::json::Value toJSON(const NoParams &) { return nullptr; }
318 inline bool fromJSON(const llvm::json::Value &, NoParams &, llvm::json::Path) {
319 return true;
321 using InitializedParams = NoParams;
323 /// Defines how the host (editor) should sync document changes to the language
324 /// server.
325 enum class TextDocumentSyncKind {
326 /// Documents should not be synced at all.
327 None = 0,
329 /// Documents are synced by always sending the full content of the document.
330 Full = 1,
332 /// Documents are synced by sending the full content on open. After that
333 /// only incremental updates to the document are send.
334 Incremental = 2,
337 /// The kind of a completion entry.
338 enum class CompletionItemKind {
339 Missing = 0,
340 Text = 1,
341 Method = 2,
342 Function = 3,
343 Constructor = 4,
344 Field = 5,
345 Variable = 6,
346 Class = 7,
347 Interface = 8,
348 Module = 9,
349 Property = 10,
350 Unit = 11,
351 Value = 12,
352 Enum = 13,
353 Keyword = 14,
354 Snippet = 15,
355 Color = 16,
356 File = 17,
357 Reference = 18,
358 Folder = 19,
359 EnumMember = 20,
360 Constant = 21,
361 Struct = 22,
362 Event = 23,
363 Operator = 24,
364 TypeParameter = 25,
366 bool fromJSON(const llvm::json::Value &, CompletionItemKind &,
367 llvm::json::Path);
368 constexpr auto CompletionItemKindMin =
369 static_cast<size_t>(CompletionItemKind::Text);
370 constexpr auto CompletionItemKindMax =
371 static_cast<size_t>(CompletionItemKind::TypeParameter);
372 using CompletionItemKindBitset = std::bitset<CompletionItemKindMax + 1>;
373 bool fromJSON(const llvm::json::Value &, CompletionItemKindBitset &,
374 llvm::json::Path);
375 CompletionItemKind
376 adjustKindToCapability(CompletionItemKind Kind,
377 CompletionItemKindBitset &SupportedCompletionItemKinds);
379 /// A symbol kind.
380 enum class SymbolKind {
381 File = 1,
382 Module = 2,
383 Namespace = 3,
384 Package = 4,
385 Class = 5,
386 Method = 6,
387 Property = 7,
388 Field = 8,
389 Constructor = 9,
390 Enum = 10,
391 Interface = 11,
392 Function = 12,
393 Variable = 13,
394 Constant = 14,
395 String = 15,
396 Number = 16,
397 Boolean = 17,
398 Array = 18,
399 Object = 19,
400 Key = 20,
401 Null = 21,
402 EnumMember = 22,
403 Struct = 23,
404 Event = 24,
405 Operator = 25,
406 TypeParameter = 26
408 bool fromJSON(const llvm::json::Value &, SymbolKind &, llvm::json::Path);
409 constexpr auto SymbolKindMin = static_cast<size_t>(SymbolKind::File);
410 constexpr auto SymbolKindMax = static_cast<size_t>(SymbolKind::TypeParameter);
411 using SymbolKindBitset = std::bitset<SymbolKindMax + 1>;
412 bool fromJSON(const llvm::json::Value &, SymbolKindBitset &, llvm::json::Path);
413 SymbolKind adjustKindToCapability(SymbolKind Kind,
414 SymbolKindBitset &supportedSymbolKinds);
416 // Convert a index::SymbolKind to clangd::SymbolKind (LSP)
417 // Note, some are not perfect matches and should be improved when this LSP
418 // issue is addressed:
419 // https://github.com/Microsoft/language-server-protocol/issues/344
420 SymbolKind indexSymbolKindToSymbolKind(index::SymbolKind Kind);
422 // Determines the encoding used to measure offsets and lengths of source in LSP.
423 enum class OffsetEncoding {
424 // Any string is legal on the wire. Unrecognized encodings parse as this.
425 UnsupportedEncoding,
426 // Length counts code units of UTF-16 encoded text. (Standard LSP behavior).
427 UTF16,
428 // Length counts bytes of UTF-8 encoded text. (Clangd extension).
429 UTF8,
430 // Length counts codepoints in unicode text. (Clangd extension).
431 UTF32,
433 llvm::json::Value toJSON(const OffsetEncoding &);
434 bool fromJSON(const llvm::json::Value &, OffsetEncoding &, llvm::json::Path);
435 llvm::raw_ostream &operator<<(llvm::raw_ostream &, OffsetEncoding);
437 // Describes the content type that a client supports in various result literals
438 // like `Hover`, `ParameterInfo` or `CompletionItem`.
439 enum class MarkupKind {
440 PlainText,
441 Markdown,
443 bool fromJSON(const llvm::json::Value &, MarkupKind &, llvm::json::Path);
444 llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, MarkupKind);
446 // This struct doesn't mirror LSP!
447 // The protocol defines deeply nested structures for client capabilities.
448 // Instead of mapping them all, this just parses out the bits we care about.
449 struct ClientCapabilities {
450 /// The supported set of SymbolKinds for workspace/symbol.
451 /// workspace.symbol.symbolKind.valueSet
452 std::optional<SymbolKindBitset> WorkspaceSymbolKinds;
454 /// Whether the client accepts diagnostics with codeActions attached inline.
455 /// textDocument.publishDiagnostics.codeActionsInline.
456 bool DiagnosticFixes = false;
458 /// Whether the client accepts diagnostics with related locations.
459 /// textDocument.publishDiagnostics.relatedInformation.
460 bool DiagnosticRelatedInformation = false;
462 /// Whether the client accepts diagnostics with category attached to it
463 /// using the "category" extension.
464 /// textDocument.publishDiagnostics.categorySupport
465 bool DiagnosticCategory = false;
467 /// Client supports snippets as insert text.
468 /// textDocument.completion.completionItem.snippetSupport
469 bool CompletionSnippets = false;
471 /// Client supports completions with additionalTextEdit near the cursor.
472 /// This is a clangd extension. (LSP says this is for unrelated text only).
473 /// textDocument.completion.editsNearCursor
474 bool CompletionFixes = false;
476 /// Client supports displaying a container string for results of
477 /// textDocument/reference (clangd extension)
478 bool ReferenceContainer = false;
480 /// Client supports hierarchical document symbols.
481 /// textDocument.documentSymbol.hierarchicalDocumentSymbolSupport
482 bool HierarchicalDocumentSymbol = false;
484 /// Client supports signature help.
485 /// textDocument.signatureHelp
486 bool HasSignatureHelp = false;
488 /// Client signals that it only supports folding complete lines.
489 /// Client will ignore specified `startCharacter` and `endCharacter`
490 /// properties in a FoldingRange.
491 /// textDocument.foldingRange.lineFoldingOnly
492 bool LineFoldingOnly = false;
494 /// Client supports processing label offsets instead of a simple label string.
495 /// textDocument.signatureHelp.signatureInformation.parameterInformation.labelOffsetSupport
496 bool OffsetsInSignatureHelp = false;
498 /// The documentation format that should be used for
499 /// textDocument/signatureHelp.
500 /// textDocument.signatureHelp.signatureInformation.documentationFormat
501 MarkupKind SignatureHelpDocumentationFormat = MarkupKind::PlainText;
503 /// The supported set of CompletionItemKinds for textDocument/completion.
504 /// textDocument.completion.completionItemKind.valueSet
505 std::optional<CompletionItemKindBitset> CompletionItemKinds;
507 /// The documentation format that should be used for textDocument/completion.
508 /// textDocument.completion.completionItem.documentationFormat
509 MarkupKind CompletionDocumentationFormat = MarkupKind::PlainText;
511 /// The client has support for completion item label details.
512 /// textDocument.completion.completionItem.labelDetailsSupport.
513 bool CompletionLabelDetail = false;
515 /// Client supports CodeAction return value for textDocument/codeAction.
516 /// textDocument.codeAction.codeActionLiteralSupport.
517 bool CodeActionStructure = false;
519 /// Client advertises support for the semanticTokens feature.
520 /// We support the textDocument/semanticTokens request in any case.
521 /// textDocument.semanticTokens
522 bool SemanticTokens = false;
523 /// Client supports Theia semantic highlighting extension.
524 /// https://github.com/microsoft/vscode-languageserver-node/pull/367
525 /// clangd no longer supports this, we detect it just to log a warning.
526 /// textDocument.semanticHighlightingCapabilities.semanticHighlighting
527 bool TheiaSemanticHighlighting = false;
529 /// Supported encodings for LSP character offsets. (clangd extension).
530 std::optional<std::vector<OffsetEncoding>> offsetEncoding;
532 /// The content format that should be used for Hover requests.
533 /// textDocument.hover.contentEncoding
534 MarkupKind HoverContentFormat = MarkupKind::PlainText;
536 /// The client supports testing for validity of rename operations
537 /// before execution.
538 bool RenamePrepareSupport = false;
540 /// The client supports progress notifications.
541 /// window.workDoneProgress
542 bool WorkDoneProgress = false;
544 /// The client supports implicit $/progress work-done progress streams,
545 /// without a preceding window/workDoneProgress/create.
546 /// This is a clangd extension.
547 /// window.implicitWorkDoneProgressCreate
548 bool ImplicitProgressCreation = false;
550 /// Whether the client claims to cancel stale requests.
551 /// general.staleRequestSupport.cancel
552 bool CancelsStaleRequests = false;
554 /// Whether the client implementation supports a refresh request sent from the
555 /// server to the client.
556 bool SemanticTokenRefreshSupport = false;
558 /// The client supports versioned document changes for WorkspaceEdit.
559 bool DocumentChanges = false;
561 /// The client supports change annotations on text edits,
562 bool ChangeAnnotation = false;
564 /// Whether the client supports the textDocument/inactiveRegions
565 /// notification. This is a clangd extension.
566 bool InactiveRegions = false;
568 bool fromJSON(const llvm::json::Value &, ClientCapabilities &,
569 llvm::json::Path);
571 /// Clangd extension that's used in the 'compilationDatabaseChanges' in
572 /// workspace/didChangeConfiguration to record updates to the in-memory
573 /// compilation database.
574 struct ClangdCompileCommand {
575 std::string workingDirectory;
576 std::vector<std::string> compilationCommand;
578 bool fromJSON(const llvm::json::Value &, ClangdCompileCommand &,
579 llvm::json::Path);
581 /// Clangd extension: parameters configurable at any time, via the
582 /// `workspace/didChangeConfiguration` notification.
583 /// LSP defines this type as `any`.
584 struct ConfigurationSettings {
585 // Changes to the in-memory compilation database.
586 // The key of the map is a file name.
587 std::map<std::string, ClangdCompileCommand> compilationDatabaseChanges;
589 bool fromJSON(const llvm::json::Value &, ConfigurationSettings &,
590 llvm::json::Path);
592 /// Clangd extension: parameters configurable at `initialize` time.
593 /// LSP defines this type as `any`.
594 struct InitializationOptions {
595 // What we can change through the didChangeConfiguration request, we can
596 // also set through the initialize request (initializationOptions field).
597 ConfigurationSettings ConfigSettings;
599 std::optional<std::string> compilationDatabasePath;
600 // Additional flags to be included in the "fallback command" used when
601 // the compilation database doesn't describe an opened file.
602 // The command used will be approximately `clang $FILE $fallbackFlags`.
603 std::vector<std::string> fallbackFlags;
605 /// Clients supports show file status for textDocument/clangd.fileStatus.
606 bool FileStatus = false;
608 bool fromJSON(const llvm::json::Value &, InitializationOptions &,
609 llvm::json::Path);
611 struct InitializeParams {
612 /// The process Id of the parent process that started
613 /// the server. Is null if the process has not been started by another
614 /// process. If the parent process is not alive then the server should exit
615 /// (see exit notification) its process.
616 std::optional<int> processId;
618 /// The rootPath of the workspace. Is null
619 /// if no folder is open.
621 /// @deprecated in favour of rootUri.
622 std::optional<std::string> rootPath;
624 /// The rootUri of the workspace. Is null if no
625 /// folder is open. If both `rootPath` and `rootUri` are set
626 /// `rootUri` wins.
627 std::optional<URIForFile> rootUri;
629 // User provided initialization options.
630 // initializationOptions?: any;
632 /// The capabilities provided by the client (editor or tool)
633 ClientCapabilities capabilities;
634 /// The same data as capabilities, but not parsed (to expose to modules).
635 llvm::json::Object rawCapabilities;
637 /// The initial trace setting. If omitted trace is disabled ('off').
638 std::optional<TraceLevel> trace;
640 /// User-provided initialization options.
641 InitializationOptions initializationOptions;
643 bool fromJSON(const llvm::json::Value &, InitializeParams &, llvm::json::Path);
645 struct WorkDoneProgressCreateParams {
646 /// The token to be used to report progress.
647 llvm::json::Value token = nullptr;
649 llvm::json::Value toJSON(const WorkDoneProgressCreateParams &P);
651 template <typename T> struct ProgressParams {
652 /// The progress token provided by the client or server.
653 llvm::json::Value token = nullptr;
655 /// The progress data.
656 T value;
658 template <typename T> llvm::json::Value toJSON(const ProgressParams<T> &P) {
659 return llvm::json::Object{{"token", P.token}, {"value", P.value}};
661 /// To start progress reporting a $/progress notification with the following
662 /// payload must be sent.
663 struct WorkDoneProgressBegin {
664 /// Mandatory title of the progress operation. Used to briefly inform about
665 /// the kind of operation being performed.
667 /// Examples: "Indexing" or "Linking dependencies".
668 std::string title;
670 /// Controls if a cancel button should show to allow the user to cancel the
671 /// long-running operation. Clients that don't support cancellation are
672 /// allowed to ignore the setting.
673 bool cancellable = false;
675 /// Optional progress percentage to display (value 100 is considered 100%).
676 /// If not provided infinite progress is assumed and clients are allowed
677 /// to ignore the `percentage` value in subsequent in report notifications.
679 /// The value should be steadily rising. Clients are free to ignore values
680 /// that are not following this rule.
682 /// Clangd implementation note: we only send nonzero percentages in
683 /// the WorkProgressReport. 'true' here means percentages will be used.
684 bool percentage = false;
686 llvm::json::Value toJSON(const WorkDoneProgressBegin &);
688 /// Reporting progress is done using the following payload.
689 struct WorkDoneProgressReport {
690 /// Mandatory title of the progress operation. Used to briefly inform about
691 /// the kind of operation being performed.
693 /// Examples: "Indexing" or "Linking dependencies".
694 std::string title;
696 /// Controls enablement state of a cancel button. This property is only valid
697 /// if a cancel button got requested in the `WorkDoneProgressStart` payload.
699 /// Clients that don't support cancellation or don't support control
700 /// the button's enablement state are allowed to ignore the setting.
701 std::optional<bool> cancellable;
703 /// Optional, more detailed associated progress message. Contains
704 /// complementary information to the `title`.
706 /// Examples: "3/25 files", "project/src/module2", "node_modules/some_dep".
707 /// If unset, the previous progress message (if any) is still valid.
708 std::optional<std::string> message;
710 /// Optional progress percentage to display (value 100 is considered 100%).
711 /// If not provided infinite progress is assumed and clients are allowed
712 /// to ignore the `percentage` value in subsequent in report notifications.
714 /// The value should be steadily rising. Clients are free to ignore values
715 /// that are not following this rule.
716 std::optional<unsigned> percentage;
718 llvm::json::Value toJSON(const WorkDoneProgressReport &);
720 /// Signals the end of progress reporting.
721 struct WorkDoneProgressEnd {
722 /// Optional, a final message indicating to for example indicate the outcome
723 /// of the operation.
724 std::optional<std::string> message;
726 llvm::json::Value toJSON(const WorkDoneProgressEnd &);
728 enum class MessageType {
729 /// An error message.
730 Error = 1,
731 /// A warning message.
732 Warning = 2,
733 /// An information message.
734 Info = 3,
735 /// A log message.
736 Log = 4,
738 llvm::json::Value toJSON(const MessageType &);
740 /// The show message notification is sent from a server to a client to ask the
741 /// client to display a particular message in the user interface.
742 struct ShowMessageParams {
743 /// The message type.
744 MessageType type = MessageType::Info;
745 /// The actual message.
746 std::string message;
748 llvm::json::Value toJSON(const ShowMessageParams &);
750 struct DidOpenTextDocumentParams {
751 /// The document that was opened.
752 TextDocumentItem textDocument;
754 bool fromJSON(const llvm::json::Value &, DidOpenTextDocumentParams &,
755 llvm::json::Path);
757 struct DidCloseTextDocumentParams {
758 /// The document that was closed.
759 TextDocumentIdentifier textDocument;
761 bool fromJSON(const llvm::json::Value &, DidCloseTextDocumentParams &,
762 llvm::json::Path);
764 struct DidSaveTextDocumentParams {
765 /// The document that was saved.
766 TextDocumentIdentifier textDocument;
768 bool fromJSON(const llvm::json::Value &, DidSaveTextDocumentParams &,
769 llvm::json::Path);
771 struct TextDocumentContentChangeEvent {
772 /// The range of the document that changed.
773 std::optional<Range> range;
775 /// The length of the range that got replaced.
776 std::optional<int> rangeLength;
778 /// The new text of the range/document.
779 std::string text;
781 bool fromJSON(const llvm::json::Value &, TextDocumentContentChangeEvent &,
782 llvm::json::Path);
784 struct DidChangeTextDocumentParams {
785 /// The document that did change. The version number points
786 /// to the version after all provided content changes have
787 /// been applied.
788 VersionedTextDocumentIdentifier textDocument;
790 /// The actual content changes.
791 std::vector<TextDocumentContentChangeEvent> contentChanges;
793 /// Forces diagnostics to be generated, or to not be generated, for this
794 /// version of the file. If not set, diagnostics are eventually consistent:
795 /// either they will be provided for this version or some subsequent one.
796 /// This is a clangd extension.
797 std::optional<bool> wantDiagnostics;
799 /// Force a complete rebuild of the file, ignoring all cached state. Slow!
800 /// This is useful to defeat clangd's assumption that missing headers will
801 /// stay missing.
802 /// This is a clangd extension.
803 bool forceRebuild = false;
805 bool fromJSON(const llvm::json::Value &, DidChangeTextDocumentParams &,
806 llvm::json::Path);
808 enum class FileChangeType {
809 /// The file got created.
810 Created = 1,
811 /// The file got changed.
812 Changed = 2,
813 /// The file got deleted.
814 Deleted = 3
816 bool fromJSON(const llvm::json::Value &E, FileChangeType &Out,
817 llvm::json::Path);
819 struct FileEvent {
820 /// The file's URI.
821 URIForFile uri;
822 /// The change type.
823 FileChangeType type = FileChangeType::Created;
825 bool fromJSON(const llvm::json::Value &, FileEvent &, llvm::json::Path);
827 struct DidChangeWatchedFilesParams {
828 /// The actual file events.
829 std::vector<FileEvent> changes;
831 bool fromJSON(const llvm::json::Value &, DidChangeWatchedFilesParams &,
832 llvm::json::Path);
834 struct DidChangeConfigurationParams {
835 ConfigurationSettings settings;
837 bool fromJSON(const llvm::json::Value &, DidChangeConfigurationParams &,
838 llvm::json::Path);
840 // Note: we do not parse FormattingOptions for *FormattingParams.
841 // In general, we use a clang-format style detected from common mechanisms
842 // (.clang-format files and the -fallback-style flag).
843 // It would be possible to override these with FormatOptions, but:
844 // - the protocol makes FormatOptions mandatory, so many clients set them to
845 // useless values, and we can't tell when to respect them
846 // - we also format in other places, where FormatOptions aren't available.
848 struct DocumentRangeFormattingParams {
849 /// The document to format.
850 TextDocumentIdentifier textDocument;
852 /// The range to format
853 Range range;
855 bool fromJSON(const llvm::json::Value &, DocumentRangeFormattingParams &,
856 llvm::json::Path);
858 struct DocumentOnTypeFormattingParams {
859 /// The document to format.
860 TextDocumentIdentifier textDocument;
862 /// The position at which this request was sent.
863 Position position;
865 /// The character that has been typed.
866 std::string ch;
868 bool fromJSON(const llvm::json::Value &, DocumentOnTypeFormattingParams &,
869 llvm::json::Path);
871 struct DocumentFormattingParams {
872 /// The document to format.
873 TextDocumentIdentifier textDocument;
875 bool fromJSON(const llvm::json::Value &, DocumentFormattingParams &,
876 llvm::json::Path);
878 struct DocumentSymbolParams {
879 // The text document to find symbols in.
880 TextDocumentIdentifier textDocument;
882 bool fromJSON(const llvm::json::Value &, DocumentSymbolParams &,
883 llvm::json::Path);
885 /// Represents a related message and source code location for a diagnostic.
886 /// This should be used to point to code locations that cause or related to a
887 /// diagnostics, e.g when duplicating a symbol in a scope.
888 struct DiagnosticRelatedInformation {
889 /// The location of this related diagnostic information.
890 Location location;
891 /// The message of this related diagnostic information.
892 std::string message;
894 llvm::json::Value toJSON(const DiagnosticRelatedInformation &);
896 enum DiagnosticTag {
897 /// Unused or unnecessary code.
899 /// Clients are allowed to render diagnostics with this tag faded out instead
900 /// of having an error squiggle.
901 Unnecessary = 1,
902 /// Deprecated or obsolete code.
904 /// Clients are allowed to rendered diagnostics with this tag strike through.
905 Deprecated = 2,
907 llvm::json::Value toJSON(DiagnosticTag Tag);
909 /// Structure to capture a description for an error code.
910 struct CodeDescription {
911 /// An URI to open with more information about the diagnostic error.
912 std::string href;
914 llvm::json::Value toJSON(const CodeDescription &);
916 struct CodeAction;
917 struct Diagnostic {
918 /// The range at which the message applies.
919 Range range;
921 /// The diagnostic's severity. Can be omitted. If omitted it is up to the
922 /// client to interpret diagnostics as error, warning, info or hint.
923 int severity = 0;
925 /// The diagnostic's code. Can be omitted.
926 std::string code;
928 /// An optional property to describe the error code.
929 std::optional<CodeDescription> codeDescription;
931 /// A human-readable string describing the source of this
932 /// diagnostic, e.g. 'typescript' or 'super lint'.
933 std::string source;
935 /// The diagnostic's message.
936 std::string message;
938 /// Additional metadata about the diagnostic.
939 llvm::SmallVector<DiagnosticTag, 1> tags;
941 /// An array of related diagnostic information, e.g. when symbol-names within
942 /// a scope collide all definitions can be marked via this property.
943 std::optional<std::vector<DiagnosticRelatedInformation>> relatedInformation;
945 /// The diagnostic's category. Can be omitted.
946 /// An LSP extension that's used to send the name of the category over to the
947 /// client. The category typically describes the compilation stage during
948 /// which the issue was produced, e.g. "Semantic Issue" or "Parse Issue".
949 std::optional<std::string> category;
951 /// Clangd extension: code actions related to this diagnostic.
952 /// Only with capability textDocument.publishDiagnostics.codeActionsInline.
953 /// (These actions can also be obtained using textDocument/codeAction).
954 std::optional<std::vector<CodeAction>> codeActions;
956 /// A data entry field that is preserved between a
957 /// `textDocument/publishDiagnostics` notification
958 /// and `textDocument/codeAction` request.
959 /// Mutating users should associate their data with a unique key they can use
960 /// to retrieve later on.
961 llvm::json::Object data;
963 llvm::json::Value toJSON(const Diagnostic &);
965 bool fromJSON(const llvm::json::Value &, Diagnostic &, llvm::json::Path);
966 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const Diagnostic &);
968 struct PublishDiagnosticsParams {
969 /// The URI for which diagnostic information is reported.
970 URIForFile uri;
971 /// An array of diagnostic information items.
972 std::vector<Diagnostic> diagnostics;
973 /// The version number of the document the diagnostics are published for.
974 std::optional<int64_t> version;
976 llvm::json::Value toJSON(const PublishDiagnosticsParams &);
978 struct CodeActionContext {
979 /// An array of diagnostics known on the client side overlapping the range
980 /// provided to the `textDocument/codeAction` request. They are provided so
981 /// that the server knows which errors are currently presented to the user for
982 /// the given range. There is no guarantee that these accurately reflect the
983 /// error state of the resource. The primary parameter to compute code actions
984 /// is the provided range.
985 std::vector<Diagnostic> diagnostics;
987 /// Requested kind of actions to return.
989 /// Actions not of this kind are filtered out by the client before being
990 /// shown. So servers can omit computing them.
991 std::vector<std::string> only;
993 bool fromJSON(const llvm::json::Value &, CodeActionContext &, llvm::json::Path);
995 struct CodeActionParams {
996 /// The document in which the command was invoked.
997 TextDocumentIdentifier textDocument;
999 /// The range for which the command was invoked.
1000 Range range;
1002 /// Context carrying additional information.
1003 CodeActionContext context;
1005 bool fromJSON(const llvm::json::Value &, CodeActionParams &, llvm::json::Path);
1007 /// The edit should either provide changes or documentChanges. If the client
1008 /// can handle versioned document edits and if documentChanges are present,
1009 /// the latter are preferred over changes.
1010 struct WorkspaceEdit {
1011 /// Holds changes to existing resources.
1012 std::optional<std::map<std::string, std::vector<TextEdit>>> changes;
1013 /// Versioned document edits.
1015 /// If a client neither supports `documentChanges` nor
1016 /// `workspace.workspaceEdit.resourceOperations` then only plain `TextEdit`s
1017 /// using the `changes` property are supported.
1018 std::optional<std::vector<TextDocumentEdit>> documentChanges;
1020 /// A map of change annotations that can be referenced in
1021 /// AnnotatedTextEdit.
1022 std::map<std::string, ChangeAnnotation> changeAnnotations;
1024 bool fromJSON(const llvm::json::Value &, WorkspaceEdit &, llvm::json::Path);
1025 llvm::json::Value toJSON(const WorkspaceEdit &WE);
1027 /// Arguments for the 'applyTweak' command. The server sends these commands as a
1028 /// response to the textDocument/codeAction request. The client can later send a
1029 /// command back to the server if the user requests to execute a particular code
1030 /// tweak.
1031 struct TweakArgs {
1032 /// A file provided by the client on a textDocument/codeAction request.
1033 URIForFile file;
1034 /// A selection provided by the client on a textDocument/codeAction request.
1035 Range selection;
1036 /// ID of the tweak that should be executed. Corresponds to Tweak::id().
1037 std::string tweakID;
1039 bool fromJSON(const llvm::json::Value &, TweakArgs &, llvm::json::Path);
1040 llvm::json::Value toJSON(const TweakArgs &A);
1042 struct ExecuteCommandParams {
1043 /// The identifier of the actual command handler.
1044 std::string command;
1046 // This is `arguments?: []any` in LSP.
1047 // All clangd's commands accept a single argument (or none => null).
1048 llvm::json::Value argument = nullptr;
1050 bool fromJSON(const llvm::json::Value &, ExecuteCommandParams &,
1051 llvm::json::Path);
1053 struct Command : public ExecuteCommandParams {
1054 std::string title;
1056 llvm::json::Value toJSON(const Command &C);
1058 /// A code action represents a change that can be performed in code, e.g. to fix
1059 /// a problem or to refactor code.
1061 /// A CodeAction must set either `edit` and/or a `command`. If both are
1062 /// supplied, the `edit` is applied first, then the `command` is executed.
1063 struct CodeAction {
1064 /// A short, human-readable, title for this code action.
1065 std::string title;
1067 /// The kind of the code action.
1068 /// Used to filter code actions.
1069 std::optional<std::string> kind;
1070 const static llvm::StringLiteral QUICKFIX_KIND;
1071 const static llvm::StringLiteral REFACTOR_KIND;
1072 const static llvm::StringLiteral INFO_KIND;
1074 /// The diagnostics that this code action resolves.
1075 std::optional<std::vector<Diagnostic>> diagnostics;
1077 /// Marks this as a preferred action. Preferred actions are used by the
1078 /// `auto fix` command and can be targeted by keybindings.
1079 /// A quick fix should be marked preferred if it properly addresses the
1080 /// underlying error. A refactoring should be marked preferred if it is the
1081 /// most reasonable choice of actions to take.
1082 bool isPreferred = false;
1084 /// The workspace edit this code action performs.
1085 std::optional<WorkspaceEdit> edit;
1087 /// A command this code action executes. If a code action provides an edit
1088 /// and a command, first the edit is executed and then the command.
1089 std::optional<Command> command;
1091 llvm::json::Value toJSON(const CodeAction &);
1093 /// Represents programming constructs like variables, classes, interfaces etc.
1094 /// that appear in a document. Document symbols can be hierarchical and they
1095 /// have two ranges: one that encloses its definition and one that points to its
1096 /// most interesting range, e.g. the range of an identifier.
1097 struct DocumentSymbol {
1098 /// The name of this symbol.
1099 std::string name;
1101 /// More detail for this symbol, e.g the signature of a function.
1102 std::string detail;
1104 /// The kind of this symbol.
1105 SymbolKind kind;
1107 /// Indicates if this symbol is deprecated.
1108 bool deprecated = false;
1110 /// The range enclosing this symbol not including leading/trailing whitespace
1111 /// but everything else like comments. This information is typically used to
1112 /// determine if the clients cursor is inside the symbol to reveal in the
1113 /// symbol in the UI.
1114 Range range;
1116 /// The range that should be selected and revealed when this symbol is being
1117 /// picked, e.g the name of a function. Must be contained by the `range`.
1118 Range selectionRange;
1120 /// Children of this symbol, e.g. properties of a class.
1121 std::vector<DocumentSymbol> children;
1123 llvm::raw_ostream &operator<<(llvm::raw_ostream &O, const DocumentSymbol &S);
1124 llvm::json::Value toJSON(const DocumentSymbol &S);
1126 /// Represents information about programming constructs like variables, classes,
1127 /// interfaces etc.
1128 struct SymbolInformation {
1129 /// The name of this symbol.
1130 std::string name;
1132 /// The kind of this symbol.
1133 SymbolKind kind;
1135 /// The location of this symbol.
1136 Location location;
1138 /// The name of the symbol containing this symbol.
1139 std::string containerName;
1141 /// The score that clangd calculates to rank the returned symbols.
1142 /// This excludes the fuzzy-matching score between `name` and the query.
1143 /// (Specifically, the last ::-separated component).
1144 /// This can be used to re-rank results as the user types, using client-side
1145 /// fuzzy-matching (that score should be multiplied with this one).
1146 /// This is a clangd extension, set only for workspace/symbol responses.
1147 std::optional<float> score;
1149 llvm::json::Value toJSON(const SymbolInformation &);
1150 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const SymbolInformation &);
1152 /// Represents information about identifier.
1153 /// This is returned from textDocument/symbolInfo, which is a clangd extension.
1154 struct SymbolDetails {
1155 std::string name;
1157 std::string containerName;
1159 /// Unified Symbol Resolution identifier
1160 /// This is an opaque string uniquely identifying a symbol.
1161 /// Unlike SymbolID, it is variable-length and somewhat human-readable.
1162 /// It is a common representation across several clang tools.
1163 /// (See USRGeneration.h)
1164 std::string USR;
1166 SymbolID ID;
1168 std::optional<Location> declarationRange;
1170 std::optional<Location> definitionRange;
1172 llvm::json::Value toJSON(const SymbolDetails &);
1173 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const SymbolDetails &);
1174 bool operator==(const SymbolDetails &, const SymbolDetails &);
1176 /// The parameters of a Workspace Symbol Request.
1177 struct WorkspaceSymbolParams {
1178 /// A query string to filter symbols by.
1179 /// Clients may send an empty string here to request all the symbols.
1180 std::string query;
1182 /// Max results to return, overriding global default. 0 means no limit.
1183 /// Clangd extension.
1184 std::optional<int> limit;
1186 bool fromJSON(const llvm::json::Value &, WorkspaceSymbolParams &,
1187 llvm::json::Path);
1189 struct ApplyWorkspaceEditParams {
1190 WorkspaceEdit edit;
1192 llvm::json::Value toJSON(const ApplyWorkspaceEditParams &);
1194 struct ApplyWorkspaceEditResponse {
1195 bool applied = true;
1196 std::optional<std::string> failureReason;
1198 bool fromJSON(const llvm::json::Value &, ApplyWorkspaceEditResponse &,
1199 llvm::json::Path);
1201 struct TextDocumentPositionParams {
1202 /// The text document.
1203 TextDocumentIdentifier textDocument;
1205 /// The position inside the text document.
1206 Position position;
1208 bool fromJSON(const llvm::json::Value &, TextDocumentPositionParams &,
1209 llvm::json::Path);
1211 enum class CompletionTriggerKind {
1212 /// Completion was triggered by typing an identifier (24x7 code
1213 /// complete), manual invocation (e.g Ctrl+Space) or via API.
1214 Invoked = 1,
1215 /// Completion was triggered by a trigger character specified by
1216 /// the `triggerCharacters` properties of the `CompletionRegistrationOptions`.
1217 TriggerCharacter = 2,
1218 /// Completion was re-triggered as the current completion list is incomplete.
1219 TriggerTriggerForIncompleteCompletions = 3
1222 struct CompletionContext {
1223 /// How the completion was triggered.
1224 CompletionTriggerKind triggerKind = CompletionTriggerKind::Invoked;
1225 /// The trigger character (a single character) that has trigger code complete.
1226 /// Is undefined if `triggerKind !== CompletionTriggerKind.TriggerCharacter`
1227 std::string triggerCharacter;
1229 bool fromJSON(const llvm::json::Value &, CompletionContext &, llvm::json::Path);
1231 struct CompletionParams : TextDocumentPositionParams {
1232 CompletionContext context;
1234 /// Max results to return, overriding global default. 0 means no limit.
1235 /// Clangd extension.
1236 std::optional<int> limit;
1238 bool fromJSON(const llvm::json::Value &, CompletionParams &, llvm::json::Path);
1240 struct MarkupContent {
1241 MarkupKind kind = MarkupKind::PlainText;
1242 std::string value;
1244 llvm::json::Value toJSON(const MarkupContent &MC);
1246 struct Hover {
1247 /// The hover's content
1248 MarkupContent contents;
1250 /// An optional range is a range inside a text document
1251 /// that is used to visualize a hover, e.g. by changing the background color.
1252 std::optional<Range> range;
1254 llvm::json::Value toJSON(const Hover &H);
1256 /// Defines whether the insert text in a completion item should be interpreted
1257 /// as plain text or a snippet.
1258 enum class InsertTextFormat {
1259 Missing = 0,
1260 /// The primary text to be inserted is treated as a plain string.
1261 PlainText = 1,
1262 /// The primary text to be inserted is treated as a snippet.
1264 /// A snippet can define tab stops and placeholders with `$1`, `$2`
1265 /// and `${3:foo}`. `$0` defines the final tab stop, it defaults to the end
1266 /// of the snippet. Placeholders with equal identifiers are linked, that is
1267 /// typing in one will update others too.
1269 /// See also:
1270 /// https://github.com/Microsoft/vscode/blob/main/src/vs/editor/contrib/snippet/snippet.md
1271 Snippet = 2,
1274 /// Additional details for a completion item label.
1275 struct CompletionItemLabelDetails {
1276 /// An optional string which is rendered less prominently directly after label
1277 /// without any spacing. Should be used for function signatures or type
1278 /// annotations.
1279 std::string detail;
1281 /// An optional string which is rendered less prominently after
1282 /// CompletionItemLabelDetails.detail. Should be used for fully qualified
1283 /// names or file path.
1284 std::string description;
1286 llvm::json::Value toJSON(const CompletionItemLabelDetails &);
1288 struct CompletionItem {
1289 /// The label of this completion item. By default also the text that is
1290 /// inserted when selecting this completion.
1291 std::string label;
1293 /// Additional details for the label.
1294 std::optional<CompletionItemLabelDetails> labelDetails;
1296 /// The kind of this completion item. Based of the kind an icon is chosen by
1297 /// the editor.
1298 CompletionItemKind kind = CompletionItemKind::Missing;
1300 /// A human-readable string with additional information about this item, like
1301 /// type or symbol information.
1302 std::string detail;
1304 /// A human-readable string that represents a doc-comment.
1305 std::optional<MarkupContent> documentation;
1307 /// A string that should be used when comparing this item with other items.
1308 /// When `falsy` the label is used.
1309 std::string sortText;
1311 /// A string that should be used when filtering a set of completion items.
1312 /// When `falsy` the label is used.
1313 std::string filterText;
1315 /// A string that should be inserted to a document when selecting this
1316 /// completion. When `falsy` the label is used.
1317 std::string insertText;
1319 /// The format of the insert text. The format applies to both the `insertText`
1320 /// property and the `newText` property of a provided `textEdit`.
1321 InsertTextFormat insertTextFormat = InsertTextFormat::Missing;
1323 /// An edit which is applied to a document when selecting this completion.
1324 /// When an edit is provided `insertText` is ignored.
1326 /// Note: The range of the edit must be a single line range and it must
1327 /// contain the position at which completion has been requested.
1328 std::optional<TextEdit> textEdit;
1330 /// An optional array of additional text edits that are applied when selecting
1331 /// this completion. Edits must not overlap with the main edit nor with
1332 /// themselves.
1333 std::vector<TextEdit> additionalTextEdits;
1335 /// Indicates if this item is deprecated.
1336 bool deprecated = false;
1338 /// The score that clangd calculates to rank the returned completions.
1339 /// This excludes the fuzzy-match between `filterText` and the partial word.
1340 /// This can be used to re-rank results as the user types, using client-side
1341 /// fuzzy-matching (that score should be multiplied with this one).
1342 /// This is a clangd extension.
1343 float score = 0.f;
1345 // TODO: Add custom commitCharacters for some of the completion items. For
1346 // example, it makes sense to use () only for the functions.
1347 // TODO(krasimir): The following optional fields defined by the language
1348 // server protocol are unsupported:
1350 // data?: any - A data entry field that is preserved on a completion item
1351 // between a completion and a completion resolve request.
1353 llvm::json::Value toJSON(const CompletionItem &);
1354 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const CompletionItem &);
1356 /// Remove the labelDetails field (for clients that don't support it).
1357 /// Places the information into other fields of the completion item.
1358 void removeCompletionLabelDetails(CompletionItem &);
1360 bool operator<(const CompletionItem &, const CompletionItem &);
1362 /// Represents a collection of completion items to be presented in the editor.
1363 struct CompletionList {
1364 /// The list is not complete. Further typing should result in recomputing the
1365 /// list.
1366 bool isIncomplete = false;
1368 /// The completion items.
1369 std::vector<CompletionItem> items;
1371 llvm::json::Value toJSON(const CompletionList &);
1373 /// A single parameter of a particular signature.
1374 struct ParameterInformation {
1376 /// The label of this parameter. Ignored when labelOffsets is set.
1377 std::string labelString;
1379 /// Inclusive start and exclusive end offsets withing the containing signature
1380 /// label.
1381 /// Offsets are computed by lspLength(), which counts UTF-16 code units by
1382 /// default but that can be overriden, see its documentation for details.
1383 std::optional<std::pair<unsigned, unsigned>> labelOffsets;
1385 /// The documentation of this parameter. Optional.
1386 std::string documentation;
1388 llvm::json::Value toJSON(const ParameterInformation &);
1390 /// Represents the signature of something callable.
1391 struct SignatureInformation {
1393 /// The label of this signature. Mandatory.
1394 std::string label;
1396 /// The documentation of this signature. Optional.
1397 MarkupContent documentation;
1399 /// The parameters of this signature.
1400 std::vector<ParameterInformation> parameters;
1402 llvm::json::Value toJSON(const SignatureInformation &);
1403 llvm::raw_ostream &operator<<(llvm::raw_ostream &,
1404 const SignatureInformation &);
1406 /// Represents the signature of a callable.
1407 struct SignatureHelp {
1409 /// The resulting signatures.
1410 std::vector<SignatureInformation> signatures;
1412 /// The active signature.
1413 int activeSignature = 0;
1415 /// The active parameter of the active signature.
1416 int activeParameter = 0;
1418 /// Position of the start of the argument list, including opening paren. e.g.
1419 /// foo("first arg", "second arg",
1420 /// ^-argListStart ^-cursor
1421 /// This is a clangd-specific extension, it is only available via C++ API and
1422 /// not currently serialized for the LSP.
1423 Position argListStart;
1425 llvm::json::Value toJSON(const SignatureHelp &);
1427 struct RenameParams {
1428 /// The document that was opened.
1429 TextDocumentIdentifier textDocument;
1431 /// The position at which this request was sent.
1432 Position position;
1434 /// The new name of the symbol.
1435 std::string newName;
1437 bool fromJSON(const llvm::json::Value &, RenameParams &, llvm::json::Path);
1438 llvm::json::Value toJSON(const RenameParams &);
1440 struct PrepareRenameResult {
1441 /// Range of the string to rename.
1442 Range range;
1443 /// Placeholder text to use in the editor if non-empty.
1444 std::string placeholder;
1446 llvm::json::Value toJSON(const PrepareRenameResult &PRR);
1448 enum class DocumentHighlightKind { Text = 1, Read = 2, Write = 3 };
1450 /// A document highlight is a range inside a text document which deserves
1451 /// special attention. Usually a document highlight is visualized by changing
1452 /// the background color of its range.
1454 struct DocumentHighlight {
1455 /// The range this highlight applies to.
1456 Range range;
1458 /// The highlight kind, default is DocumentHighlightKind.Text.
1459 DocumentHighlightKind kind = DocumentHighlightKind::Text;
1461 friend bool operator<(const DocumentHighlight &LHS,
1462 const DocumentHighlight &RHS) {
1463 int LHSKind = static_cast<int>(LHS.kind);
1464 int RHSKind = static_cast<int>(RHS.kind);
1465 return std::tie(LHS.range, LHSKind) < std::tie(RHS.range, RHSKind);
1468 friend bool operator==(const DocumentHighlight &LHS,
1469 const DocumentHighlight &RHS) {
1470 return LHS.kind == RHS.kind && LHS.range == RHS.range;
1473 llvm::json::Value toJSON(const DocumentHighlight &DH);
1474 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const DocumentHighlight &);
1476 enum class TypeHierarchyDirection { Children = 0, Parents = 1, Both = 2 };
1477 bool fromJSON(const llvm::json::Value &E, TypeHierarchyDirection &Out,
1478 llvm::json::Path);
1480 /// The type hierarchy params is an extension of the
1481 /// `TextDocumentPositionsParams` with optional properties which can be used to
1482 /// eagerly resolve the item when requesting from the server.
1483 struct TypeHierarchyPrepareParams : public TextDocumentPositionParams {
1484 /// The hierarchy levels to resolve. `0` indicates no level.
1485 /// This is a clangd extension.
1486 int resolve = 0;
1488 /// The direction of the hierarchy levels to resolve.
1489 /// This is a clangd extension.
1490 TypeHierarchyDirection direction = TypeHierarchyDirection::Parents;
1492 bool fromJSON(const llvm::json::Value &, TypeHierarchyPrepareParams &,
1493 llvm::json::Path);
1495 struct TypeHierarchyItem {
1496 /// The name of this item.
1497 std::string name;
1499 /// The kind of this item.
1500 SymbolKind kind;
1502 /// More detail for this item, e.g. the signature of a function.
1503 std::optional<std::string> detail;
1505 /// The resource identifier of this item.
1506 URIForFile uri;
1508 /// The range enclosing this symbol not including leading/trailing whitespace
1509 /// but everything else, e.g. comments and code.
1510 Range range;
1512 /// The range that should be selected and revealed when this symbol is being
1513 /// picked, e.g. the name of a function. Must be contained by the `range`.
1514 Range selectionRange;
1516 /// Used to resolve a client provided item back.
1517 struct ResolveParams {
1518 SymbolID symbolID;
1519 /// std::nullopt means parents aren't resolved and empty is no parents.
1520 std::optional<std::vector<ResolveParams>> parents;
1522 /// A data entry field that is preserved between a type hierarchy prepare and
1523 /// supertypes or subtypes requests. It could also be used to identify the
1524 /// type hierarchy in the server, helping improve the performance on resolving
1525 /// supertypes and subtypes.
1526 ResolveParams data;
1528 /// `true` if the hierarchy item is deprecated. Otherwise, `false`.
1529 /// This is a clangd exntesion.
1530 bool deprecated = false;
1532 /// This is a clangd exntesion.
1533 std::optional<std::vector<TypeHierarchyItem>> parents;
1535 /// If this type hierarchy item is resolved, it contains the direct children
1536 /// of the current item. Could be empty if the item does not have any
1537 /// descendants. If not defined, the children have not been resolved.
1538 /// This is a clangd exntesion.
1539 std::optional<std::vector<TypeHierarchyItem>> children;
1541 llvm::json::Value toJSON(const TypeHierarchyItem::ResolveParams &);
1542 bool fromJSON(const TypeHierarchyItem::ResolveParams &);
1543 llvm::json::Value toJSON(const TypeHierarchyItem &);
1544 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const TypeHierarchyItem &);
1545 bool fromJSON(const llvm::json::Value &, TypeHierarchyItem &, llvm::json::Path);
1547 /// Parameters for the `typeHierarchy/resolve` request.
1548 struct ResolveTypeHierarchyItemParams {
1549 /// The item to resolve.
1550 TypeHierarchyItem item;
1552 /// The hierarchy levels to resolve. `0` indicates no level.
1553 int resolve;
1555 /// The direction of the hierarchy levels to resolve.
1556 TypeHierarchyDirection direction;
1558 bool fromJSON(const llvm::json::Value &, ResolveTypeHierarchyItemParams &,
1559 llvm::json::Path);
1561 enum class SymbolTag { Deprecated = 1 };
1562 llvm::json::Value toJSON(SymbolTag);
1564 /// The parameter of a `textDocument/prepareCallHierarchy` request.
1565 struct CallHierarchyPrepareParams : public TextDocumentPositionParams {};
1567 /// Represents programming constructs like functions or constructors
1568 /// in the context of call hierarchy.
1569 struct CallHierarchyItem {
1570 /// The name of this item.
1571 std::string name;
1573 /// The kind of this item.
1574 SymbolKind kind;
1576 /// Tags for this item.
1577 std::vector<SymbolTag> tags;
1579 /// More detaill for this item, e.g. the signature of a function.
1580 std::string detail;
1582 /// The resource identifier of this item.
1583 URIForFile uri;
1585 /// The range enclosing this symbol not including leading / trailing
1586 /// whitespace but everything else, e.g. comments and code.
1587 Range range;
1589 /// The range that should be selected and revealed when this symbol
1590 /// is being picked, e.g. the name of a function.
1591 /// Must be contained by `Rng`.
1592 Range selectionRange;
1594 /// An optional 'data' field, which can be used to identify a call
1595 /// hierarchy item in an incomingCalls or outgoingCalls request.
1596 std::string data;
1598 llvm::json::Value toJSON(const CallHierarchyItem &);
1599 bool fromJSON(const llvm::json::Value &, CallHierarchyItem &, llvm::json::Path);
1601 /// The parameter of a `callHierarchy/incomingCalls` request.
1602 struct CallHierarchyIncomingCallsParams {
1603 CallHierarchyItem item;
1605 bool fromJSON(const llvm::json::Value &, CallHierarchyIncomingCallsParams &,
1606 llvm::json::Path);
1608 /// Represents an incoming call, e.g. a caller of a method or constructor.
1609 struct CallHierarchyIncomingCall {
1610 /// The item that makes the call.
1611 CallHierarchyItem from;
1613 /// The range at which the calls appear.
1614 /// This is relative to the caller denoted by `From`.
1615 std::vector<Range> fromRanges;
1617 llvm::json::Value toJSON(const CallHierarchyIncomingCall &);
1619 /// The parameter of a `callHierarchy/outgoingCalls` request.
1620 struct CallHierarchyOutgoingCallsParams {
1621 CallHierarchyItem item;
1623 bool fromJSON(const llvm::json::Value &, CallHierarchyOutgoingCallsParams &,
1624 llvm::json::Path);
1626 /// Represents an outgoing call, e.g. calling a getter from a method or
1627 /// a method from a constructor etc.
1628 struct CallHierarchyOutgoingCall {
1629 /// The item that is called.
1630 CallHierarchyItem to;
1632 /// The range at which this item is called.
1633 /// This is the range relative to the caller, and not `To`.
1634 std::vector<Range> fromRanges;
1636 llvm::json::Value toJSON(const CallHierarchyOutgoingCall &);
1638 /// A parameter literal used in inlay hint requests.
1639 struct InlayHintsParams {
1640 /// The text document.
1641 TextDocumentIdentifier textDocument;
1643 /// The visible document range for which inlay hints should be computed.
1645 /// std::nullopt is a clangd extension, which hints for computing hints on the
1646 /// whole file.
1647 std::optional<Range> range;
1649 bool fromJSON(const llvm::json::Value &, InlayHintsParams &, llvm::json::Path);
1651 /// Inlay hint kinds.
1652 enum class InlayHintKind {
1653 /// An inlay hint that for a type annotation.
1655 /// An example of a type hint is a hint in this position:
1656 /// auto var ^ = expr;
1657 /// which shows the deduced type of the variable.
1658 Type = 1,
1660 /// An inlay hint that is for a parameter.
1662 /// An example of a parameter hint is a hint in this position:
1663 /// func(^arg);
1664 /// which shows the name of the corresponding parameter.
1665 Parameter = 2,
1667 /// A hint before an element of an aggregate braced initializer list,
1668 /// indicating what it is initializing.
1669 /// Pair{^1, ^2};
1670 /// Uses designator syntax, e.g. `.first:`.
1671 /// This is a clangd extension.
1672 Designator = 3,
1674 /// A hint after function, type or namespace definition, indicating the
1675 /// defined symbol name of the definition.
1677 /// An example of a decl name hint in this position:
1678 /// void func() {
1679 /// } ^
1680 /// Uses comment-like syntax like "// func".
1681 /// This is a clangd extension.
1682 BlockEnd = 4,
1684 /// Other ideas for hints that are not currently implemented:
1686 /// * Chaining hints, showing the types of intermediate expressions
1687 /// in a chain of function calls.
1688 /// * Hints indicating implicit conversions or implicit constructor calls.
1690 llvm::json::Value toJSON(const InlayHintKind &);
1692 /// An inlay hint label part allows for interactive and composite labels
1693 /// of inlay hints.
1694 struct InlayHintLabelPart {
1696 InlayHintLabelPart() = default;
1698 InlayHintLabelPart(std::string value,
1699 std::optional<Location> location = std::nullopt)
1700 : value(std::move(value)), location(std::move(location)) {}
1702 /// The value of this label part.
1703 std::string value;
1705 /// The tooltip text when you hover over this label part. Depending on
1706 /// the client capability `inlayHint.resolveSupport`, clients might resolve
1707 /// this property late using the resolve request.
1708 std::optional<MarkupContent> tooltip;
1710 /// An optional source code location that represents this
1711 /// label part.
1713 /// The editor will use this location for the hover and for code navigation
1714 /// features: This part will become a clickable link that resolves to the
1715 /// definition of the symbol at the given location (not necessarily the
1716 /// location itself), it shows the hover that shows at the given location,
1717 /// and it shows a context menu with further code navigation commands.
1719 /// Depending on the client capability `inlayHint.resolveSupport` clients
1720 /// might resolve this property late using the resolve request.
1721 std::optional<Location> location;
1723 /// An optional command for this label part.
1725 /// Depending on the client capability `inlayHint.resolveSupport` clients
1726 /// might resolve this property late using the resolve request.
1727 std::optional<Command> command;
1729 llvm::json::Value toJSON(const InlayHintLabelPart &);
1730 bool operator==(const InlayHintLabelPart &, const InlayHintLabelPart &);
1731 bool operator<(const InlayHintLabelPart &, const InlayHintLabelPart &);
1732 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const InlayHintLabelPart &);
1734 /// Inlay hint information.
1735 struct InlayHint {
1736 /// The position of this hint.
1737 Position position;
1739 /// The label of this hint. A human readable string or an array of
1740 /// InlayHintLabelPart label parts.
1742 /// *Note* that neither the string nor the label part can be empty.
1743 std::vector<InlayHintLabelPart> label;
1745 /// The kind of this hint. Can be omitted in which case the client should fall
1746 /// back to a reasonable default.
1747 InlayHintKind kind;
1749 /// Render padding before the hint.
1751 /// Note: Padding should use the editor's background color, not the
1752 /// background color of the hint itself. That means padding can be used
1753 /// to visually align/separate an inlay hint.
1754 bool paddingLeft = false;
1756 /// Render padding after the hint.
1758 /// Note: Padding should use the editor's background color, not the
1759 /// background color of the hint itself. That means padding can be used
1760 /// to visually align/separate an inlay hint.
1761 bool paddingRight = false;
1763 /// The range of source code to which the hint applies.
1765 /// For example, a parameter hint may have the argument as its range.
1766 /// The range allows clients more flexibility of when/how to display the hint.
1767 /// This is an (unserialized) clangd extension.
1768 Range range;
1770 /// Join the label[].value together.
1771 std::string joinLabels() const;
1773 llvm::json::Value toJSON(const InlayHint &);
1774 bool operator==(const InlayHint &, const InlayHint &);
1775 bool operator<(const InlayHint &, const InlayHint &);
1776 llvm::raw_ostream &operator<<(llvm::raw_ostream &, InlayHintKind);
1778 struct ReferenceContext {
1779 /// Include the declaration of the current symbol.
1780 bool includeDeclaration = false;
1783 struct ReferenceParams : public TextDocumentPositionParams {
1784 ReferenceContext context;
1786 bool fromJSON(const llvm::json::Value &, ReferenceParams &, llvm::json::Path);
1788 /// Clangd extension: indicates the current state of the file in clangd,
1789 /// sent from server via the `textDocument/clangd.fileStatus` notification.
1790 struct FileStatus {
1791 /// The text document's URI.
1792 URIForFile uri;
1793 /// The human-readable string presents the current state of the file, can be
1794 /// shown in the UI (e.g. status bar).
1795 std::string state;
1796 // FIXME: add detail messages.
1798 llvm::json::Value toJSON(const FileStatus &);
1800 /// Specifies a single semantic token in the document.
1801 /// This struct is not part of LSP, which just encodes lists of tokens as
1802 /// arrays of numbers directly.
1803 struct SemanticToken {
1804 /// token line number, relative to the previous token
1805 unsigned deltaLine = 0;
1806 /// token start character, relative to the previous token
1807 /// (relative to 0 or the previous token's start if they are on the same line)
1808 unsigned deltaStart = 0;
1809 /// the length of the token. A token cannot be multiline
1810 unsigned length = 0;
1811 /// will be looked up in `SemanticTokensLegend.tokenTypes`
1812 unsigned tokenType = 0;
1813 /// each set bit will be looked up in `SemanticTokensLegend.tokenModifiers`
1814 unsigned tokenModifiers = 0;
1816 bool operator==(const SemanticToken &, const SemanticToken &);
1818 /// A versioned set of tokens.
1819 struct SemanticTokens {
1820 // An optional result id. If provided and clients support delta updating
1821 // the client will include the result id in the next semantic token request.
1822 // A server can then instead of computing all semantic tokens again simply
1823 // send a delta.
1824 std::string resultId;
1826 /// The actual tokens.
1827 std::vector<SemanticToken> tokens; // encoded as a flat integer array.
1829 llvm::json::Value toJSON(const SemanticTokens &);
1831 /// Body of textDocument/semanticTokens/full request.
1832 struct SemanticTokensParams {
1833 /// The text document.
1834 TextDocumentIdentifier textDocument;
1836 bool fromJSON(const llvm::json::Value &, SemanticTokensParams &,
1837 llvm::json::Path);
1839 /// Body of textDocument/semanticTokens/full/delta request.
1840 /// Requests the changes in semantic tokens since a previous response.
1841 struct SemanticTokensDeltaParams {
1842 /// The text document.
1843 TextDocumentIdentifier textDocument;
1844 /// The previous result id.
1845 std::string previousResultId;
1847 bool fromJSON(const llvm::json::Value &Params, SemanticTokensDeltaParams &R,
1848 llvm::json::Path);
1850 /// Describes a replacement of a contiguous range of semanticTokens.
1851 struct SemanticTokensEdit {
1852 // LSP specifies `start` and `deleteCount` which are relative to the array
1853 // encoding of the previous tokens.
1854 // We use token counts instead, and translate when serializing this struct.
1855 unsigned startToken = 0;
1856 unsigned deleteTokens = 0;
1857 std::vector<SemanticToken> tokens; // encoded as a flat integer array
1859 llvm::json::Value toJSON(const SemanticTokensEdit &);
1861 /// This models LSP SemanticTokensDelta | SemanticTokens, which is the result of
1862 /// textDocument/semanticTokens/full/delta.
1863 struct SemanticTokensOrDelta {
1864 std::string resultId;
1865 /// Set if we computed edits relative to a previous set of tokens.
1866 std::optional<std::vector<SemanticTokensEdit>> edits;
1867 /// Set if we computed a fresh set of tokens.
1868 std::optional<std::vector<SemanticToken>> tokens; // encoded as integer array
1870 llvm::json::Value toJSON(const SemanticTokensOrDelta &);
1872 /// Parameters for the inactive regions (server-side) push notification.
1873 /// This is a clangd extension.
1874 struct InactiveRegionsParams {
1875 /// The textdocument these inactive regions belong to.
1876 TextDocumentIdentifier TextDocument;
1877 /// The inactive regions that should be sent.
1878 std::vector<Range> InactiveRegions;
1880 llvm::json::Value toJSON(const InactiveRegionsParams &InactiveRegions);
1882 struct SelectionRangeParams {
1883 /// The text document.
1884 TextDocumentIdentifier textDocument;
1886 /// The positions inside the text document.
1887 std::vector<Position> positions;
1889 bool fromJSON(const llvm::json::Value &, SelectionRangeParams &,
1890 llvm::json::Path);
1892 struct SelectionRange {
1894 * The range of this selection range.
1896 Range range;
1898 * The parent selection range containing this range. Therefore `parent.range`
1899 * must contain `this.range`.
1901 std::unique_ptr<SelectionRange> parent;
1903 llvm::json::Value toJSON(const SelectionRange &);
1905 /// Parameters for the document link request.
1906 struct DocumentLinkParams {
1907 /// The document to provide document links for.
1908 TextDocumentIdentifier textDocument;
1910 bool fromJSON(const llvm::json::Value &, DocumentLinkParams &,
1911 llvm::json::Path);
1913 /// A range in a text document that links to an internal or external resource,
1914 /// like another text document or a web site.
1915 struct DocumentLink {
1916 /// The range this link applies to.
1917 Range range;
1919 /// The uri this link points to. If missing a resolve request is sent later.
1920 URIForFile target;
1922 // TODO(forster): The following optional fields defined by the language
1923 // server protocol are unsupported:
1925 // data?: any - A data entry field that is preserved on a document link
1926 // between a DocumentLinkRequest and a
1927 // DocumentLinkResolveRequest.
1929 friend bool operator==(const DocumentLink &LHS, const DocumentLink &RHS) {
1930 return LHS.range == RHS.range && LHS.target == RHS.target;
1933 friend bool operator!=(const DocumentLink &LHS, const DocumentLink &RHS) {
1934 return !(LHS == RHS);
1937 llvm::json::Value toJSON(const DocumentLink &DocumentLink);
1939 // FIXME(kirillbobyrev): Add FoldingRangeClientCapabilities so we can support
1940 // per-line-folding editors.
1941 struct FoldingRangeParams {
1942 TextDocumentIdentifier textDocument;
1944 bool fromJSON(const llvm::json::Value &, FoldingRangeParams &,
1945 llvm::json::Path);
1947 /// Stores information about a region of code that can be folded.
1948 struct FoldingRange {
1949 unsigned startLine = 0;
1950 unsigned startCharacter;
1951 unsigned endLine = 0;
1952 unsigned endCharacter;
1954 const static llvm::StringLiteral REGION_KIND;
1955 const static llvm::StringLiteral COMMENT_KIND;
1956 const static llvm::StringLiteral IMPORT_KIND;
1957 std::string kind;
1959 llvm::json::Value toJSON(const FoldingRange &Range);
1961 /// Keys starting with an underscore(_) represent leaves, e.g. _total or _self
1962 /// for memory usage of whole subtree or only that specific node in bytes. All
1963 /// other keys represents children. An example:
1964 /// {
1965 /// "_self": 0,
1966 /// "_total": 8,
1967 /// "child1": {
1968 /// "_self": 4,
1969 /// "_total": 4,
1970 /// }
1971 /// "child2": {
1972 /// "_self": 2,
1973 /// "_total": 4,
1974 /// "child_deep": {
1975 /// "_self": 2,
1976 /// "_total": 2,
1977 /// }
1978 /// }
1979 /// }
1980 llvm::json::Value toJSON(const MemoryTree &MT);
1982 /// Payload for textDocument/ast request.
1983 /// This request is a clangd extension.
1984 struct ASTParams {
1985 /// The text document.
1986 TextDocumentIdentifier textDocument;
1988 /// The position of the node to be dumped.
1989 /// The highest-level node that entirely contains the range will be returned.
1990 /// If no range is given, the root translation unit node will be returned.
1991 std::optional<Range> range;
1993 bool fromJSON(const llvm::json::Value &, ASTParams &, llvm::json::Path);
1995 /// Simplified description of a clang AST node.
1996 /// This is clangd's internal representation of C++ code.
1997 struct ASTNode {
1998 /// The general kind of node, such as "expression"
1999 /// Corresponds to the base AST node type such as Expr.
2000 std::string role;
2001 /// The specific kind of node this is, such as "BinaryOperator".
2002 /// This is usually a concrete node class (with Expr etc suffix dropped).
2003 /// When there's no hierarchy (e.g. TemplateName), the variant (NameKind).
2004 std::string kind;
2005 /// Brief additional information, such as "||" for the particular operator.
2006 /// The information included depends on the node kind, and may be empty.
2007 std::string detail;
2008 /// A one-line dump of detailed information about the node.
2009 /// This includes role/kind/description information, but is rather cryptic.
2010 /// It is similar to the output from `clang -Xclang -ast-dump`.
2011 /// May be empty for certain types of nodes.
2012 std::string arcana;
2013 /// The range of the original source file covered by this node.
2014 /// May be missing for implicit nodes, or those created by macro expansion.
2015 std::optional<Range> range;
2016 /// Nodes nested within this one, such as the operands of a BinaryOperator.
2017 std::vector<ASTNode> children;
2019 llvm::json::Value toJSON(const ASTNode &);
2020 llvm::raw_ostream &operator<<(llvm::raw_ostream &, const ASTNode &);
2022 } // namespace clangd
2023 } // namespace clang
2025 namespace llvm {
2027 template <> struct DenseMapInfo<clang::clangd::Range> {
2028 using Range = clang::clangd::Range;
2029 static inline Range getEmptyKey() {
2030 static clang::clangd::Position Tomb{-1, -1};
2031 static Range R{Tomb, Tomb};
2032 return R;
2034 static inline Range getTombstoneKey() {
2035 static clang::clangd::Position Tomb{-2, -2};
2036 static Range R{Tomb, Tomb};
2037 return R;
2039 static unsigned getHashValue(const Range &Val) {
2040 return llvm::hash_combine(Val.start.line, Val.start.character, Val.end.line,
2041 Val.end.character);
2043 static bool isEqual(const Range &LHS, const Range &RHS) {
2044 return std::tie(LHS.start, LHS.end) == std::tie(RHS.start, RHS.end);
2048 template <> struct format_provider<clang::clangd::Position> {
2049 static void format(const clang::clangd::Position &Pos, raw_ostream &OS,
2050 StringRef Style) {
2051 assert(Style.empty() && "style modifiers for this type are not supported");
2052 OS << Pos;
2055 } // namespace llvm
2057 // NOLINTEND(readability-identifier-naming)
2059 #endif