//===--- Protocol.h - Language Server Protocol Implementation ---*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file contains structs based on the LSP specification at // https://microsoft.github.io/language-server-protocol/specification // // This is not meant to be a complete implementation, new interfaces are added // when they're needed. // // Each struct has a toJSON and fromJSON function, that converts between // the struct and a JSON representation. (See JSON.h) // // Some structs also have operator<< serialization. This is for debugging and // tests, and is not generally machine-readable. // //===----------------------------------------------------------------------===// #ifndef MLIR_TOOLS_LSPSERVERSUPPORT_PROTOCOL_H #define MLIR_TOOLS_LSPSERVERSUPPORT_PROTOCOL_H #include "mlir/Support/LLVM.h" #include "llvm/Support/JSON.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include <bitset> #include <optional> #include <string> #include <utility> #include <vector> namespace mlir { namespace lsp { enum class ErrorCode { … }; /// Defines how the host (editor) should sync document changes to the language /// server. enum class TextDocumentSyncKind { … }; //===----------------------------------------------------------------------===// // LSPError //===----------------------------------------------------------------------===// /// This class models an LSP error as an llvm::Error. class LSPError : public llvm::ErrorInfo<LSPError> { … }; //===----------------------------------------------------------------------===// // URIForFile //===----------------------------------------------------------------------===// /// URI in "file" scheme for a file. class URIForFile { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const URIForFile &value); bool fromJSON(const llvm::json::Value &value, URIForFile &result, llvm::json::Path path); raw_ostream &operator<<(raw_ostream &os, const URIForFile &value); //===----------------------------------------------------------------------===// // ClientCapabilities //===----------------------------------------------------------------------===// struct ClientCapabilities { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, ClientCapabilities &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // ClientInfo //===----------------------------------------------------------------------===// struct ClientInfo { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, ClientInfo &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // InitializeParams //===----------------------------------------------------------------------===// enum class TraceLevel { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, TraceLevel &result, llvm::json::Path path); struct InitializeParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, InitializeParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // InitializedParams //===----------------------------------------------------------------------===// struct NoParams { … }; inline bool fromJSON(const llvm::json::Value &, NoParams &, llvm::json::Path) { … } InitializedParams; //===----------------------------------------------------------------------===// // TextDocumentItem //===----------------------------------------------------------------------===// struct TextDocumentItem { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, TextDocumentItem &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // TextDocumentIdentifier //===----------------------------------------------------------------------===// struct TextDocumentIdentifier { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const TextDocumentIdentifier &value); bool fromJSON(const llvm::json::Value &value, TextDocumentIdentifier &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // VersionedTextDocumentIdentifier //===----------------------------------------------------------------------===// struct VersionedTextDocumentIdentifier { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const VersionedTextDocumentIdentifier &value); bool fromJSON(const llvm::json::Value &value, VersionedTextDocumentIdentifier &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // Position //===----------------------------------------------------------------------===// struct Position { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, Position &result, llvm::json::Path path); llvm::json::Value toJSON(const Position &value); raw_ostream &operator<<(raw_ostream &os, const Position &value); //===----------------------------------------------------------------------===// // Range //===----------------------------------------------------------------------===// struct Range { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, Range &result, llvm::json::Path path); llvm::json::Value toJSON(const Range &value); raw_ostream &operator<<(raw_ostream &os, const Range &value); //===----------------------------------------------------------------------===// // Location //===----------------------------------------------------------------------===// struct Location { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, Location &result, llvm::json::Path path); llvm::json::Value toJSON(const Location &value); raw_ostream &operator<<(raw_ostream &os, const Location &value); //===----------------------------------------------------------------------===// // TextDocumentPositionParams //===----------------------------------------------------------------------===// struct TextDocumentPositionParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, TextDocumentPositionParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // ReferenceParams //===----------------------------------------------------------------------===// struct ReferenceContext { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, ReferenceContext &result, llvm::json::Path path); struct ReferenceParams : public TextDocumentPositionParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, ReferenceParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // DidOpenTextDocumentParams //===----------------------------------------------------------------------===// struct DidOpenTextDocumentParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DidOpenTextDocumentParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // DidCloseTextDocumentParams //===----------------------------------------------------------------------===// struct DidCloseTextDocumentParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DidCloseTextDocumentParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // DidChangeTextDocumentParams //===----------------------------------------------------------------------===// struct TextDocumentContentChangeEvent { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, TextDocumentContentChangeEvent &result, llvm::json::Path path); struct DidChangeTextDocumentParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DidChangeTextDocumentParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // MarkupContent //===----------------------------------------------------------------------===// /// Describes the content type that a client supports in various result literals /// like `Hover`. enum class MarkupKind { … }; raw_ostream &operator<<(raw_ostream &os, MarkupKind kind); struct MarkupContent { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const MarkupContent &mc); //===----------------------------------------------------------------------===// // Hover //===----------------------------------------------------------------------===// struct Hover { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const Hover &hover); //===----------------------------------------------------------------------===// // SymbolKind //===----------------------------------------------------------------------===// enum class SymbolKind { … }; //===----------------------------------------------------------------------===// // DocumentSymbol //===----------------------------------------------------------------------===// /// Represents programming constructs like variables, classes, interfaces etc. /// that appear in a document. Document symbols can be hierarchical and they /// have two ranges: one that encloses its definition and one that points to its /// most interesting range, e.g. the range of an identifier. struct DocumentSymbol { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const DocumentSymbol &symbol); //===----------------------------------------------------------------------===// // DocumentSymbolParams //===----------------------------------------------------------------------===// struct DocumentSymbolParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DocumentSymbolParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // DiagnosticRelatedInformation //===----------------------------------------------------------------------===// /// Represents a related message and source code location for a diagnostic. /// This should be used to point to code locations that cause or related to a /// diagnostics, e.g. when duplicating a symbol in a scope. struct DiagnosticRelatedInformation { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DiagnosticRelatedInformation &result, llvm::json::Path path); llvm::json::Value toJSON(const DiagnosticRelatedInformation &info); //===----------------------------------------------------------------------===// // Diagnostic //===----------------------------------------------------------------------===// enum class DiagnosticSeverity { … }; enum class DiagnosticTag { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(DiagnosticTag tag); bool fromJSON(const llvm::json::Value &value, DiagnosticTag &result, llvm::json::Path path); struct Diagnostic { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const Diagnostic &diag); bool fromJSON(const llvm::json::Value &value, Diagnostic &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // PublishDiagnosticsParams //===----------------------------------------------------------------------===// struct PublishDiagnosticsParams { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const PublishDiagnosticsParams ¶ms); //===----------------------------------------------------------------------===// // TextEdit //===----------------------------------------------------------------------===// struct TextEdit { … }; inline bool operator==(const TextEdit &lhs, const TextEdit &rhs) { … } bool fromJSON(const llvm::json::Value &value, TextEdit &result, llvm::json::Path path); llvm::json::Value toJSON(const TextEdit &value); raw_ostream &operator<<(raw_ostream &os, const TextEdit &value); //===----------------------------------------------------------------------===// // CompletionItemKind //===----------------------------------------------------------------------===// /// The kind of a completion entry. enum class CompletionItemKind { … }; bool fromJSON(const llvm::json::Value &value, CompletionItemKind &result, llvm::json::Path path); constexpr auto kCompletionItemKindMin = …; constexpr auto kCompletionItemKindMax = …; CompletionItemKindBitset; bool fromJSON(const llvm::json::Value &value, CompletionItemKindBitset &result, llvm::json::Path path); CompletionItemKind adjustKindToCapability(CompletionItemKind kind, CompletionItemKindBitset &supportedCompletionItemKinds); //===----------------------------------------------------------------------===// // CompletionItem //===----------------------------------------------------------------------===// /// Defines whether the insert text in a completion item should be interpreted /// as plain text or a snippet. enum class InsertTextFormat { … }; struct CompletionItem { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const CompletionItem &value); raw_ostream &operator<<(raw_ostream &os, const CompletionItem &value); bool operator<(const CompletionItem &lhs, const CompletionItem &rhs); //===----------------------------------------------------------------------===// // CompletionList //===----------------------------------------------------------------------===// /// Represents a collection of completion items to be presented in the editor. struct CompletionList { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const CompletionList &value); //===----------------------------------------------------------------------===// // CompletionContext //===----------------------------------------------------------------------===// enum class CompletionTriggerKind { … }; struct CompletionContext { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, CompletionContext &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // CompletionParams //===----------------------------------------------------------------------===// struct CompletionParams : TextDocumentPositionParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, CompletionParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // ParameterInformation //===----------------------------------------------------------------------===// /// A single parameter of a particular signature. struct ParameterInformation { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const ParameterInformation &value); //===----------------------------------------------------------------------===// // SignatureInformation //===----------------------------------------------------------------------===// /// Represents the signature of something callable. struct SignatureInformation { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const SignatureInformation &value); raw_ostream &operator<<(raw_ostream &os, const SignatureInformation &value); //===----------------------------------------------------------------------===// // SignatureHelp //===----------------------------------------------------------------------===// /// Represents the signature of a callable. struct SignatureHelp { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const SignatureHelp &value); //===----------------------------------------------------------------------===// // DocumentLinkParams //===----------------------------------------------------------------------===// /// Parameters for the document link request. struct DocumentLinkParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, DocumentLinkParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // DocumentLink //===----------------------------------------------------------------------===// /// A range in a text document that links to an internal or external resource, /// like another text document or a web site. struct DocumentLink { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const DocumentLink &value); //===----------------------------------------------------------------------===// // InlayHintsParams //===----------------------------------------------------------------------===// /// A parameter literal used in inlay hint requests. struct InlayHintsParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, InlayHintsParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // InlayHintKind //===----------------------------------------------------------------------===// /// Inlay hint kinds. enum class InlayHintKind { … }; //===----------------------------------------------------------------------===// // InlayHint //===----------------------------------------------------------------------===// /// Inlay hint information. struct InlayHint { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const InlayHint &); bool operator==(const InlayHint &lhs, const InlayHint &rhs); bool operator<(const InlayHint &lhs, const InlayHint &rhs); llvm::raw_ostream &operator<<(llvm::raw_ostream &os, InlayHintKind value); //===----------------------------------------------------------------------===// // CodeActionContext //===----------------------------------------------------------------------===// struct CodeActionContext { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, CodeActionContext &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // CodeActionParams //===----------------------------------------------------------------------===// struct CodeActionParams { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, CodeActionParams &result, llvm::json::Path path); //===----------------------------------------------------------------------===// // WorkspaceEdit //===----------------------------------------------------------------------===// struct WorkspaceEdit { … }; /// Add support for JSON serialization. bool fromJSON(const llvm::json::Value &value, WorkspaceEdit &result, llvm::json::Path path); llvm::json::Value toJSON(const WorkspaceEdit &value); //===----------------------------------------------------------------------===// // CodeAction //===----------------------------------------------------------------------===// /// A code action represents a change that can be performed in code, e.g. to fix /// a problem or to refactor code. /// /// A CodeAction must set either `edit` and/or a `command`. If both are /// supplied, the `edit` is applied first, then the `command` is executed. struct CodeAction { … }; /// Add support for JSON serialization. llvm::json::Value toJSON(const CodeAction &); } // namespace lsp } // namespace mlir namespace llvm { template <> struct format_provider<mlir::lsp::Position> { … }; } // namespace llvm #endif