From 1144402b168c6297af46de11862a75d254760317 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 15:34:57 +0000 Subject: [PATCH 01/13] Move MLIR LSP server support into LLVM --- .../include/llvm/Support/LSP}/Logging.h | 3 +- .../include/llvm/Support/LSP}/Protocol.h | 18 ++- .../include/llvm/Support/LSP}/Transport.h | 18 ++- llvm/lib/Support/CMakeLists.txt | 2 + llvm/lib/Support/LSP/CMakeLists.txt | 17 +++ .../lib/Support/LSP}/Logging.cpp | 6 +- .../lib/Support/LSP}/Protocol.cpp | 142 +++++++++--------- .../lib/Support/LSP}/Transport.cpp | 14 +- .../Tools/lsp-server-support/SourceMgrUtils.h | 4 +- .../Tools/lsp-server-support/CMakeLists.txt | 3 - .../CompilationDatabase.cpp | 5 +- 11 files changed, 131 insertions(+), 101 deletions(-) rename {mlir/include/mlir/Tools/lsp-server-support => llvm/include/llvm/Support/LSP}/Logging.h (97%) rename {mlir/include/mlir/Tools/lsp-server-support => llvm/include/llvm/Support/LSP}/Protocol.h (98%) rename {mlir/include/mlir/Tools/lsp-server-support => llvm/include/llvm/Support/LSP}/Transport.h (96%) create mode 100644 llvm/lib/Support/LSP/CMakeLists.txt rename {mlir/lib/Tools/lsp-server-support => llvm/lib/Support/LSP}/Logging.cpp (92%) rename {mlir/lib/Tools/lsp-server-support => llvm/lib/Support/LSP}/Protocol.cpp (88%) rename {mlir/lib/Tools/lsp-server-support => llvm/lib/Support/LSP}/Transport.cpp (97%) diff --git a/mlir/include/mlir/Tools/lsp-server-support/Logging.h b/llvm/include/llvm/Support/LSP/Logging.h similarity index 97% rename from mlir/include/mlir/Tools/lsp-server-support/Logging.h rename to llvm/include/llvm/Support/LSP/Logging.h index 9b090d05f7fa4..c9631d0f58fa1 100644 --- a/mlir/include/mlir/Tools/lsp-server-support/Logging.h +++ b/llvm/include/llvm/Support/LSP/Logging.h @@ -9,13 +9,12 @@ #ifndef MLIR_TOOLS_LSPSERVERSUPPORT_LOGGING_H #define MLIR_TOOLS_LSPSERVERSUPPORT_LOGGING_H -#include "mlir/Support/LLVM.h" #include "llvm/Support/Debug.h" #include "llvm/Support/FormatVariadic.h" #include #include -namespace mlir { +namespace llvm { namespace lsp { /// This class represents the main interface for logging, and allows for diff --git a/mlir/include/mlir/Tools/lsp-server-support/Protocol.h b/llvm/include/llvm/Support/LSP/Protocol.h similarity index 98% rename from mlir/include/mlir/Tools/lsp-server-support/Protocol.h rename to llvm/include/llvm/Support/LSP/Protocol.h index cc06dbfedb42a..3da13a8a44680 100644 --- a/mlir/include/mlir/Tools/lsp-server-support/Protocol.h +++ b/llvm/include/llvm/Support/LSP/Protocol.h @@ -23,17 +23,21 @@ #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/LogicalResult.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/raw_ostream.h" #include #include #include #include -#include -namespace mlir { +// This file is using the LSP syntax for identifier names which is different +// from the LLVM coding standard. To avoid the clang-tidy warnings, we're +// disabling one check here. +// NOLINTBEGIN(readability-identifier-naming) + +namespace llvm { namespace lsp { enum class ErrorCode { @@ -1241,12 +1245,12 @@ struct CodeAction { llvm::json::Value toJSON(const CodeAction &); } // namespace lsp -} // namespace mlir +} // namespace llvm namespace llvm { template <> -struct format_provider { - static void format(const mlir::lsp::Position &pos, raw_ostream &os, +struct format_provider { + static void format(const llvm::lsp::Position &pos, raw_ostream &os, StringRef style) { assert(style.empty() && "style modifiers for this type are not supported"); os << pos; @@ -1255,3 +1259,5 @@ struct format_provider { } // namespace llvm #endif + +// NOLINTEND(readability-identifier-naming) diff --git a/mlir/include/mlir/Tools/lsp-server-support/Transport.h b/llvm/include/llvm/Support/LSP/Transport.h similarity index 96% rename from mlir/include/mlir/Tools/lsp-server-support/Transport.h rename to llvm/include/llvm/Support/LSP/Transport.h index 0010a475fedd2..6cb4388a7732d 100644 --- a/mlir/include/mlir/Tools/lsp-server-support/Transport.h +++ b/llvm/include/llvm/Support/LSP/Transport.h @@ -15,19 +15,25 @@ #ifndef MLIR_TOOLS_LSPSERVERSUPPORT_TRANSPORT_H #define MLIR_TOOLS_LSPSERVERSUPPORT_TRANSPORT_H -#include "mlir/Support/DebugStringHelper.h" -#include "mlir/Support/LLVM.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Logging.h" #include "llvm/ADT/FunctionExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/JSON.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/raw_ostream.h" -#include +#include -namespace mlir { +namespace llvm { +// Simple helper function that returns a string as printed from a op. +template +static std::string debugString(T &&op) { + std::string instrStr; + llvm::raw_string_ostream os(instrStr); + os << op; + return os.str(); + } namespace lsp { class MessageHandler; diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 6646af6db5d3c..82a32ba817b10 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -135,6 +135,7 @@ if (UNIX AND "${CMAKE_SYSTEM_NAME}" MATCHES "AIX") endif() add_subdirectory(BLAKE3) +add_subdirectory(LSP) add_llvm_component_library(LLVMSupport ABIBreak.cpp @@ -288,6 +289,7 @@ add_llvm_component_library(LLVMSupport ${ALLOCATOR_FILES} $ + $ # System Atomic.cpp diff --git a/llvm/lib/Support/LSP/CMakeLists.txt b/llvm/lib/Support/LSP/CMakeLists.txt new file mode 100644 index 0000000000000..353e649105c17 --- /dev/null +++ b/llvm/lib/Support/LSP/CMakeLists.txt @@ -0,0 +1,17 @@ +add_llvm_library(LLVMSupportLSP STATIC + Protocol.cpp + Transport.cpp + Logging.cpp +) + +target_include_directories(LLVMSupportLSP + PUBLIC + $ + $ + $ # for installation +) + +target_link_libraries(LLVMSupportLSP + PUBLIC + LLVMSupport +) diff --git a/mlir/lib/Tools/lsp-server-support/Logging.cpp b/llvm/lib/Support/LSP/Logging.cpp similarity index 92% rename from mlir/lib/Tools/lsp-server-support/Logging.cpp rename to llvm/lib/Support/LSP/Logging.cpp index 373e2165c244d..36916395375cc 100644 --- a/mlir/lib/Tools/lsp-server-support/Logging.cpp +++ b/llvm/lib/Support/LSP/Logging.cpp @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Tools/lsp-server-support/Logging.h" +#include "llvm/Support/LSP/Logging.h" #include "llvm/Support/Chrono.h" #include "llvm/Support/raw_ostream.h" -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; void Logger::setLogLevel(Level logLevel) { get().logLevel = logLevel; } diff --git a/mlir/lib/Tools/lsp-server-support/Protocol.cpp b/llvm/lib/Support/LSP/Protocol.cpp similarity index 88% rename from mlir/lib/Tools/lsp-server-support/Protocol.cpp rename to llvm/lib/Support/LSP/Protocol.cpp index 98287048355c1..c2494dcf841c0 100644 --- a/mlir/lib/Tools/lsp-server-support/Protocol.cpp +++ b/llvm/lib/Support/LSP/Protocol.cpp @@ -10,7 +10,7 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/Support/ErrorHandling.h" @@ -19,8 +19,8 @@ #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; // Helper that doesn't treat `null` and absent fields as failures. template @@ -239,7 +239,7 @@ void URIForFile::registerSupportedScheme(StringRef scheme) { getSupportedSchemes().insert(scheme); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, URIForFile &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, URIForFile &result, llvm::json::Path path) { if (std::optional str = value.getAsString()) { llvm::Expected expectedURI = URIForFile::fromURI(*str); @@ -254,11 +254,11 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, URIForFile &result, return false; } -llvm::json::Value mlir::lsp::toJSON(const URIForFile &value) { +llvm::json::Value llvm::lsp::toJSON(const URIForFile &value) { return value.uri(); } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const URIForFile &value) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const URIForFile &value) { return os << value.uri(); } @@ -266,7 +266,7 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const URIForFile &value) { // ClientCapabilities //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, ClientCapabilities &result, llvm::json::Path path) { const llvm::json::Object *o = value.getAsObject(); if (!o) { @@ -297,7 +297,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // ClientInfo //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, ClientInfo &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, ClientInfo &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); if (!o || !o.map("name", result.name)) @@ -312,7 +312,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, ClientInfo &result, // InitializeParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, TraceLevel &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TraceLevel &result, llvm::json::Path path) { if (std::optional str = value.getAsString()) { if (*str == "off") { @@ -331,7 +331,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, TraceLevel &result, return false; } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, InitializeParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); if (!o) @@ -348,7 +348,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // TextDocumentItem //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextDocumentItem &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("uri", result.uri) && @@ -360,11 +360,11 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // TextDocumentIdentifier //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const TextDocumentIdentifier &value) { +llvm::json::Value llvm::lsp::toJSON(const TextDocumentIdentifier &value) { return llvm::json::Object{{"uri", value.uri}}; } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextDocumentIdentifier &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -376,14 +376,14 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, //===----------------------------------------------------------------------===// llvm::json::Value -mlir::lsp::toJSON(const VersionedTextDocumentIdentifier &value) { +llvm::lsp::toJSON(const VersionedTextDocumentIdentifier &value) { return llvm::json::Object{ {"uri", value.uri}, {"version", value.version}, }; } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, VersionedTextDocumentIdentifier &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -394,21 +394,21 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // Position //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, Position &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, Position &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("line", result.line) && o.map("character", result.character); } -llvm::json::Value mlir::lsp::toJSON(const Position &value) { +llvm::json::Value llvm::lsp::toJSON(const Position &value) { return llvm::json::Object{ {"line", value.line}, {"character", value.character}, }; } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Position &value) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Position &value) { return os << value.line << ':' << value.character; } @@ -416,20 +416,20 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Position &value) { // Range //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, Range &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, Range &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("start", result.start) && o.map("end", result.end); } -llvm::json::Value mlir::lsp::toJSON(const Range &value) { +llvm::json::Value llvm::lsp::toJSON(const Range &value) { return llvm::json::Object{ {"start", value.start}, {"end", value.end}, }; } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Range &value) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Range &value) { return os << value.start << '-' << value.end; } @@ -437,20 +437,20 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Range &value) { // Location //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, Location &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, Location &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("uri", result.uri) && o.map("range", result.range); } -llvm::json::Value mlir::lsp::toJSON(const Location &value) { +llvm::json::Value llvm::lsp::toJSON(const Location &value) { return llvm::json::Object{ {"uri", value.uri}, {"range", value.range}, }; } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Location &value) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Location &value) { return os << value.range << '@' << value.uri; } @@ -458,7 +458,7 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const Location &value) { // TextDocumentPositionParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextDocumentPositionParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -470,13 +470,13 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // ReferenceParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, ReferenceContext &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.mapOptional("includeDeclaration", result.includeDeclaration); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, ReferenceParams &result, llvm::json::Path path) { TextDocumentPositionParams &base = result; llvm::json::ObjectMapper o(value, path); @@ -488,7 +488,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // DidOpenTextDocumentParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DidOpenTextDocumentParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -499,7 +499,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // DidCloseTextDocumentParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DidCloseTextDocumentParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -540,7 +540,7 @@ LogicalResult TextDocumentContentChangeEvent::applyTo( return success(); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextDocumentContentChangeEvent &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -548,7 +548,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, o.map("rangeLength", result.rangeLength) && o.map("text", result.text); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DidChangeTextDocumentParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -570,11 +570,11 @@ static llvm::StringRef toTextKind(MarkupKind kind) { llvm_unreachable("Invalid MarkupKind"); } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, MarkupKind kind) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, MarkupKind kind) { return os << toTextKind(kind); } -llvm::json::Value mlir::lsp::toJSON(const MarkupContent &mc) { +llvm::json::Value llvm::lsp::toJSON(const MarkupContent &mc) { if (mc.value.empty()) return nullptr; @@ -588,7 +588,7 @@ llvm::json::Value mlir::lsp::toJSON(const MarkupContent &mc) { // Hover //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const Hover &hover) { +llvm::json::Value llvm::lsp::toJSON(const Hover &hover) { llvm::json::Object result{{"contents", toJSON(hover.contents)}}; if (hover.range) result["range"] = toJSON(*hover.range); @@ -599,7 +599,7 @@ llvm::json::Value mlir::lsp::toJSON(const Hover &hover) { // DocumentSymbol //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const DocumentSymbol &symbol) { +llvm::json::Value llvm::lsp::toJSON(const DocumentSymbol &symbol) { llvm::json::Object result{{"name", symbol.name}, {"kind", static_cast(symbol.kind)}, {"range", symbol.range}, @@ -616,7 +616,7 @@ llvm::json::Value mlir::lsp::toJSON(const DocumentSymbol &symbol) { // DocumentSymbolParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DocumentSymbolParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("textDocument", result.textDocument); @@ -626,7 +626,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // DiagnosticRelatedInformation //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DiagnosticRelatedInformation &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -634,7 +634,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, o.map("message", result.message); } -llvm::json::Value mlir::lsp::toJSON(const DiagnosticRelatedInformation &info) { +llvm::json::Value llvm::lsp::toJSON(const DiagnosticRelatedInformation &info) { return llvm::json::Object{ {"location", info.location}, {"message", info.message}, @@ -645,11 +645,11 @@ llvm::json::Value mlir::lsp::toJSON(const DiagnosticRelatedInformation &info) { // Diagnostic //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(DiagnosticTag tag) { +llvm::json::Value llvm::lsp::toJSON(DiagnosticTag tag) { return static_cast(tag); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, DiagnosticTag &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DiagnosticTag &result, llvm::json::Path path) { if (std::optional i = value.getAsInteger()) { result = (DiagnosticTag)*i; @@ -659,7 +659,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, DiagnosticTag &result, return false; } -llvm::json::Value mlir::lsp::toJSON(const Diagnostic &diag) { +llvm::json::Value llvm::lsp::toJSON(const Diagnostic &diag) { llvm::json::Object result{ {"range", diag.range}, {"severity", (int)diag.severity}, @@ -676,7 +676,7 @@ llvm::json::Value mlir::lsp::toJSON(const Diagnostic &diag) { return std::move(result); } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, Diagnostic &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, Diagnostic &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); if (!o) @@ -698,7 +698,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, Diagnostic &result, // PublishDiagnosticsParams //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const PublishDiagnosticsParams ¶ms) { +llvm::json::Value llvm::lsp::toJSON(const PublishDiagnosticsParams ¶ms) { return llvm::json::Object{ {"uri", params.uri}, {"diagnostics", params.diagnostics}, @@ -710,20 +710,20 @@ llvm::json::Value mlir::lsp::toJSON(const PublishDiagnosticsParams ¶ms) { // TextEdit //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, TextEdit &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextEdit &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("range", result.range) && o.map("newText", result.newText); } -llvm::json::Value mlir::lsp::toJSON(const TextEdit &value) { +llvm::json::Value llvm::lsp::toJSON(const TextEdit &value) { return llvm::json::Object{ {"range", value.range}, {"newText", value.newText}, }; } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const TextEdit &value) { +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const TextEdit &value) { os << value.range << " => \""; llvm::printEscapedString(value.newText, os); return os << '"'; @@ -733,7 +733,7 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, const TextEdit &value) { // CompletionItemKind //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CompletionItemKind &result, llvm::json::Path path) { if (std::optional intValue = value.getAsInteger()) { if (*intValue < static_cast(CompletionItemKind::Text) || @@ -745,7 +745,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, return false; } -CompletionItemKind mlir::lsp::adjustKindToCapability( +CompletionItemKind llvm::lsp::adjustKindToCapability( CompletionItemKind kind, CompletionItemKindBitset &supportedCompletionItemKinds) { size_t kindVal = static_cast(kind); @@ -767,7 +767,7 @@ CompletionItemKind mlir::lsp::adjustKindToCapability( } } -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CompletionItemKindBitset &result, llvm::json::Path path) { if (const llvm::json::Array *arrayValue = value.getAsArray()) { @@ -785,7 +785,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // CompletionItem //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const CompletionItem &value) { +llvm::json::Value llvm::lsp::toJSON(const CompletionItem &value) { assert(!value.label.empty() && "completion item label is required"); llvm::json::Object result{{"label", value.label}}; if (value.kind != CompletionItemKind::Missing) @@ -813,12 +813,12 @@ llvm::json::Value mlir::lsp::toJSON(const CompletionItem &value) { return std::move(result); } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const CompletionItem &value) { return os << value.label << " - " << toJSON(value); } -bool mlir::lsp::operator<(const CompletionItem &lhs, +bool llvm::lsp::operator<(const CompletionItem &lhs, const CompletionItem &rhs) { return (lhs.sortText.empty() ? lhs.label : lhs.sortText) < (rhs.sortText.empty() ? rhs.label : rhs.sortText); @@ -828,7 +828,7 @@ bool mlir::lsp::operator<(const CompletionItem &lhs, // CompletionList //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const CompletionList &value) { +llvm::json::Value llvm::lsp::toJSON(const CompletionList &value) { return llvm::json::Object{ {"isIncomplete", value.isIncomplete}, {"items", llvm::json::Array(value.items)}, @@ -839,7 +839,7 @@ llvm::json::Value mlir::lsp::toJSON(const CompletionList &value) { // CompletionContext //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CompletionContext &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); int triggerKind; @@ -854,7 +854,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // CompletionParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CompletionParams &result, llvm::json::Path path) { if (!fromJSON(value, static_cast(result), path)) return false; @@ -867,7 +867,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // ParameterInformation //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const ParameterInformation &value) { +llvm::json::Value llvm::lsp::toJSON(const ParameterInformation &value) { assert((value.labelOffsets || !value.labelString.empty()) && "parameter information label is required"); llvm::json::Object result; @@ -885,7 +885,7 @@ llvm::json::Value mlir::lsp::toJSON(const ParameterInformation &value) { // SignatureInformation //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const SignatureInformation &value) { +llvm::json::Value llvm::lsp::toJSON(const SignatureInformation &value) { assert(!value.label.empty() && "signature information label is required"); llvm::json::Object result{ {"label", value.label}, @@ -896,7 +896,7 @@ llvm::json::Value mlir::lsp::toJSON(const SignatureInformation &value) { return std::move(result); } -raw_ostream &mlir::lsp::operator<<(raw_ostream &os, +raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const SignatureInformation &value) { return os << value.label << " - " << toJSON(value); } @@ -905,7 +905,7 @@ raw_ostream &mlir::lsp::operator<<(raw_ostream &os, // SignatureHelp //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const SignatureHelp &value) { +llvm::json::Value llvm::lsp::toJSON(const SignatureHelp &value) { assert(value.activeSignature >= 0 && "Unexpected negative value for number of active signatures."); assert(value.activeParameter >= 0 && @@ -921,7 +921,7 @@ llvm::json::Value mlir::lsp::toJSON(const SignatureHelp &value) { // DocumentLinkParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, DocumentLinkParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("textDocument", result.textDocument); @@ -931,7 +931,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // DocumentLink //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const DocumentLink &value) { +llvm::json::Value llvm::lsp::toJSON(const DocumentLink &value) { return llvm::json::Object{ {"range", value.range}, {"target", value.target}, @@ -942,7 +942,7 @@ llvm::json::Value mlir::lsp::toJSON(const DocumentLink &value) { // InlayHintsParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, InlayHintsParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("textDocument", result.textDocument) && @@ -953,23 +953,23 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // InlayHint //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const InlayHint &value) { +llvm::json::Value llvm::lsp::toJSON(const InlayHint &value) { return llvm::json::Object{{"position", value.position}, {"kind", (int)value.kind}, {"label", value.label}, {"paddingLeft", value.paddingLeft}, {"paddingRight", value.paddingRight}}; } -bool mlir::lsp::operator==(const InlayHint &lhs, const InlayHint &rhs) { +bool llvm::lsp::operator==(const InlayHint &lhs, const InlayHint &rhs) { return std::tie(lhs.position, lhs.kind, lhs.label) == std::tie(rhs.position, rhs.kind, rhs.label); } -bool mlir::lsp::operator<(const InlayHint &lhs, const InlayHint &rhs) { +bool llvm::lsp::operator<(const InlayHint &lhs, const InlayHint &rhs) { return std::tie(lhs.position, lhs.kind, lhs.label) < std::tie(rhs.position, rhs.kind, rhs.label); } -llvm::raw_ostream &mlir::lsp::operator<<(llvm::raw_ostream &os, +llvm::raw_ostream &llvm::lsp::operator<<(llvm::raw_ostream &os, InlayHintKind value) { switch (value) { case InlayHintKind::Parameter: @@ -984,7 +984,7 @@ llvm::raw_ostream &mlir::lsp::operator<<(llvm::raw_ostream &os, // CodeActionContext //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CodeActionContext &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); if (!o || !o.map("diagnostics", result.diagnostics)) @@ -997,7 +997,7 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // CodeActionParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, CodeActionParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("textDocument", result.textDocument) && @@ -1008,13 +1008,13 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // WorkspaceEdit //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, WorkspaceEdit &result, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, WorkspaceEdit &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); return o && o.map("changes", result.changes); } -llvm::json::Value mlir::lsp::toJSON(const WorkspaceEdit &value) { +llvm::json::Value llvm::lsp::toJSON(const WorkspaceEdit &value) { llvm::json::Object fileChanges; for (auto &change : value.changes) fileChanges[change.first] = llvm::json::Array(change.second); @@ -1029,7 +1029,7 @@ const llvm::StringLiteral CodeAction::kQuickFix = "quickfix"; const llvm::StringLiteral CodeAction::kRefactor = "refactor"; const llvm::StringLiteral CodeAction::kInfo = "info"; -llvm::json::Value mlir::lsp::toJSON(const CodeAction &value) { +llvm::json::Value llvm::lsp::toJSON(const CodeAction &value) { llvm::json::Object codeAction{{"title", value.title}}; if (value.kind) codeAction["kind"] = *value.kind; diff --git a/mlir/lib/Tools/lsp-server-support/Transport.cpp b/llvm/lib/Support/LSP/Transport.cpp similarity index 97% rename from mlir/lib/Tools/lsp-server-support/Transport.cpp rename to llvm/lib/Support/LSP/Transport.cpp index 5a098b2841f4b..3f13a9ee0bf8c 100644 --- a/mlir/lib/Tools/lsp-server-support/Transport.cpp +++ b/llvm/lib/Support/LSP/Transport.cpp @@ -6,18 +6,18 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Tools/lsp-server-support/Transport.h" -#include "mlir/Support/ToolUtilities.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Transport.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/Error.h" #include #include #include +#include -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // Reply @@ -357,7 +357,7 @@ JSONTransportInputOverFile::readDelimitedMessage(std::string &json) { StringRef lineRef = line.str().trim(); if (lineRef.starts_with("//")) { // Found a delimiter for the message. - if (lineRef == kDefaultSplitMarker) + if (lineRef == "// -----") break; continue; } diff --git a/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h b/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h index 9ed8326a602e6..b4dc5956778d1 100644 --- a/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h +++ b/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h @@ -14,12 +14,14 @@ #ifndef MLIR_TOOLS_LSPSERVERSUPPORT_SOURCEMGRUTILS_H #define MLIR_TOOLS_LSPSERVERSUPPORT_SOURCEMGRUTILS_H -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "mlir/Support/LLVM.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/SourceMgr.h" #include namespace mlir { namespace lsp { +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // Utils //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Tools/lsp-server-support/CMakeLists.txt b/mlir/lib/Tools/lsp-server-support/CMakeLists.txt index 48a96016b792f..a76c7f3de6809 100644 --- a/mlir/lib/Tools/lsp-server-support/CMakeLists.txt +++ b/mlir/lib/Tools/lsp-server-support/CMakeLists.txt @@ -1,9 +1,6 @@ add_mlir_library(MLIRLspServerSupportLib CompilationDatabase.cpp - Logging.cpp - Protocol.cpp SourceMgrUtils.cpp - Transport.cpp ADDITIONAL_HEADER_DIRS ${MLIR_MAIN_INCLUDE_DIR}/mlir/Tools/lsp-server-support diff --git a/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp b/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp index 9ae0674383a1d..99fa84e824e25 100644 --- a/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp +++ b/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp @@ -8,14 +8,15 @@ #include "mlir/Tools/lsp-server-support/CompilationDatabase.h" #include "mlir/Support/FileUtilities.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" #include "llvm/ADT/SetVector.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/YAMLTraits.h" using namespace mlir; using namespace mlir::lsp; +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // YamlFileInfo From f50695d9ee0e0a5dd880365fffebccfd9a836211 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 15:36:45 +0000 Subject: [PATCH 02/13] Fix MLIR LSP server after move of lsp support --- .../mlir-lsp-server/MlirLspRegistryFunction.h | 6 +++-- mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp | 5 ++-- mlir/lib/Tools/mlir-lsp-server/LSPServer.h | 6 +++-- mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp | 24 +++++++++---------- mlir/lib/Tools/mlir-lsp-server/MLIRServer.h | 12 ++-------- .../mlir-lsp-server/MlirLspServerMain.cpp | 4 ++-- mlir/lib/Tools/mlir-lsp-server/Protocol.cpp | 8 +++---- mlir/lib/Tools/mlir-lsp-server/Protocol.h | 6 ++--- .../tools/mlir-lsp-server/mlir-lsp-server.cpp | 6 ++--- 9 files changed, 37 insertions(+), 40 deletions(-) diff --git a/mlir/include/mlir/Tools/mlir-lsp-server/MlirLspRegistryFunction.h b/mlir/include/mlir/Tools/mlir-lsp-server/MlirLspRegistryFunction.h index 4811ecb5e92b7..0d9ba2a0d1607 100644 --- a/mlir/include/mlir/Tools/mlir-lsp-server/MlirLspRegistryFunction.h +++ b/mlir/include/mlir/Tools/mlir-lsp-server/MlirLspRegistryFunction.h @@ -16,14 +16,16 @@ namespace llvm { template class function_ref; +namespace lsp { +class URIForFile; +} // namespace lsp } // namespace llvm namespace mlir { class DialectRegistry; namespace lsp { -class URIForFile; using DialectRegistryFn = - llvm::function_ref; + llvm::function_ref; } // namespace lsp } // namespace mlir diff --git a/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp b/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp index 9b937db0c6a7a..fe1bbe4e750a7 100644 --- a/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp @@ -9,14 +9,15 @@ #include "LSPServer.h" #include "MLIRServer.h" #include "Protocol.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Transport.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Transport.h" #include #define DEBUG_TYPE "mlir-lsp-server" using namespace mlir; using namespace mlir::lsp; +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // LSPServer diff --git a/mlir/lib/Tools/mlir-lsp-server/LSPServer.h b/mlir/lib/Tools/mlir-lsp-server/LSPServer.h index 2c50c6b4ac6f5..d652899633255 100644 --- a/mlir/lib/Tools/mlir-lsp-server/LSPServer.h +++ b/mlir/lib/Tools/mlir-lsp-server/LSPServer.h @@ -13,17 +13,19 @@ namespace llvm { struct LogicalResult; +namespace lsp { +class JSONTransport; +} // namespace lsp } // namespace llvm namespace mlir { namespace lsp { -class JSONTransport; class MLIRServer; /// Run the main loop of the LSP server using the given MLIR server and /// transport. llvm::LogicalResult runMlirLSPServer(MLIRServer &server, - JSONTransport &transport); + llvm::lsp::JSONTransport &transport); } // namespace lsp } // namespace mlir diff --git a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp index 61987525a5ca5..594e2e3d1c47b 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp @@ -16,10 +16,10 @@ #include "mlir/Interfaces/FunctionInterfaces.h" #include "mlir/Parser/Parser.h" #include "mlir/Support/ToolUtilities.h" -#include "mlir/Tools/lsp-server-support/Logging.h" #include "mlir/Tools/lsp-server-support/SourceMgrUtils.h" #include "llvm/ADT/StringExtras.h" #include "llvm/Support/Base64.h" +#include "llvm/Support/LSP/Logging.h" #include "llvm/Support/SourceMgr.h" #include @@ -217,15 +217,15 @@ static lsp::Diagnostic getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, // Convert the severity for the diagnostic. switch (diag.getSeverity()) { - case DiagnosticSeverity::Note: + case mlir::DiagnosticSeverity::Note: llvm_unreachable("expected notes to be handled separately"); - case DiagnosticSeverity::Warning: + case mlir::DiagnosticSeverity::Warning: lspDiag.severity = lsp::DiagnosticSeverity::Warning; break; - case DiagnosticSeverity::Error: + case mlir::DiagnosticSeverity::Error: lspDiag.severity = lsp::DiagnosticSeverity::Error; break; - case DiagnosticSeverity::Remark: + case mlir::DiagnosticSeverity::Remark: lspDiag.severity = lsp::DiagnosticSeverity::Information; break; } @@ -1283,7 +1283,7 @@ lsp::MLIRServer::~MLIRServer() = default; void lsp::MLIRServer::addOrUpdateDocument( const URIForFile &uri, StringRef contents, int64_t version, - std::vector &diagnostics) { + std::vector &diagnostics) { impl->files[uri.file()] = std::make_unique( uri, contents, version, impl->registry_fn, diagnostics); } @@ -1298,17 +1298,17 @@ std::optional lsp::MLIRServer::removeDocument(const URIForFile &uri) { return version; } -void lsp::MLIRServer::getLocationsOf(const URIForFile &uri, - const Position &defPos, - std::vector &locations) { +void lsp::MLIRServer::getLocationsOf( + const URIForFile &uri, const Position &defPos, + std::vector &locations) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) fileIt->second->getLocationsOf(uri, defPos, locations); } -void lsp::MLIRServer::findReferencesOf(const URIForFile &uri, - const Position &pos, - std::vector &references) { +void lsp::MLIRServer::findReferencesOf( + const URIForFile &uri, const Position &pos, + std::vector &references) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) fileIt->second->findReferencesOf(uri, pos, references); diff --git a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h index 85e69e69f6631..d681cbb3de0d4 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h +++ b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h @@ -9,6 +9,7 @@ #ifndef LIB_MLIR_TOOLS_MLIRLSPSERVER_SERVER_H_ #define LIB_MLIR_TOOLS_MLIRLSPSERVER_SERVER_H_ +#include "Protocol.h" #include "mlir/Support/LLVM.h" #include "mlir/Tools/mlir-lsp-server/MlirLspRegistryFunction.h" #include "llvm/Support/Error.h" @@ -19,16 +20,7 @@ namespace mlir { class DialectRegistry; namespace lsp { -struct CodeAction; -struct CodeActionContext; -struct CompletionList; -struct Diagnostic; -struct DocumentSymbol; -struct Hover; -struct Location; -struct MLIRConvertBytecodeResult; -struct Position; -struct Range; +using namespace llvm::lsp; /// This class implements all of the MLIR related functionality necessary for a /// language server. This class allows for keeping the MLIR specific logic diff --git a/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp b/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp index f1dc32615c6a3..ed20dd5bd62d5 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp @@ -9,9 +9,9 @@ #include "mlir/Tools/mlir-lsp-server/MlirLspServerMain.h" #include "LSPServer.h" #include "MLIRServer.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Transport.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Transport.h" #include "llvm/Support/Program.h" using namespace mlir; diff --git a/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp b/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp index a56e9a10f03f1..215d49ea44ff3 100644 --- a/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp @@ -13,14 +13,14 @@ #include "Protocol.h" #include "llvm/Support/JSON.h" -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // MLIRConvertBytecodeParams //===----------------------------------------------------------------------===// -bool mlir::lsp::fromJSON(const llvm::json::Value &value, +bool llvm::lsp::fromJSON(const llvm::json::Value &value, MLIRConvertBytecodeParams &result, llvm::json::Path path) { llvm::json::ObjectMapper o(value, path); @@ -31,6 +31,6 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, // MLIRConvertBytecodeResult //===----------------------------------------------------------------------===// -llvm::json::Value mlir::lsp::toJSON(const MLIRConvertBytecodeResult &value) { +llvm::json::Value llvm::lsp::toJSON(const MLIRConvertBytecodeResult &value) { return llvm::json::Object{{"output", value.output}}; } diff --git a/mlir/lib/Tools/mlir-lsp-server/Protocol.h b/mlir/lib/Tools/mlir-lsp-server/Protocol.h index d910780e1ee92..ed0db4e591d8f 100644 --- a/mlir/lib/Tools/mlir-lsp-server/Protocol.h +++ b/mlir/lib/Tools/mlir-lsp-server/Protocol.h @@ -20,9 +20,9 @@ #ifndef LIB_MLIR_TOOLS_MLIRLSPSERVER_PROTOCOL_H_ #define LIB_MLIR_TOOLS_MLIRLSPSERVER_PROTOCOL_H_ -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Protocol.h" -namespace mlir { +namespace llvm { namespace lsp { //===----------------------------------------------------------------------===// // MLIRConvertBytecodeParams @@ -54,6 +54,6 @@ struct MLIRConvertBytecodeResult { llvm::json::Value toJSON(const MLIRConvertBytecodeResult &value); } // namespace lsp -} // namespace mlir +} // namespace llvm #endif diff --git a/mlir/tools/mlir-lsp-server/mlir-lsp-server.cpp b/mlir/tools/mlir-lsp-server/mlir-lsp-server.cpp index 10d602fdfe728..712237bbbbca6 100644 --- a/mlir/tools/mlir-lsp-server/mlir-lsp-server.cpp +++ b/mlir/tools/mlir-lsp-server/mlir-lsp-server.cpp @@ -10,8 +10,8 @@ #include "mlir/IR/MLIRContext.h" #include "mlir/InitAllDialects.h" #include "mlir/InitAllExtensions.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" #include "mlir/Tools/mlir-lsp-server/MlirLspServerMain.h" +#include "llvm/Support/LSP/Protocol.h" using namespace mlir; @@ -37,8 +37,8 @@ int main(int argc, char **argv) { // Returns the registry, except in testing mode when the URI contains // "-disable-lsp-registration". Testing for/example of registering dialects // based on URI. - auto registryFn = [®istry, - &empty](const lsp::URIForFile &uri) -> DialectRegistry & { + auto registryFn = [®istry, &empty]( + const llvm::lsp::URIForFile &uri) -> DialectRegistry & { (void)empty; #ifdef MLIR_INCLUDE_TESTS if (uri.uri().contains("-disable-lsp-registration")) From 1fb65a1c2ed77f8340fad8c15d9f634b6e46010a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 15:37:20 +0000 Subject: [PATCH 03/13] Fix MLIR PDLL LSP server after move of lsp support --- .../Tools/mlir-pdll-lsp-server/LSPServer.cpp | 4 ++-- .../Tools/mlir-pdll-lsp-server/LSPServer.h | 6 +++-- .../MlirPdllLspServerMain.cpp | 7 +++--- .../Tools/mlir-pdll-lsp-server/PDLLServer.cpp | 22 +++++++++---------- .../Tools/mlir-pdll-lsp-server/PDLLServer.h | 14 ++---------- .../Tools/mlir-pdll-lsp-server/Protocol.cpp | 1 + .../lib/Tools/mlir-pdll-lsp-server/Protocol.h | 3 ++- 7 files changed, 26 insertions(+), 31 deletions(-) diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp index 82542a12a1807..f7a8a127c246b 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp @@ -10,8 +10,8 @@ #include "PDLLServer.h" #include "Protocol.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Transport.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Transport.h" #include #define DEBUG_TYPE "pdll-lsp-server" diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.h b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.h index 78c4c31100cbc..42c0a5d7b6d2b 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.h +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.h @@ -13,17 +13,19 @@ namespace llvm { struct LogicalResult; +namespace lsp { +class JSONTransport; +} // namespace lsp } // namespace llvm namespace mlir { namespace lsp { -class JSONTransport; class PDLLServer; /// Run the main loop of the LSP server using the given PDLL server and /// transport. llvm::LogicalResult runPdllLSPServer(PDLLServer &server, - JSONTransport &transport); + llvm::lsp::JSONTransport &transport); } // namespace lsp } // namespace mlir diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp index 287a131ecd17d..1a0560694b132 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp @@ -9,9 +9,9 @@ #include "mlir/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.h" #include "LSPServer.h" #include "PDLLServer.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Transport.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Transport.h" #include "llvm/Support/Program.h" using namespace mlir; @@ -72,7 +72,8 @@ LogicalResult mlir::MlirPdllLspServerMain(int argc, char **argv) { // Configure the transport used for communication. llvm::sys::ChangeStdinToBinary(); - JSONTransport transport(stdin, llvm::outs(), inputStyle, prettyPrint); + llvm::lsp::JSONTransport transport(stdin, llvm::outs(), inputStyle, + prettyPrint); // Configure the servers and start the main language server. PDLLServer::Options options(compilationDatabases, extraIncludeDirs); diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp index 84f529ae16401..5443dc3ec7da1 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp @@ -23,13 +23,13 @@ #include "mlir/Tools/PDLL/Parser/CodeComplete.h" #include "mlir/Tools/PDLL/Parser/Parser.h" #include "mlir/Tools/lsp-server-support/CompilationDatabase.h" -#include "mlir/Tools/lsp-server-support/Logging.h" #include "mlir/Tools/lsp-server-support/SourceMgrUtils.h" #include "llvm/ADT/IntervalMap.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/TypeSwitch.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/LSP/Logging.h" #include "llvm/Support/Path.h" #include @@ -1710,9 +1710,9 @@ lsp::PDLLServer::PDLLServer(const Options &options) : impl(std::make_unique(options)) {} lsp::PDLLServer::~PDLLServer() = default; -void lsp::PDLLServer::addDocument(const URIForFile &uri, StringRef contents, - int64_t version, - std::vector &diagnostics) { +void lsp::PDLLServer::addDocument( + const URIForFile &uri, StringRef contents, int64_t version, + std::vector &diagnostics) { // Build the set of additional include directories. std::vector additionalIncludeDirs = impl->options.extraDirs; const auto &fileInfo = impl->compilationDatabase.getFileInfo(uri.file()); @@ -1724,7 +1724,7 @@ void lsp::PDLLServer::addDocument(const URIForFile &uri, StringRef contents, void lsp::PDLLServer::updateDocument( const URIForFile &uri, ArrayRef changes, - int64_t version, std::vector &diagnostics) { + int64_t version, std::vector &diagnostics) { // Check that we actually have a document for this uri. auto it = impl->files.find(uri.file()); if (it == impl->files.end()) @@ -1746,17 +1746,17 @@ std::optional lsp::PDLLServer::removeDocument(const URIForFile &uri) { return version; } -void lsp::PDLLServer::getLocationsOf(const URIForFile &uri, - const Position &defPos, - std::vector &locations) { +void lsp::PDLLServer::getLocationsOf( + const URIForFile &uri, const Position &defPos, + std::vector &locations) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) fileIt->second->getLocationsOf(uri, defPos, locations); } -void lsp::PDLLServer::findReferencesOf(const URIForFile &uri, - const Position &pos, - std::vector &references) { +void lsp::PDLLServer::findReferencesOf( + const URIForFile &uri, const Position &pos, + std::vector &references) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) fileIt->second->findReferencesOf(uri, pos, references); diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h index 134431fa63bf8..981ded0756860 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h @@ -11,6 +11,7 @@ #include "mlir/Support/LLVM.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/LSP/Protocol.h" #include #include #include @@ -18,21 +19,10 @@ namespace mlir { namespace lsp { -struct Diagnostic; +using namespace llvm::lsp; class CompilationDatabase; struct PDLLViewOutputResult; enum class PDLLViewOutputKind; -struct CompletionList; -struct DocumentLink; -struct DocumentSymbol; -struct Hover; -struct InlayHint; -struct Location; -struct Position; -struct Range; -struct SignatureHelp; -struct TextDocumentContentChangeEvent; -class URIForFile; /// This class implements all of the PDLL related functionality necessary for a /// language server. This class allows for keeping the PDLL specific logic diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.cpp index 0c9896e3ec1b4..ace460536aa1b 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.cpp @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// #include "Protocol.h" +#include "mlir/Support/LLVM.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/JSON.h" diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h index 0706316631851..68f145597e519 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h @@ -20,10 +20,11 @@ #ifndef LIB_MLIR_TOOLS_MLIRPDLLLSPSERVER_PROTOCOL_H_ #define LIB_MLIR_TOOLS_MLIRPDLLLSPSERVER_PROTOCOL_H_ -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Protocol.h" namespace mlir { namespace lsp { +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // PDLLViewOutputParams //===----------------------------------------------------------------------===// From 4645f93f32aeae91f52287d8573379262a5ec6ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 15:38:03 +0000 Subject: [PATCH 04/13] Fix TBLGEN LSP server after move of lsp support --- mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp | 7 ++++--- mlir/lib/Tools/tblgen-lsp-server/LSPServer.h | 6 ++++-- .../Tools/tblgen-lsp-server/TableGenLspServerMain.cpp | 4 ++-- mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp | 4 ++-- mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h | 9 ++------- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp index bb3c0a77747aa..015d185a7d667 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp @@ -9,13 +9,14 @@ #include "LSPServer.h" #include "TableGenServer.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" -#include "mlir/Tools/lsp-server-support/Transport.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" +#include "llvm/Support/LSP/Transport.h" #include using namespace mlir; using namespace mlir::lsp; +using namespace llvm::lsp; //===----------------------------------------------------------------------===// // LSPServer diff --git a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.h b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.h index 501a9dada8aab..596688b62f8da 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.h +++ b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.h @@ -13,17 +13,19 @@ namespace llvm { struct LogicalResult; +namespace lsp { +class JSONTransport; +} // namespace lsp } // namespace llvm namespace mlir { namespace lsp { -class JSONTransport; class TableGenServer; /// Run the main loop of the LSP server using the given TableGen server and /// transport. llvm::LogicalResult runTableGenLSPServer(TableGenServer &server, - JSONTransport &transport); + llvm::lsp::JSONTransport &transport); } // namespace lsp } // namespace mlir diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp b/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp index 21af78c9a506c..b581acbaa6e5b 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp @@ -9,9 +9,9 @@ #include "mlir/Tools/tblgen-lsp-server/TableGenLspServerMain.h" #include "LSPServer.h" #include "TableGenServer.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Transport.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Transport.h" #include "llvm/Support/Program.h" using namespace mlir; diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp index 5faeeae839f44..8cdb73e26cd39 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp @@ -10,12 +10,12 @@ #include "mlir/Support/IndentedOstream.h" #include "mlir/Tools/lsp-server-support/CompilationDatabase.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" #include "mlir/Tools/lsp-server-support/SourceMgrUtils.h" #include "llvm/ADT/IntervalMap.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/StringMap.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/Path.h" #include "llvm/TableGen/Parser.h" #include "llvm/TableGen/Record.h" diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h index bdc851024a818..27bfe3dd699cc 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h @@ -11,6 +11,7 @@ #include "mlir/Support/LLVM.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/LSP/Protocol.h" #include #include #include @@ -18,13 +19,7 @@ namespace mlir { namespace lsp { -struct Diagnostic; -struct DocumentLink; -struct Hover; -struct Location; -struct Position; -struct TextDocumentContentChangeEvent; -class URIForFile; +using namespace llvm::lsp; /// This class implements all of the TableGen related functionality necessary /// for a language server. This class allows for keeping the TableGen specific From d7e4ada40208e2e036a8c3a3018f1743fe4606af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 15:38:43 +0000 Subject: [PATCH 05/13] Move unittests for LSP server support --- llvm/unittests/Support/CMakeLists.txt | 2 ++ llvm/unittests/Support/LSP/CMakeLists.txt | 7 +++++++ .../unittests/Support/LSP}/Protocol.cpp | 6 +++--- .../unittests/Support/LSP}/Transport.cpp | 12 ++++++------ mlir/unittests/CMakeLists.txt | 1 - mlir/unittests/Tools/CMakeLists.txt | 1 - .../Tools/lsp-server-support/CMakeLists.txt | 7 ------- 7 files changed, 18 insertions(+), 18 deletions(-) create mode 100644 llvm/unittests/Support/LSP/CMakeLists.txt rename {mlir/unittests/Tools/lsp-server-support => llvm/unittests/Support/LSP}/Protocol.cpp (93%) rename {mlir/unittests/Tools/lsp-server-support => llvm/unittests/Support/LSP}/Transport.cpp (96%) delete mode 100644 mlir/unittests/Tools/CMakeLists.txt delete mode 100644 mlir/unittests/Tools/lsp-server-support/CMakeLists.txt diff --git a/llvm/unittests/Support/CMakeLists.txt b/llvm/unittests/Support/CMakeLists.txt index 868c40b13b9b2..85ff21bfda883 100644 --- a/llvm/unittests/Support/CMakeLists.txt +++ b/llvm/unittests/Support/CMakeLists.txt @@ -120,6 +120,8 @@ add_llvm_unittest(SupportTests intrinsics_gen ) +add_subdirectory(LSP) + target_link_libraries(SupportTests PRIVATE LLVMTestingSupport) # Disable all warning for AlignOfTest.cpp, diff --git a/llvm/unittests/Support/LSP/CMakeLists.txt b/llvm/unittests/Support/LSP/CMakeLists.txt new file mode 100644 index 0000000000000..31c8fe100d2f9 --- /dev/null +++ b/llvm/unittests/Support/LSP/CMakeLists.txt @@ -0,0 +1,7 @@ +add_llvm_unittest(LLVMSupportLSPTests + Protocol.cpp + Transport.cpp +) +target_link_libraries(LLVMSupportLSPTests + PRIVATE + LLVMSupportLSP) diff --git a/mlir/unittests/Tools/lsp-server-support/Protocol.cpp b/llvm/unittests/Support/LSP/Protocol.cpp similarity index 93% rename from mlir/unittests/Tools/lsp-server-support/Protocol.cpp rename to llvm/unittests/Support/LSP/Protocol.cpp index 04d7b2fbb440f..43c548c24b38b 100644 --- a/mlir/unittests/Tools/lsp-server-support/Protocol.cpp +++ b/llvm/unittests/Support/LSP/Protocol.cpp @@ -6,12 +6,12 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Protocol.h" #include "gtest/gtest.h" -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; using namespace testing; namespace { diff --git a/mlir/unittests/Tools/lsp-server-support/Transport.cpp b/llvm/unittests/Support/LSP/Transport.cpp similarity index 96% rename from mlir/unittests/Tools/lsp-server-support/Transport.cpp rename to llvm/unittests/Support/LSP/Transport.cpp index 0303c1cba8bc8..c9b575e5b1316 100644 --- a/mlir/unittests/Tools/lsp-server-support/Transport.cpp +++ b/llvm/unittests/Support/LSP/Transport.cpp @@ -6,15 +6,15 @@ // //===----------------------------------------------------------------------===// -#include "mlir/Tools/lsp-server-support/Transport.h" -#include "mlir/Tools/lsp-server-support/Logging.h" -#include "mlir/Tools/lsp-server-support/Protocol.h" +#include "llvm/Support/LSP/Transport.h" #include "llvm/Support/FileSystem.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" #include "gmock/gmock.h" #include "gtest/gtest.h" -using namespace mlir; -using namespace mlir::lsp; +using namespace llvm; +using namespace llvm::lsp; using namespace testing; namespace { @@ -88,7 +88,7 @@ class TransportInputTest : public Test { TEST_F(TransportInputTest, RequestWithInvalidParams) { struct Handler { void onMethod(const TextDocumentItem ¶ms, - mlir::lsp::Callback callback) {} + llvm::lsp::Callback callback) {} } handler; getMessageHandler().method("invalid-params-request", &handler, &Handler::onMethod); diff --git a/mlir/unittests/CMakeLists.txt b/mlir/unittests/CMakeLists.txt index c5f0d7e384d01..89332bce5fe05 100644 --- a/mlir/unittests/CMakeLists.txt +++ b/mlir/unittests/CMakeLists.txt @@ -18,7 +18,6 @@ add_subdirectory(Support) add_subdirectory(Rewrite) add_subdirectory(TableGen) add_subdirectory(Target) -add_subdirectory(Tools) add_subdirectory(Transforms) if(MLIR_ENABLE_EXECUTION_ENGINE) diff --git a/mlir/unittests/Tools/CMakeLists.txt b/mlir/unittests/Tools/CMakeLists.txt deleted file mode 100644 index a97588d928668..0000000000000 --- a/mlir/unittests/Tools/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -add_subdirectory(lsp-server-support) diff --git a/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt b/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt deleted file mode 100644 index c539c9bc5101f..0000000000000 --- a/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -add_mlir_unittest(MLIRLspServerSupportTests - Protocol.cpp - Transport.cpp -) -mlir_target_link_libraries(MLIRLspServerSupportTests - PRIVATE - MLIRLspServerSupportLib) From e84a2eb41af0d742f57bf88dec9dd6c14a2676bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Tue, 26 Aug 2025 16:28:36 +0000 Subject: [PATCH 06/13] Fix linter warnings --- llvm/include/llvm/Support/LSP/Logging.h | 30 +- llvm/include/llvm/Support/LSP/Protocol.h | 4 +- llvm/include/llvm/Support/LSP/Transport.h | 224 ++--- llvm/lib/Support/LSP/Logging.cpp | 22 +- llvm/lib/Support/LSP/Protocol.cpp | 994 +++++++++++----------- llvm/lib/Support/LSP/Transport.cpp | 330 +++---- 6 files changed, 802 insertions(+), 802 deletions(-) diff --git a/llvm/include/llvm/Support/LSP/Logging.h b/llvm/include/llvm/Support/LSP/Logging.h index c9631d0f58fa1..6930a7cf246df 100644 --- a/llvm/include/llvm/Support/LSP/Logging.h +++ b/llvm/include/llvm/Support/LSP/Logging.h @@ -6,8 +6,8 @@ // //===----------------------------------------------------------------------===// -#ifndef MLIR_TOOLS_LSPSERVERSUPPORT_LOGGING_H -#define MLIR_TOOLS_LSPSERVERSUPPORT_LOGGING_H +#ifndef LLVM_SUPPORT_LSP_LOGGING_H +#define LLVM_SUPPORT_LSP_LOGGING_H #include "llvm/Support/Debug.h" #include "llvm/Support/FormatVariadic.h" @@ -25,21 +25,21 @@ class Logger { enum class Level { Debug, Info, Error }; /// Set the severity level of the logger. - static void setLogLevel(Level logLevel); + static void setLogLevel(Level LogLevel); /// Initiate a log message at various severity levels. These should be called /// after a call to `initialize`. template - static void debug(const char *fmt, Ts &&...vals) { - log(Level::Debug, fmt, llvm::formatv(fmt, std::forward(vals)...)); + static void debug(const char *Fmt, Ts &&...Vals) { + log(Level::Debug, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } template - static void info(const char *fmt, Ts &&...vals) { - log(Level::Info, fmt, llvm::formatv(fmt, std::forward(vals)...)); + static void info(const char *Fmt, Ts &&...Vals) { + log(Level::Info, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } template - static void error(const char *fmt, Ts &&...vals) { - log(Level::Error, fmt, llvm::formatv(fmt, std::forward(vals)...)); + static void error(const char *Fmt, Ts &&...Vals) { + log(Level::Error, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } private: @@ -49,16 +49,16 @@ class Logger { static Logger &get(); /// Start a log message with the given severity level. - static void log(Level logLevel, const char *fmt, - const llvm::formatv_object_base &message); + static void log(Level LogLevel, const char *Fmt, + const llvm::formatv_object_base &Message); /// The minimum logging level. Messages with lower level are ignored. - Level logLevel = Level::Error; + Level LogLevel = Level::Error; /// A mutex used to guard logging. - std::mutex mutex; + std::mutex Mutex; }; } // namespace lsp -} // namespace mlir +} // namespace llvm -#endif // MLIR_TOOLS_LSPSERVERSUPPORT_LOGGING_H +#endif // LLVM_SUPPORT_LSP_LOGGING_H diff --git a/llvm/include/llvm/Support/LSP/Protocol.h b/llvm/include/llvm/Support/LSP/Protocol.h index 3da13a8a44680..a01a1a0a00ef2 100644 --- a/llvm/include/llvm/Support/LSP/Protocol.h +++ b/llvm/include/llvm/Support/LSP/Protocol.h @@ -20,8 +20,8 @@ // //===----------------------------------------------------------------------===// -#ifndef MLIR_TOOLS_LSPSERVERSUPPORT_PROTOCOL_H -#define MLIR_TOOLS_LSPSERVERSUPPORT_PROTOCOL_H +#ifndef LLVM_SUPPORT_LSP_PROTOCOL_H +#define LLVM_SUPPORT_LSP_PROTOCOL_H #include "llvm/Support/JSON.h" #include "llvm/Support/LogicalResult.h" diff --git a/llvm/include/llvm/Support/LSP/Transport.h b/llvm/include/llvm/Support/LSP/Transport.h index 6cb4388a7732d..45a0b6a78e304 100644 --- a/llvm/include/llvm/Support/LSP/Transport.h +++ b/llvm/include/llvm/Support/LSP/Transport.h @@ -12,8 +12,8 @@ // //===----------------------------------------------------------------------===// -#ifndef MLIR_TOOLS_LSPSERVERSUPPORT_TRANSPORT_H -#define MLIR_TOOLS_LSPSERVERSUPPORT_TRANSPORT_H +#ifndef LLVM_SUPPORT_LSP_TRANSPORT_H +#define LLVM_SUPPORT_LSP_TRANSPORT_H #include "llvm/Support/LSP/Logging.h" #include "llvm/ADT/FunctionExtras.h" @@ -27,13 +27,12 @@ namespace llvm { // Simple helper function that returns a string as printed from a op. -template -static std::string debugString(T &&op) { - std::string instrStr; - llvm::raw_string_ostream os(instrStr); - os << op; - return os.str(); - } +template static std::string debugString(T &&Op) { + std::string InstrStr; + llvm::raw_string_ostream Os(InstrStr); + Os << Op; + return Os.str(); +} namespace lsp { class MessageHandler; @@ -52,79 +51,79 @@ enum JSONStreamStyle { /// An abstract class used by the JSONTransport to read JSON message. class JSONTransportInput { public: - explicit JSONTransportInput(JSONStreamStyle style = JSONStreamStyle::Standard) - : style(style) {} + explicit JSONTransportInput(JSONStreamStyle Style = JSONStreamStyle::Standard) + : Style(Style) {} virtual ~JSONTransportInput() = default; virtual bool hasError() const = 0; virtual bool isEndOfInput() const = 0; /// Read in a message from the input stream. - LogicalResult readMessage(std::string &json) { - return style == JSONStreamStyle::Delimited ? readDelimitedMessage(json) - : readStandardMessage(json); + LogicalResult readMessage(std::string &Json) { + return Style == JSONStreamStyle::Delimited ? readDelimitedMessage(Json) + : readStandardMessage(Json); } - virtual LogicalResult readDelimitedMessage(std::string &json) = 0; - virtual LogicalResult readStandardMessage(std::string &json) = 0; + virtual LogicalResult readDelimitedMessage(std::string &Json) = 0; + virtual LogicalResult readStandardMessage(std::string &Json) = 0; private: /// The JSON stream style to use. - JSONStreamStyle style; + JSONStreamStyle Style; }; /// Concrete implementation of the JSONTransportInput that reads from a file. class JSONTransportInputOverFile : public JSONTransportInput { public: explicit JSONTransportInputOverFile( - std::FILE *in, JSONStreamStyle style = JSONStreamStyle::Standard) - : JSONTransportInput(style), in(in) {} + std::FILE *In, JSONStreamStyle Style = JSONStreamStyle::Standard) + : JSONTransportInput(Style), In(In) {} - bool hasError() const final { return ferror(in); } - bool isEndOfInput() const final { return feof(in); } + bool hasError() const final { return ferror(In); } + bool isEndOfInput() const final { return feof(In); } - LogicalResult readDelimitedMessage(std::string &json) final; - LogicalResult readStandardMessage(std::string &json) final; + LogicalResult readDelimitedMessage(std::string &Json) final; + LogicalResult readStandardMessage(std::string &Json) final; private: - std::FILE *in; + std::FILE *In; }; /// A transport class that performs the JSON-RPC communication with the LSP /// client. class JSONTransport { public: - JSONTransport(std::unique_ptr in, raw_ostream &out, - bool prettyOutput = false) - : in(std::move(in)), out(out), prettyOutput(prettyOutput) {} + JSONTransport(std::unique_ptr In, raw_ostream &Out, + bool PrettyOutput = false) + : In(std::move(In)), Out(Out), PrettyOutput(PrettyOutput) {} - JSONTransport(std::FILE *in, raw_ostream &out, - JSONStreamStyle style = JSONStreamStyle::Standard, - bool prettyOutput = false) - : in(std::make_unique(in, style)), out(out), - prettyOutput(prettyOutput) {} + JSONTransport(std::FILE *In, raw_ostream &Out, + JSONStreamStyle Style = JSONStreamStyle::Standard, + bool PrettyOutput = false) + : In(std::make_unique(In, Style)), Out(Out), + PrettyOutput(PrettyOutput) {} /// The following methods are used to send a message to the LSP client. - void notify(StringRef method, llvm::json::Value params); - void call(StringRef method, llvm::json::Value params, llvm::json::Value id); - void reply(llvm::json::Value id, llvm::Expected result); + void notify(StringRef Method, llvm::json::Value Params); + void call(StringRef Method, llvm::json::Value Params, llvm::json::Value Id); + void reply(llvm::json::Value Id, llvm::Expected Result); /// Start executing the JSON-RPC transport. - llvm::Error run(MessageHandler &handler); + llvm::Error run(MessageHandler &Handler); private: /// Dispatches the given incoming json message to the message handler. - bool handleMessage(llvm::json::Value msg, MessageHandler &handler); + bool handleMessage(llvm::json::Value Msg, MessageHandler &Handler); /// Writes the given message to the output stream. - void sendMessage(llvm::json::Value msg); + void sendMessage(llvm::json::Value Msg); private: /// The input to read a message from. - std::unique_ptr in; - SmallVector outputBuffer; + std::unique_ptr In; + SmallVector OutputBuffer; /// The output file stream. - raw_ostream &out; + raw_ostream &Out; /// If the output JSON should be formatted for easier readability. - bool prettyOutput; + bool PrettyOutput; }; //===----------------------------------------------------------------------===// @@ -145,7 +144,7 @@ using OutgoingNotification = llvm::unique_function; /// the client. template using OutgoingRequest = - llvm::unique_function; + llvm::unique_function; /// An `OutgoingRequestCallback` is invoked when an outgoing request to the /// client receives a response in turn. It is passed the original request's ID, @@ -157,70 +156,71 @@ using OutgoingRequestCallback = /// A handler used to process the incoming transport messages. class MessageHandler { public: - MessageHandler(JSONTransport &transport) : transport(transport) {} + MessageHandler(JSONTransport &Transport) : Transport(Transport) {} - bool onNotify(StringRef method, llvm::json::Value value); - bool onCall(StringRef method, llvm::json::Value params, llvm::json::Value id); - bool onReply(llvm::json::Value id, llvm::Expected result); + bool onNotify(StringRef Method, llvm::json::Value Value); + bool onCall(StringRef Method, llvm::json::Value Params, llvm::json::Value Id); + bool onReply(llvm::json::Value Id, llvm::Expected Result); template - static llvm::Expected parse(const llvm::json::Value &raw, - StringRef payloadName, StringRef payloadKind) { - T result; - llvm::json::Path::Root root; - if (fromJSON(raw, result, root)) - return std::move(result); + static llvm::Expected parse(const llvm::json::Value &Raw, + StringRef PayloadName, StringRef PayloadKind) { + T Result; + llvm::json::Path::Root Root; + if (fromJSON(Raw, Result, Root)) + return std::move(Result); // Dump the relevant parts of the broken message. - std::string context; - llvm::raw_string_ostream os(context); - root.printErrorContext(raw, os); + std::string Context; + llvm::raw_string_ostream Os(Context); + Root.printErrorContext(Raw, Os); // Report the error (e.g. to the client). return llvm::make_error( - llvm::formatv("failed to decode {0} {1}: {2}", payloadName, payloadKind, - fmt_consume(root.getError())), + llvm::formatv("failed to decode {0} {1}: {2}", PayloadName, PayloadKind, + fmt_consume(Root.getError())), ErrorCode::InvalidParams); } template - void method(llvm::StringLiteral method, ThisT *thisPtr, - void (ThisT::*handler)(const Param &, Callback)) { - methodHandlers[method] = [method, handler, - thisPtr](llvm::json::Value rawParams, - Callback reply) { - llvm::Expected param = parse(rawParams, method, "request"); - if (!param) - return reply(param.takeError()); - (thisPtr->*handler)(*param, std::move(reply)); + void method(llvm::StringLiteral Method, ThisT *ThisPtr, + void (ThisT::*Handler)(const Param &, Callback)) { + MethodHandlers[Method] = [Method, Handler, + ThisPtr](llvm::json::Value RawParams, + Callback Reply) { + llvm::Expected Parameter = + parse(RawParams, Method, "request"); + if (!Parameter) + return Reply(Parameter.takeError()); + (ThisPtr->*Handler)(*Parameter, std::move(Reply)); }; } template - void notification(llvm::StringLiteral method, ThisT *thisPtr, - void (ThisT::*handler)(const Param &)) { - notificationHandlers[method] = [method, handler, - thisPtr](llvm::json::Value rawParams) { - llvm::Expected param = - parse(rawParams, method, "notification"); - if (!param) { - return llvm::consumeError( - llvm::handleErrors(param.takeError(), [](const LSPError &lspError) { + void notification(llvm::StringLiteral Method, ThisT *ThisPtr, + void (ThisT::*Handler)(const Param &)) { + NotificationHandlers[Method] = [Method, Handler, + ThisPtr](llvm::json::Value RawParams) { + llvm::Expected Parameter = + parse(RawParams, Method, "notification"); + if (!Parameter) { + return llvm::consumeError(llvm::handleErrors( + Parameter.takeError(), [](const LSPError &LspError) { Logger::error("JSON parsing error: {0}", - lspError.message.c_str()); + LspError.message.c_str()); })); } - (thisPtr->*handler)(*param); + (ThisPtr->*Handler)(*Parameter); }; } /// Create an OutgoingNotification object used for the given method. template - OutgoingNotification outgoingNotification(llvm::StringLiteral method) { - return [&, method](const T ¶ms) { - std::lock_guard transportLock(transportOutputMutex); - Logger::info("--> {0}", method); - transport.notify(method, llvm::json::Value(params)); + OutgoingNotification outgoingNotification(llvm::StringLiteral Method) { + return [&, Method](const T &Params) { + std::lock_guard TransportLock(TransportOutputMutex); + Logger::info("--> {0}", Method); + Transport.notify(Method, llvm::json::Value(Params)); }; } @@ -230,33 +230,33 @@ class MessageHandler { /// is invoked. template OutgoingRequest - outgoingRequest(llvm::StringLiteral method, - OutgoingRequestCallback callback) { - return [&, method, callback](const Param ¶m, llvm::json::Value id) { - auto callbackWrapper = [method, callback = std::move(callback)]( - llvm::json::Value id, - llvm::Expected value) { - if (!value) - return callback(std::move(id), value.takeError()); - - std::string responseName = llvm::formatv("reply:{0}({1})", method, id); - llvm::Expected result = - parse(*value, responseName, "response"); - if (!result) - return callback(std::move(id), result.takeError()); - - return callback(std::move(id), *result); + outgoingRequest(llvm::StringLiteral Method, + OutgoingRequestCallback Callback) { + return [&, Method, Callback](const Param &Parameter, llvm::json::Value Id) { + auto CallbackWrapper = [Method, Callback = std::move(Callback)]( + llvm::json::Value Id, + llvm::Expected Value) { + if (!Value) + return Callback(std::move(Id), Value.takeError()); + + std::string ResponseName = llvm::formatv("reply:{0}({1})", Method, Id); + llvm::Expected ParseResult = + parse(*Value, ResponseName, "response"); + if (!ParseResult) + return Callback(std::move(Id), ParseResult.takeError()); + + return Callback(std::move(Id), *ParseResult); }; { - std::lock_guard lock(responseHandlersMutex); - responseHandlers.insert( - {debugString(id), std::make_pair(method.str(), callbackWrapper)}); + std::lock_guard Lock(ResponseHandlersMutex); + ResponseHandlers.insert( + {debugString(Id), std::make_pair(Method.str(), CallbackWrapper)}); } - std::lock_guard transportLock(transportOutputMutex); - Logger::info("--> {0}({1})", method, id); - transport.call(method, llvm::json::Value(param), id); + std::lock_guard TransportLock(TransportOutputMutex); + Logger::info("--> {0}({1})", Method, Id); + Transport.call(Method, llvm::json::Value(Parameter), Id); }; } @@ -264,26 +264,26 @@ class MessageHandler { template using HandlerMap = llvm::StringMap>; - HandlerMap notificationHandlers; + HandlerMap NotificationHandlers; HandlerMap)> - methodHandlers; + MethodHandlers; /// A pair of (1) the original request's method name, and (2) the callback /// function to be invoked for responses. using ResponseHandlerTy = std::pair>; /// A mapping from request/response ID to response handler. - llvm::StringMap responseHandlers; + llvm::StringMap ResponseHandlers; /// Mutex to guard insertion into the response handler map. - std::mutex responseHandlersMutex; + std::mutex ResponseHandlersMutex; - JSONTransport &transport; + JSONTransport &Transport; /// Mutex to guard sending output messages to the transport. - std::mutex transportOutputMutex; + std::mutex TransportOutputMutex; }; } // namespace lsp -} // namespace mlir +} // namespace llvm #endif diff --git a/llvm/lib/Support/LSP/Logging.cpp b/llvm/lib/Support/LSP/Logging.cpp index 36916395375cc..b36621ae1c6c6 100644 --- a/llvm/lib/Support/LSP/Logging.cpp +++ b/llvm/lib/Support/LSP/Logging.cpp @@ -13,29 +13,29 @@ using namespace llvm; using namespace llvm::lsp; -void Logger::setLogLevel(Level logLevel) { get().logLevel = logLevel; } +void Logger::setLogLevel(Level LogLevel) { get().LogLevel = LogLevel; } Logger &Logger::get() { - static Logger logger; - return logger; + static Logger Logger; + return Logger; } -void Logger::log(Level logLevel, const char *fmt, - const llvm::formatv_object_base &message) { - Logger &logger = get(); +void Logger::log(Level LogLevel, const char *Fmt, + const llvm::formatv_object_base &Message) { + Logger &Logger = get(); // Ignore messages with log levels below the current setting in the logger. - if (logLevel < logger.logLevel) + if (LogLevel < Logger.LogLevel) return; // An indicator character for each log level. - const char *logLevelIndicators = "DIE"; + const char *LogLevelIndicators = "DIE"; // Format the message and print to errs. - llvm::sys::TimePoint<> timestamp = std::chrono::system_clock::now(); - std::lock_guard logGuard(logger.mutex); + llvm::sys::TimePoint<> Timestamp = std::chrono::system_clock::now(); + std::lock_guard LogGuard(Logger.Mutex); llvm::errs() << llvm::formatv( "{0}[{1:%H:%M:%S.%L}] {2}\n", - logLevelIndicators[static_cast(logLevel)], timestamp, message); + LogLevelIndicators[static_cast(LogLevel)], Timestamp, Message); llvm::errs().flush(); } diff --git a/llvm/lib/Support/LSP/Protocol.cpp b/llvm/lib/Support/LSP/Protocol.cpp index c2494dcf841c0..f22126345a435 100644 --- a/llvm/lib/Support/LSP/Protocol.cpp +++ b/llvm/lib/Support/LSP/Protocol.cpp @@ -24,17 +24,17 @@ using namespace llvm::lsp; // Helper that doesn't treat `null` and absent fields as failures. template -static bool mapOptOrNull(const llvm::json::Value ¶ms, - llvm::StringLiteral prop, T &out, - llvm::json::Path path) { - const llvm::json::Object *o = params.getAsObject(); - assert(o); +static bool mapOptOrNull(const llvm::json::Value &Params, + llvm::StringLiteral Prop, T &Out, + llvm::json::Path Path) { + const llvm::json::Object *O = Params.getAsObject(); + assert(O); // Field is missing or null. - auto *v = o->get(prop); - if (!v || v->getAsNull()) + auto *V = O->get(Prop); + if (!V || V->getAsNull()) return true; - return fromJSON(*v, out, path.field(prop)); + return fromJSON(*V, Out, Path.field(Prop)); } //===----------------------------------------------------------------------===// @@ -47,22 +47,22 @@ char LSPError::ID; // URIForFile //===----------------------------------------------------------------------===// -static bool isWindowsPath(StringRef path) { - return path.size() > 1 && llvm::isAlpha(path[0]) && path[1] == ':'; +static bool isWindowsPath(StringRef Path) { + return Path.size() > 1 && llvm::isAlpha(Path[0]) && Path[1] == ':'; } -static bool isNetworkPath(StringRef path) { - return path.size() > 2 && path[0] == path[1] && - llvm::sys::path::is_separator(path[0]); +static bool isNetworkPath(StringRef Path) { + return Path.size() > 2 && Path[0] == Path[1] && + llvm::sys::path::is_separator(Path[0]); } -static bool shouldEscapeInURI(unsigned char c) { +static bool shouldEscapeInURI(unsigned char C) { // Unreserved characters. - if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || - (c >= '0' && c <= '9')) + if ((C >= 'a' && C <= 'z') || (C >= 'A' && C <= 'Z') || + (C >= '0' && C <= '9')) return false; - switch (c) { + switch (C) { case '-': case '_': case '.': @@ -80,215 +80,215 @@ static bool shouldEscapeInURI(unsigned char c) { /// - Unreserved characters are not escaped. /// - Reserved characters always escaped with exceptions like '/'. /// - All other characters are escaped. -static void percentEncode(StringRef content, std::string &out) { - for (unsigned char c : content) { - if (shouldEscapeInURI(c)) { - out.push_back('%'); - out.push_back(llvm::hexdigit(c / 16)); - out.push_back(llvm::hexdigit(c % 16)); +static void percentEncode(StringRef Content, std::string &Out) { + for (unsigned char C : Content) { + if (shouldEscapeInURI(C)) { + Out.push_back('%'); + Out.push_back(llvm::hexdigit(C / 16)); + Out.push_back(llvm::hexdigit(C % 16)); } else { - out.push_back(c); + Out.push_back(C); } } } /// Decodes a string according to percent-encoding. -static std::string percentDecode(StringRef content) { - std::string result; - for (auto i = content.begin(), e = content.end(); i != e; ++i) { - if (*i != '%') { - result += *i; +static std::string percentDecode(StringRef Content) { + std::string Result; + for (auto I = Content.begin(), E = Content.end(); I != E; ++I) { + if (*I != '%') { + Result += *I; continue; } - if (*i == '%' && i + 2 < content.end() && llvm::isHexDigit(*(i + 1)) && - llvm::isHexDigit(*(i + 2))) { - result.push_back(llvm::hexFromNibbles(*(i + 1), *(i + 2))); - i += 2; + if (*I == '%' && I + 2 < Content.end() && llvm::isHexDigit(*(I + 1)) && + llvm::isHexDigit(*(I + 2))) { + Result.push_back(llvm::hexFromNibbles(*(I + 1), *(I + 2))); + I += 2; } else { - result.push_back(*i); + Result.push_back(*I); } } - return result; + return Result; } /// Return the set containing the supported URI schemes. static StringSet<> &getSupportedSchemes() { - static StringSet<> schemes({"file", "test"}); - return schemes; + static StringSet<> Schemes({"file", "test"}); + return Schemes; } /// Returns true if the given scheme is structurally valid, i.e. it does not /// contain any invalid scheme characters. This does not check that the scheme /// is actually supported. -static bool isStructurallyValidScheme(StringRef scheme) { - if (scheme.empty()) +static bool isStructurallyValidScheme(StringRef Scheme) { + if (Scheme.empty()) return false; - if (!llvm::isAlpha(scheme[0])) + if (!llvm::isAlpha(Scheme[0])) return false; - return llvm::all_of(llvm::drop_begin(scheme), [](char c) { - return llvm::isAlnum(c) || c == '+' || c == '.' || c == '-'; + return llvm::all_of(llvm::drop_begin(Scheme), [](char C) { + return llvm::isAlnum(C) || C == '+' || C == '.' || C == '-'; }); } -static llvm::Expected uriFromAbsolutePath(StringRef absolutePath, - StringRef scheme) { - std::string body; - StringRef authority; - StringRef root = llvm::sys::path::root_name(absolutePath); - if (isNetworkPath(root)) { +static llvm::Expected uriFromAbsolutePath(StringRef AbsolutePath, + StringRef Scheme) { + std::string Body; + StringRef Authority; + StringRef Root = llvm::sys::path::root_name(AbsolutePath); + if (isNetworkPath(Root)) { // Windows UNC paths e.g. \\server\share => file://server/share - authority = root.drop_front(2); - absolutePath.consume_front(root); - } else if (isWindowsPath(root)) { + Authority = Root.drop_front(2); + AbsolutePath.consume_front(Root); + } else if (isWindowsPath(Root)) { // Windows paths e.g. X:\path => file:///X:/path - body = "/"; + Body = "/"; } - body += llvm::sys::path::convert_to_slash(absolutePath); + Body += llvm::sys::path::convert_to_slash(AbsolutePath); - std::string uri = scheme.str() + ":"; - if (authority.empty() && body.empty()) - return uri; + std::string Uri = Scheme.str() + ":"; + if (Authority.empty() && Body.empty()) + return Uri; // If authority if empty, we only print body if it starts with "/"; otherwise, // the URI is invalid. - if (!authority.empty() || StringRef(body).starts_with("/")) { - uri.append("//"); - percentEncode(authority, uri); + if (!Authority.empty() || StringRef(Body).starts_with("/")) { + Uri.append("//"); + percentEncode(Authority, Uri); } - percentEncode(body, uri); - return uri; + percentEncode(Body, Uri); + return Uri; } -static llvm::Expected getAbsolutePath(StringRef authority, - StringRef body) { - if (!body.starts_with("/")) +static llvm::Expected getAbsolutePath(StringRef Authority, + StringRef Body) { + if (!Body.starts_with("/")) return llvm::createStringError( llvm::inconvertibleErrorCode(), "File scheme: expect body to be an absolute path starting " "with '/': " + - body); - SmallString<128> path; - if (!authority.empty()) { + Body); + SmallString<128> Path; + if (!Authority.empty()) { // Windows UNC paths e.g. file://server/share => \\server\share - ("//" + authority).toVector(path); - } else if (isWindowsPath(body.substr(1))) { + ("//" + Authority).toVector(Path); + } else if (isWindowsPath(Body.substr(1))) { // Windows paths e.g. file:///X:/path => X:\path - body.consume_front("/"); + Body.consume_front("/"); } - path.append(body); - llvm::sys::path::native(path); - return std::string(path); + Path.append(Body); + llvm::sys::path::native(Path); + return std::string(Path); } -static llvm::Expected parseFilePathFromURI(StringRef origUri) { - StringRef uri = origUri; +static llvm::Expected parseFilePathFromURI(StringRef OrigUri) { + StringRef Uri = OrigUri; // Decode the scheme of the URI. - size_t pos = uri.find(':'); - if (pos == StringRef::npos) + size_t Pos = Uri.find(':'); + if (Pos == StringRef::npos) return llvm::createStringError(llvm::inconvertibleErrorCode(), "Scheme must be provided in URI: " + - origUri); - StringRef schemeStr = uri.substr(0, pos); - std::string uriScheme = percentDecode(schemeStr); - if (!isStructurallyValidScheme(uriScheme)) + OrigUri); + StringRef SchemeStr = Uri.substr(0, Pos); + std::string UriScheme = percentDecode(SchemeStr); + if (!isStructurallyValidScheme(UriScheme)) return llvm::createStringError(llvm::inconvertibleErrorCode(), - "Invalid scheme: " + schemeStr + - " (decoded: " + uriScheme + ")"); - uri = uri.substr(pos + 1); + "Invalid scheme: " + SchemeStr + + " (decoded: " + UriScheme + ")"); + Uri = Uri.substr(Pos + 1); // Decode the authority of the URI. - std::string uriAuthority; - if (uri.consume_front("//")) { - pos = uri.find('/'); - uriAuthority = percentDecode(uri.substr(0, pos)); - uri = uri.substr(pos); + std::string UriAuthority; + if (Uri.consume_front("//")) { + Pos = Uri.find('/'); + UriAuthority = percentDecode(Uri.substr(0, Pos)); + Uri = Uri.substr(Pos); } // Decode the body of the URI. - std::string uriBody = percentDecode(uri); + std::string UriBody = percentDecode(Uri); // Compute the absolute path for this uri. - if (!getSupportedSchemes().contains(uriScheme)) { + if (!getSupportedSchemes().contains(UriScheme)) { return llvm::createStringError(llvm::inconvertibleErrorCode(), - "unsupported URI scheme `" + uriScheme + + "unsupported URI scheme `" + UriScheme + "' for workspace files"); } - return getAbsolutePath(uriAuthority, uriBody); + return getAbsolutePath(UriAuthority, UriBody); } -llvm::Expected URIForFile::fromURI(StringRef uri) { - llvm::Expected filePath = parseFilePathFromURI(uri); - if (!filePath) - return filePath.takeError(); - return URIForFile(std::move(*filePath), uri.str()); +llvm::Expected URIForFile::fromURI(StringRef Uri) { + llvm::Expected FilePath = parseFilePathFromURI(Uri); + if (!FilePath) + return FilePath.takeError(); + return URIForFile(std::move(*FilePath), Uri.str()); } -llvm::Expected URIForFile::fromFile(StringRef absoluteFilepath, - StringRef scheme) { - llvm::Expected uri = - uriFromAbsolutePath(absoluteFilepath, scheme); - if (!uri) - return uri.takeError(); - return fromURI(*uri); +llvm::Expected URIForFile::fromFile(StringRef AbsoluteFilepath, + StringRef Scheme) { + llvm::Expected Uri = + uriFromAbsolutePath(AbsoluteFilepath, Scheme); + if (!Uri) + return Uri.takeError(); + return fromURI(*Uri); } StringRef URIForFile::scheme() const { return uri().split(':').first; } -void URIForFile::registerSupportedScheme(StringRef scheme) { - getSupportedSchemes().insert(scheme); +void URIForFile::registerSupportedScheme(StringRef Scheme) { + getSupportedSchemes().insert(Scheme); } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, URIForFile &result, - llvm::json::Path path) { - if (std::optional str = value.getAsString()) { - llvm::Expected expectedURI = URIForFile::fromURI(*str); - if (!expectedURI) { - path.report("unresolvable URI"); - consumeError(expectedURI.takeError()); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, URIForFile &Result, + llvm::json::Path Path) { + if (std::optional Str = Value.getAsString()) { + llvm::Expected ExpectedUri = URIForFile::fromURI(*Str); + if (!ExpectedUri) { + Path.report("unresolvable URI"); + consumeError(ExpectedUri.takeError()); return false; } - result = std::move(*expectedURI); + Result = std::move(*ExpectedUri); return true; } return false; } -llvm::json::Value llvm::lsp::toJSON(const URIForFile &value) { - return value.uri(); +llvm::json::Value llvm::lsp::toJSON(const URIForFile &Value) { + return Value.uri(); } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const URIForFile &value) { - return os << value.uri(); +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, const URIForFile &Value) { + return Os << Value.uri(); } //===----------------------------------------------------------------------===// // ClientCapabilities //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - ClientCapabilities &result, llvm::json::Path path) { - const llvm::json::Object *o = value.getAsObject(); - if (!o) { - path.report("expected object"); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + ClientCapabilities &Result, llvm::json::Path Path) { + const llvm::json::Object *O = Value.getAsObject(); + if (!O) { + Path.report("expected object"); return false; } - if (const llvm::json::Object *textDocument = o->getObject("textDocument")) { - if (const llvm::json::Object *documentSymbol = - textDocument->getObject("documentSymbol")) { - if (std::optional hierarchicalSupport = - documentSymbol->getBoolean("hierarchicalDocumentSymbolSupport")) - result.hierarchicalDocumentSymbol = *hierarchicalSupport; + if (const llvm::json::Object *TextDocument = O->getObject("textDocument")) { + if (const llvm::json::Object *DocumentSymbol = + TextDocument->getObject("documentSymbol")) { + if (std::optional HierarchicalSupport = + DocumentSymbol->getBoolean("hierarchicalDocumentSymbolSupport")) + Result.hierarchicalDocumentSymbol = *HierarchicalSupport; } - if (auto *codeAction = textDocument->getObject("codeAction")) { - if (codeAction->getObject("codeActionLiteralSupport")) - result.codeActionStructure = true; + if (auto *CodeAction = TextDocument->getObject("codeAction")) { + if (CodeAction->getObject("codeActionLiteralSupport")) + Result.codeActionStructure = true; } } - if (auto *window = o->getObject("window")) { - if (std::optional workDoneProgressSupport = - window->getBoolean("workDoneProgress")) - result.workDoneProgress = *workDoneProgressSupport; + if (auto *Window = O->getObject("window")) { + if (std::optional WorkDoneProgressSupport = + Window->getBoolean("workDoneProgress")) + Result.workDoneProgress = *WorkDoneProgressSupport; } return true; } @@ -297,14 +297,14 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // ClientInfo //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, ClientInfo &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - if (!o || !o.map("name", result.name)) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, ClientInfo &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + if (!O || !O.map("name", Result.name)) return false; // Don't fail if we can't parse version. - o.map("version", result.version); + O.map("version", Result.version); return true; } @@ -312,34 +312,34 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, ClientInfo &result, // InitializeParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, TraceLevel &result, - llvm::json::Path path) { - if (std::optional str = value.getAsString()) { - if (*str == "off") { - result = TraceLevel::Off; +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, TraceLevel &Result, + llvm::json::Path Path) { + if (std::optional Str = Value.getAsString()) { + if (*Str == "off") { + Result = TraceLevel::Off; return true; } - if (*str == "messages") { - result = TraceLevel::Messages; + if (*Str == "messages") { + Result = TraceLevel::Messages; return true; } - if (*str == "verbose") { - result = TraceLevel::Verbose; + if (*Str == "verbose") { + Result = TraceLevel::Verbose; return true; } } return false; } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - InitializeParams &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - if (!o) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + InitializeParams &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + if (!O) return false; // We deliberately don't fail if we can't parse individual fields. - o.map("capabilities", result.capabilities); - o.map("trace", result.trace); - mapOptOrNull(value, "clientInfo", result.clientInfo, path); + O.map("capabilities", Result.capabilities); + O.map("trace", Result.trace); + mapOptOrNull(Value, "clientInfo", Result.clientInfo, Path); return true; } @@ -348,27 +348,27 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // TextDocumentItem //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - TextDocumentItem &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("uri", result.uri) && - o.map("languageId", result.languageId) && o.map("text", result.text) && - o.map("version", result.version); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + TextDocumentItem &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("uri", Result.uri) && + O.map("languageId", Result.languageId) && O.map("text", Result.text) && + O.map("version", Result.version); } //===----------------------------------------------------------------------===// // TextDocumentIdentifier //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const TextDocumentIdentifier &value) { - return llvm::json::Object{{"uri", value.uri}}; +llvm::json::Value llvm::lsp::toJSON(const TextDocumentIdentifier &Value) { + return llvm::json::Object{{"uri", Value.uri}}; } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - TextDocumentIdentifier &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("uri", result.uri); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + TextDocumentIdentifier &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("uri", Result.uri); } //===----------------------------------------------------------------------===// @@ -376,134 +376,134 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, //===----------------------------------------------------------------------===// llvm::json::Value -llvm::lsp::toJSON(const VersionedTextDocumentIdentifier &value) { +llvm::lsp::toJSON(const VersionedTextDocumentIdentifier &Value) { return llvm::json::Object{ - {"uri", value.uri}, - {"version", value.version}, + {"uri", Value.uri}, + {"version", Value.version}, }; } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - VersionedTextDocumentIdentifier &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("uri", result.uri) && o.map("version", result.version); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + VersionedTextDocumentIdentifier &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("uri", Result.uri) && O.map("version", Result.version); } //===----------------------------------------------------------------------===// // Position //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, Position &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("line", result.line) && - o.map("character", result.character); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, Position &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("line", Result.line) && + O.map("character", Result.character); } -llvm::json::Value llvm::lsp::toJSON(const Position &value) { +llvm::json::Value llvm::lsp::toJSON(const Position &Value) { return llvm::json::Object{ - {"line", value.line}, - {"character", value.character}, + {"line", Value.line}, + {"character", Value.character}, }; } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Position &value) { - return os << value.line << ':' << value.character; +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, const Position &Value) { + return Os << Value.line << ':' << Value.character; } //===----------------------------------------------------------------------===// // Range //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, Range &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("start", result.start) && o.map("end", result.end); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, Range &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("start", Result.start) && O.map("end", Result.end); } -llvm::json::Value llvm::lsp::toJSON(const Range &value) { +llvm::json::Value llvm::lsp::toJSON(const Range &Value) { return llvm::json::Object{ - {"start", value.start}, - {"end", value.end}, + {"start", Value.start}, + {"end", Value.end}, }; } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Range &value) { - return os << value.start << '-' << value.end; +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, const Range &Value) { + return Os << Value.start << '-' << Value.end; } //===----------------------------------------------------------------------===// // Location //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, Location &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("uri", result.uri) && o.map("range", result.range); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, Location &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("uri", Result.uri) && O.map("range", Result.range); } -llvm::json::Value llvm::lsp::toJSON(const Location &value) { +llvm::json::Value llvm::lsp::toJSON(const Location &Value) { return llvm::json::Object{ - {"uri", value.uri}, - {"range", value.range}, + {"uri", Value.uri}, + {"range", Value.range}, }; } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const Location &value) { - return os << value.range << '@' << value.uri; +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, const Location &Value) { + return Os << Value.range << '@' << Value.uri; } //===----------------------------------------------------------------------===// // TextDocumentPositionParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - TextDocumentPositionParams &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument) && - o.map("position", result.position); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + TextDocumentPositionParams &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument) && + O.map("position", Result.position); } //===----------------------------------------------------------------------===// // ReferenceParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - ReferenceContext &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.mapOptional("includeDeclaration", result.includeDeclaration); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + ReferenceContext &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.mapOptional("includeDeclaration", Result.includeDeclaration); } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - ReferenceParams &result, llvm::json::Path path) { - TextDocumentPositionParams &base = result; - llvm::json::ObjectMapper o(value, path); - return fromJSON(value, base, path) && o && - o.mapOptional("context", result.context); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + ReferenceParams &Result, llvm::json::Path Path) { + TextDocumentPositionParams &Base = Result; + llvm::json::ObjectMapper O(Value, Path); + return fromJSON(Value, Base, Path) && O && + O.mapOptional("context", Result.context); } //===----------------------------------------------------------------------===// // DidOpenTextDocumentParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DidOpenTextDocumentParams &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DidOpenTextDocumentParams &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument); } //===----------------------------------------------------------------------===// // DidCloseTextDocumentParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DidCloseTextDocumentParams &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DidCloseTextDocumentParams &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument); } //===----------------------------------------------------------------------===// @@ -511,57 +511,57 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, //===----------------------------------------------------------------------===// LogicalResult -TextDocumentContentChangeEvent::applyTo(std::string &contents) const { +TextDocumentContentChangeEvent::applyTo(std::string &Contents) const { // If there is no range, the full document changed. if (!range) { - contents = text; + Contents = text; return success(); } // Try to map the replacement range to the content. - llvm::SourceMgr tmpScrMgr; - tmpScrMgr.AddNewSourceBuffer(llvm::MemoryBuffer::getMemBuffer(contents), + llvm::SourceMgr TmpScrMgr; + TmpScrMgr.AddNewSourceBuffer(llvm::MemoryBuffer::getMemBuffer(Contents), SMLoc()); - SMRange rangeLoc = range->getAsSMRange(tmpScrMgr); - if (!rangeLoc.isValid()) + SMRange RangeLoc = range->getAsSMRange(TmpScrMgr); + if (!RangeLoc.isValid()) return failure(); - contents.replace(rangeLoc.Start.getPointer() - contents.data(), - rangeLoc.End.getPointer() - rangeLoc.Start.getPointer(), + Contents.replace(RangeLoc.Start.getPointer() - Contents.data(), + RangeLoc.End.getPointer() - RangeLoc.Start.getPointer(), text); return success(); } LogicalResult TextDocumentContentChangeEvent::applyTo( - ArrayRef changes, std::string &contents) { - for (const auto &change : changes) - if (failed(change.applyTo(contents))) + ArrayRef Changes, std::string &Contents) { + for (const auto &Change : Changes) + if (failed(Change.applyTo(Contents))) return failure(); return success(); } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - TextDocumentContentChangeEvent &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("range", result.range) && - o.map("rangeLength", result.rangeLength) && o.map("text", result.text); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + TextDocumentContentChangeEvent &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("range", Result.range) && + O.map("rangeLength", Result.rangeLength) && O.map("text", Result.text); } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DidChangeTextDocumentParams &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument) && - o.map("contentChanges", result.contentChanges); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DidChangeTextDocumentParams &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument) && + O.map("contentChanges", Result.contentChanges); } //===----------------------------------------------------------------------===// // MarkupContent //===----------------------------------------------------------------------===// -static llvm::StringRef toTextKind(MarkupKind kind) { - switch (kind) { +static llvm::StringRef toTextKind(MarkupKind Kind) { + switch (Kind) { case MarkupKind::PlainText: return "plaintext"; case MarkupKind::Markdown: @@ -570,17 +570,17 @@ static llvm::StringRef toTextKind(MarkupKind kind) { llvm_unreachable("Invalid MarkupKind"); } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, MarkupKind kind) { - return os << toTextKind(kind); +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, MarkupKind Kind) { + return Os << toTextKind(Kind); } -llvm::json::Value llvm::lsp::toJSON(const MarkupContent &mc) { - if (mc.value.empty()) +llvm::json::Value llvm::lsp::toJSON(const MarkupContent &Mc) { + if (Mc.value.empty()) return nullptr; return llvm::json::Object{ - {"kind", toTextKind(mc.kind)}, - {"value", mc.value}, + {"kind", toTextKind(Mc.kind)}, + {"value", Mc.value}, }; } @@ -588,56 +588,56 @@ llvm::json::Value llvm::lsp::toJSON(const MarkupContent &mc) { // Hover //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const Hover &hover) { - llvm::json::Object result{{"contents", toJSON(hover.contents)}}; - if (hover.range) - result["range"] = toJSON(*hover.range); - return std::move(result); +llvm::json::Value llvm::lsp::toJSON(const Hover &Hover) { + llvm::json::Object Result{{"contents", toJSON(Hover.contents)}}; + if (Hover.range) + Result["range"] = toJSON(*Hover.range); + return std::move(Result); } //===----------------------------------------------------------------------===// // DocumentSymbol //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const DocumentSymbol &symbol) { - llvm::json::Object result{{"name", symbol.name}, - {"kind", static_cast(symbol.kind)}, - {"range", symbol.range}, - {"selectionRange", symbol.selectionRange}}; +llvm::json::Value llvm::lsp::toJSON(const DocumentSymbol &Symbol) { + llvm::json::Object Result{{"name", Symbol.name}, + {"kind", static_cast(Symbol.kind)}, + {"range", Symbol.range}, + {"selectionRange", Symbol.selectionRange}}; - if (!symbol.detail.empty()) - result["detail"] = symbol.detail; - if (!symbol.children.empty()) - result["children"] = symbol.children; - return std::move(result); + if (!Symbol.detail.empty()) + Result["detail"] = Symbol.detail; + if (!Symbol.children.empty()) + Result["children"] = Symbol.children; + return std::move(Result); } //===----------------------------------------------------------------------===// // DocumentSymbolParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DocumentSymbolParams &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DocumentSymbolParams &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument); } //===----------------------------------------------------------------------===// // DiagnosticRelatedInformation //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DiagnosticRelatedInformation &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("location", result.location) && - o.map("message", result.message); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DiagnosticRelatedInformation &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("location", Result.location) && + O.map("message", Result.message); } -llvm::json::Value llvm::lsp::toJSON(const DiagnosticRelatedInformation &info) { +llvm::json::Value llvm::lsp::toJSON(const DiagnosticRelatedInformation &Info) { return llvm::json::Object{ - {"location", info.location}, - {"message", info.message}, + {"location", Info.location}, + {"message", Info.message}, }; } @@ -645,64 +645,64 @@ llvm::json::Value llvm::lsp::toJSON(const DiagnosticRelatedInformation &info) { // Diagnostic //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(DiagnosticTag tag) { - return static_cast(tag); +llvm::json::Value llvm::lsp::toJSON(DiagnosticTag Tag) { + return static_cast(Tag); } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, DiagnosticTag &result, - llvm::json::Path path) { - if (std::optional i = value.getAsInteger()) { - result = (DiagnosticTag)*i; +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, DiagnosticTag &Result, + llvm::json::Path Path) { + if (std::optional I = Value.getAsInteger()) { + Result = (DiagnosticTag)*I; return true; } return false; } -llvm::json::Value llvm::lsp::toJSON(const Diagnostic &diag) { - llvm::json::Object result{ - {"range", diag.range}, - {"severity", (int)diag.severity}, - {"message", diag.message}, +llvm::json::Value llvm::lsp::toJSON(const Diagnostic &Diag) { + llvm::json::Object Result{ + {"range", Diag.range}, + {"severity", (int)Diag.severity}, + {"message", Diag.message}, }; - if (diag.category) - result["category"] = *diag.category; - if (!diag.source.empty()) - result["source"] = diag.source; - if (diag.relatedInformation) - result["relatedInformation"] = *diag.relatedInformation; - if (!diag.tags.empty()) - result["tags"] = diag.tags; - return std::move(result); -} - -bool llvm::lsp::fromJSON(const llvm::json::Value &value, Diagnostic &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - if (!o) + if (Diag.category) + Result["category"] = *Diag.category; + if (!Diag.source.empty()) + Result["source"] = Diag.source; + if (Diag.relatedInformation) + Result["relatedInformation"] = *Diag.relatedInformation; + if (!Diag.tags.empty()) + Result["tags"] = Diag.tags; + return std::move(Result); +} + +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, Diagnostic &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + if (!O) return false; - int severity = 0; - if (!mapOptOrNull(value, "severity", severity, path)) + int Severity = 0; + if (!mapOptOrNull(Value, "severity", Severity, Path)) return false; - result.severity = (DiagnosticSeverity)severity; + Result.severity = (DiagnosticSeverity)Severity; - return o.map("range", result.range) && o.map("message", result.message) && - mapOptOrNull(value, "category", result.category, path) && - mapOptOrNull(value, "source", result.source, path) && - mapOptOrNull(value, "relatedInformation", result.relatedInformation, - path) && - mapOptOrNull(value, "tags", result.tags, path); + return O.map("range", Result.range) && O.map("message", Result.message) && + mapOptOrNull(Value, "category", Result.category, Path) && + mapOptOrNull(Value, "source", Result.source, Path) && + mapOptOrNull(Value, "relatedInformation", Result.relatedInformation, + Path) && + mapOptOrNull(Value, "tags", Result.tags, Path); } //===----------------------------------------------------------------------===// // PublishDiagnosticsParams //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const PublishDiagnosticsParams ¶ms) { +llvm::json::Value llvm::lsp::toJSON(const PublishDiagnosticsParams &Params) { return llvm::json::Object{ - {"uri", params.uri}, - {"diagnostics", params.diagnostics}, - {"version", params.version}, + {"uri", Params.uri}, + {"diagnostics", Params.diagnostics}, + {"version", Params.version}, }; } @@ -710,52 +710,52 @@ llvm::json::Value llvm::lsp::toJSON(const PublishDiagnosticsParams ¶ms) { // TextEdit //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, TextEdit &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("range", result.range) && o.map("newText", result.newText); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, TextEdit &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("range", Result.range) && O.map("newText", Result.newText); } -llvm::json::Value llvm::lsp::toJSON(const TextEdit &value) { +llvm::json::Value llvm::lsp::toJSON(const TextEdit &Value) { return llvm::json::Object{ - {"range", value.range}, - {"newText", value.newText}, + {"range", Value.range}, + {"newText", Value.newText}, }; } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, const TextEdit &value) { - os << value.range << " => \""; - llvm::printEscapedString(value.newText, os); - return os << '"'; +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, const TextEdit &Value) { + Os << Value.range << " => \""; + llvm::printEscapedString(Value.newText, Os); + return Os << '"'; } //===----------------------------------------------------------------------===// // CompletionItemKind //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CompletionItemKind &result, llvm::json::Path path) { - if (std::optional intValue = value.getAsInteger()) { - if (*intValue < static_cast(CompletionItemKind::Text) || - *intValue > static_cast(CompletionItemKind::TypeParameter)) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CompletionItemKind &Result, llvm::json::Path Path) { + if (std::optional IntValue = Value.getAsInteger()) { + if (*IntValue < static_cast(CompletionItemKind::Text) || + *IntValue > static_cast(CompletionItemKind::TypeParameter)) return false; - result = static_cast(*intValue); + Result = static_cast(*IntValue); return true; } return false; } CompletionItemKind llvm::lsp::adjustKindToCapability( - CompletionItemKind kind, - CompletionItemKindBitset &supportedCompletionItemKinds) { - size_t kindVal = static_cast(kind); - if (kindVal >= kCompletionItemKindMin && - kindVal <= supportedCompletionItemKinds.size() && - supportedCompletionItemKinds[kindVal]) - return kind; + CompletionItemKind Kind, + CompletionItemKindBitset &SupportedCompletionItemKinds) { + size_t KindVal = static_cast(Kind); + if (KindVal >= kCompletionItemKindMin && + KindVal <= SupportedCompletionItemKinds.size() && + SupportedCompletionItemKinds[KindVal]) + return Kind; // Provide some fall backs for common kinds that are close enough. - switch (kind) { + switch (Kind) { case CompletionItemKind::Folder: return CompletionItemKind::File; case CompletionItemKind::EnumMember: @@ -767,14 +767,14 @@ CompletionItemKind llvm::lsp::adjustKindToCapability( } } -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CompletionItemKindBitset &result, - llvm::json::Path path) { - if (const llvm::json::Array *arrayValue = value.getAsArray()) { - for (size_t i = 0, e = arrayValue->size(); i < e; ++i) { - CompletionItemKind kindOut; - if (fromJSON((*arrayValue)[i], kindOut, path.index(i))) - result.set(size_t(kindOut)); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CompletionItemKindBitset &Result, + llvm::json::Path Path) { + if (const llvm::json::Array *ArrayValue = Value.getAsArray()) { + for (size_t I = 0, E = ArrayValue->size(); I < E; ++I) { + CompletionItemKind KindOut; + if (fromJSON((*ArrayValue)[I], KindOut, Path.index(I))) + Result.set(size_t(KindOut)); } return true; } @@ -785,53 +785,53 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // CompletionItem //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const CompletionItem &value) { - assert(!value.label.empty() && "completion item label is required"); - llvm::json::Object result{{"label", value.label}}; - if (value.kind != CompletionItemKind::Missing) - result["kind"] = static_cast(value.kind); - if (!value.detail.empty()) - result["detail"] = value.detail; - if (value.documentation) - result["documentation"] = value.documentation; - if (!value.sortText.empty()) - result["sortText"] = value.sortText; - if (!value.filterText.empty()) - result["filterText"] = value.filterText; - if (!value.insertText.empty()) - result["insertText"] = value.insertText; - if (value.insertTextFormat != InsertTextFormat::Missing) - result["insertTextFormat"] = static_cast(value.insertTextFormat); - if (value.textEdit) - result["textEdit"] = *value.textEdit; - if (!value.additionalTextEdits.empty()) { - result["additionalTextEdits"] = - llvm::json::Array(value.additionalTextEdits); +llvm::json::Value llvm::lsp::toJSON(const CompletionItem &Value) { + assert(!Value.label.empty() && "completion item label is required"); + llvm::json::Object Result{{"label", Value.label}}; + if (Value.kind != CompletionItemKind::Missing) + Result["kind"] = static_cast(Value.kind); + if (!Value.detail.empty()) + Result["detail"] = Value.detail; + if (Value.documentation) + Result["documentation"] = Value.documentation; + if (!Value.sortText.empty()) + Result["sortText"] = Value.sortText; + if (!Value.filterText.empty()) + Result["filterText"] = Value.filterText; + if (!Value.insertText.empty()) + Result["insertText"] = Value.insertText; + if (Value.insertTextFormat != InsertTextFormat::Missing) + Result["insertTextFormat"] = static_cast(Value.insertTextFormat); + if (Value.textEdit) + Result["textEdit"] = *Value.textEdit; + if (!Value.additionalTextEdits.empty()) { + Result["additionalTextEdits"] = + llvm::json::Array(Value.additionalTextEdits); } - if (value.deprecated) - result["deprecated"] = value.deprecated; - return std::move(result); + if (Value.deprecated) + Result["deprecated"] = Value.deprecated; + return std::move(Result); } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, - const CompletionItem &value) { - return os << value.label << " - " << toJSON(value); +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, + const CompletionItem &Value) { + return Os << Value.label << " - " << toJSON(Value); } -bool llvm::lsp::operator<(const CompletionItem &lhs, - const CompletionItem &rhs) { - return (lhs.sortText.empty() ? lhs.label : lhs.sortText) < - (rhs.sortText.empty() ? rhs.label : rhs.sortText); +bool llvm::lsp::operator<(const CompletionItem &Lhs, + const CompletionItem &Rhs) { + return (Lhs.sortText.empty() ? Lhs.label : Lhs.sortText) < + (Rhs.sortText.empty() ? Rhs.label : Rhs.sortText); } //===----------------------------------------------------------------------===// // CompletionList //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const CompletionList &value) { +llvm::json::Value llvm::lsp::toJSON(const CompletionList &Value) { return llvm::json::Object{ - {"isIncomplete", value.isIncomplete}, - {"items", llvm::json::Array(value.items)}, + {"isIncomplete", Value.isIncomplete}, + {"items", llvm::json::Array(Value.items)}, }; } @@ -839,14 +839,14 @@ llvm::json::Value llvm::lsp::toJSON(const CompletionList &value) { // CompletionContext //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CompletionContext &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - int triggerKind; - if (!o || !o.map("triggerKind", triggerKind) || - !mapOptOrNull(value, "triggerCharacter", result.triggerCharacter, path)) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CompletionContext &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + int TriggerKind; + if (!O || !O.map("triggerKind", TriggerKind) || + !mapOptOrNull(Value, "triggerCharacter", Result.triggerCharacter, Path)) return false; - result.triggerKind = static_cast(triggerKind); + Result.triggerKind = static_cast(TriggerKind); return true; } @@ -854,12 +854,12 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // CompletionParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CompletionParams &result, llvm::json::Path path) { - if (!fromJSON(value, static_cast(result), path)) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CompletionParams &Result, llvm::json::Path Path) { + if (!fromJSON(Value, static_cast(Result), Path)) return false; - if (const llvm::json::Value *context = value.getAsObject()->get("context")) - return fromJSON(*context, result.context, path.field("context")); + if (const llvm::json::Value *Context = Value.getAsObject()->get("context")) + return fromJSON(*Context, Result.context, Path.field("context")); return true; } @@ -867,53 +867,53 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // ParameterInformation //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const ParameterInformation &value) { - assert((value.labelOffsets || !value.labelString.empty()) && +llvm::json::Value llvm::lsp::toJSON(const ParameterInformation &Value) { + assert((Value.labelOffsets || !Value.labelString.empty()) && "parameter information label is required"); - llvm::json::Object result; - if (value.labelOffsets) - result["label"] = llvm::json::Array( - {value.labelOffsets->first, value.labelOffsets->second}); + llvm::json::Object Result; + if (Value.labelOffsets) + Result["label"] = llvm::json::Array( + {Value.labelOffsets->first, Value.labelOffsets->second}); else - result["label"] = value.labelString; - if (!value.documentation.empty()) - result["documentation"] = value.documentation; - return std::move(result); + Result["label"] = Value.labelString; + if (!Value.documentation.empty()) + Result["documentation"] = Value.documentation; + return std::move(Result); } //===----------------------------------------------------------------------===// // SignatureInformation //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const SignatureInformation &value) { - assert(!value.label.empty() && "signature information label is required"); - llvm::json::Object result{ - {"label", value.label}, - {"parameters", llvm::json::Array(value.parameters)}, +llvm::json::Value llvm::lsp::toJSON(const SignatureInformation &Value) { + assert(!Value.label.empty() && "signature information label is required"); + llvm::json::Object Result{ + {"label", Value.label}, + {"parameters", llvm::json::Array(Value.parameters)}, }; - if (!value.documentation.empty()) - result["documentation"] = value.documentation; - return std::move(result); + if (!Value.documentation.empty()) + Result["documentation"] = Value.documentation; + return std::move(Result); } -raw_ostream &llvm::lsp::operator<<(raw_ostream &os, - const SignatureInformation &value) { - return os << value.label << " - " << toJSON(value); +raw_ostream &llvm::lsp::operator<<(raw_ostream &Os, + const SignatureInformation &Value) { + return Os << Value.label << " - " << toJSON(Value); } //===----------------------------------------------------------------------===// // SignatureHelp //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const SignatureHelp &value) { - assert(value.activeSignature >= 0 && +llvm::json::Value llvm::lsp::toJSON(const SignatureHelp &Value) { + assert(Value.activeSignature >= 0 && "Unexpected negative value for number of active signatures."); - assert(value.activeParameter >= 0 && + assert(Value.activeParameter >= 0 && "Unexpected negative value for active parameter index"); return llvm::json::Object{ - {"activeSignature", value.activeSignature}, - {"activeParameter", value.activeParameter}, - {"signatures", llvm::json::Array(value.signatures)}, + {"activeSignature", Value.activeSignature}, + {"activeParameter", Value.activeParameter}, + {"signatures", llvm::json::Array(Value.signatures)}, }; } @@ -921,20 +921,20 @@ llvm::json::Value llvm::lsp::toJSON(const SignatureHelp &value) { // DocumentLinkParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - DocumentLinkParams &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + DocumentLinkParams &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument); } //===----------------------------------------------------------------------===// // DocumentLink //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const DocumentLink &value) { +llvm::json::Value llvm::lsp::toJSON(const DocumentLink &Value) { return llvm::json::Object{ - {"range", value.range}, - {"target", value.target}, + {"range", Value.range}, + {"target", Value.target}, }; } @@ -942,40 +942,40 @@ llvm::json::Value llvm::lsp::toJSON(const DocumentLink &value) { // InlayHintsParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - InlayHintsParams &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument) && - o.map("range", result.range); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + InlayHintsParams &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument) && + O.map("range", Result.range); } //===----------------------------------------------------------------------===// // InlayHint //===----------------------------------------------------------------------===// -llvm::json::Value llvm::lsp::toJSON(const InlayHint &value) { - return llvm::json::Object{{"position", value.position}, - {"kind", (int)value.kind}, - {"label", value.label}, - {"paddingLeft", value.paddingLeft}, - {"paddingRight", value.paddingRight}}; +llvm::json::Value llvm::lsp::toJSON(const InlayHint &Value) { + return llvm::json::Object{{"position", Value.position}, + {"kind", (int)Value.kind}, + {"label", Value.label}, + {"paddingLeft", Value.paddingLeft}, + {"paddingRight", Value.paddingRight}}; } -bool llvm::lsp::operator==(const InlayHint &lhs, const InlayHint &rhs) { - return std::tie(lhs.position, lhs.kind, lhs.label) == - std::tie(rhs.position, rhs.kind, rhs.label); +bool llvm::lsp::operator==(const InlayHint &Lhs, const InlayHint &Rhs) { + return std::tie(Lhs.position, Lhs.kind, Lhs.label) == + std::tie(Rhs.position, Rhs.kind, Rhs.label); } -bool llvm::lsp::operator<(const InlayHint &lhs, const InlayHint &rhs) { - return std::tie(lhs.position, lhs.kind, lhs.label) < - std::tie(rhs.position, rhs.kind, rhs.label); +bool llvm::lsp::operator<(const InlayHint &Lhs, const InlayHint &Rhs) { + return std::tie(Lhs.position, Lhs.kind, Lhs.label) < + std::tie(Rhs.position, Rhs.kind, Rhs.label); } -llvm::raw_ostream &llvm::lsp::operator<<(llvm::raw_ostream &os, - InlayHintKind value) { - switch (value) { +llvm::raw_ostream &llvm::lsp::operator<<(llvm::raw_ostream &Os, + InlayHintKind Value) { + switch (Value) { case InlayHintKind::Parameter: - return os << "parameter"; + return Os << "parameter"; case InlayHintKind::Type: - return os << "type"; + return Os << "type"; } llvm_unreachable("Unknown InlayHintKind"); } @@ -984,12 +984,12 @@ llvm::raw_ostream &llvm::lsp::operator<<(llvm::raw_ostream &os, // CodeActionContext //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CodeActionContext &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - if (!o || !o.map("diagnostics", result.diagnostics)) +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CodeActionContext &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + if (!O || !O.map("diagnostics", Result.diagnostics)) return false; - o.map("only", result.only); + O.map("only", Result.only); return true; } @@ -997,28 +997,28 @@ bool llvm::lsp::fromJSON(const llvm::json::Value &value, // CodeActionParams //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, - CodeActionParams &result, llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("textDocument", result.textDocument) && - o.map("range", result.range) && o.map("context", result.context); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, + CodeActionParams &Result, llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("textDocument", Result.textDocument) && + O.map("range", Result.range) && O.map("context", Result.context); } //===----------------------------------------------------------------------===// // WorkspaceEdit //===----------------------------------------------------------------------===// -bool llvm::lsp::fromJSON(const llvm::json::Value &value, WorkspaceEdit &result, - llvm::json::Path path) { - llvm::json::ObjectMapper o(value, path); - return o && o.map("changes", result.changes); +bool llvm::lsp::fromJSON(const llvm::json::Value &Value, WorkspaceEdit &Result, + llvm::json::Path Path) { + llvm::json::ObjectMapper O(Value, Path); + return O && O.map("changes", Result.changes); } -llvm::json::Value llvm::lsp::toJSON(const WorkspaceEdit &value) { - llvm::json::Object fileChanges; - for (auto &change : value.changes) - fileChanges[change.first] = llvm::json::Array(change.second); - return llvm::json::Object{{"changes", std::move(fileChanges)}}; +llvm::json::Value llvm::lsp::toJSON(const WorkspaceEdit &Value) { + llvm::json::Object FileChanges; + for (auto &Change : Value.changes) + FileChanges[Change.first] = llvm::json::Array(Change.second); + return llvm::json::Object{{"changes", std::move(FileChanges)}}; } //===----------------------------------------------------------------------===// @@ -1029,15 +1029,15 @@ const llvm::StringLiteral CodeAction::kQuickFix = "quickfix"; const llvm::StringLiteral CodeAction::kRefactor = "refactor"; const llvm::StringLiteral CodeAction::kInfo = "info"; -llvm::json::Value llvm::lsp::toJSON(const CodeAction &value) { - llvm::json::Object codeAction{{"title", value.title}}; - if (value.kind) - codeAction["kind"] = *value.kind; - if (value.diagnostics) - codeAction["diagnostics"] = llvm::json::Array(*value.diagnostics); - if (value.isPreferred) - codeAction["isPreferred"] = true; - if (value.edit) - codeAction["edit"] = *value.edit; - return std::move(codeAction); +llvm::json::Value llvm::lsp::toJSON(const CodeAction &Value) { + llvm::json::Object CodeAction{{"title", Value.title}}; + if (Value.kind) + CodeAction["kind"] = *Value.kind; + if (Value.diagnostics) + CodeAction["diagnostics"] = llvm::json::Array(*Value.diagnostics); + if (Value.isPreferred) + CodeAction["isPreferred"] = true; + if (Value.edit) + CodeAction["edit"] = *Value.edit; + return std::move(CodeAction); } diff --git a/llvm/lib/Support/LSP/Transport.cpp b/llvm/lib/Support/LSP/Transport.cpp index 3f13a9ee0bf8c..e71f17701636b 100644 --- a/llvm/lib/Support/LSP/Transport.cpp +++ b/llvm/lib/Support/LSP/Transport.cpp @@ -7,14 +7,14 @@ //===----------------------------------------------------------------------===// #include "llvm/Support/LSP/Transport.h" -#include "llvm/Support/LSP/Logging.h" -#include "llvm/Support/LSP/Protocol.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/Error.h" +#include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" +#include #include #include #include -#include using namespace llvm; using namespace llvm::lsp; @@ -30,52 +30,52 @@ namespace { /// - if there were multiple replies, only the first is sent class Reply { public: - Reply(const llvm::json::Value &id, StringRef method, JSONTransport &transport, - std::mutex &transportOutputMutex); - Reply(Reply &&other); + Reply(const llvm::json::Value &Id, StringRef Method, JSONTransport &Transport, + std::mutex &TransportOutputMutex); + Reply(Reply &&Other); Reply &operator=(Reply &&) = delete; Reply(const Reply &) = delete; Reply &operator=(const Reply &) = delete; - void operator()(llvm::Expected reply); + void operator()(llvm::Expected Reply); private: - std::string method; - std::atomic replied = {false}; - llvm::json::Value id; - JSONTransport *transport; - std::mutex &transportOutputMutex; + std::string Method; + std::atomic Replied = {false}; + llvm::json::Value Id; + JSONTransport *Transport; + std::mutex &TransportOutputMutex; }; } // namespace -Reply::Reply(const llvm::json::Value &id, llvm::StringRef method, - JSONTransport &transport, std::mutex &transportOutputMutex) - : method(method), id(id), transport(&transport), - transportOutputMutex(transportOutputMutex) {} +Reply::Reply(const llvm::json::Value &Id, llvm::StringRef Method, + JSONTransport &Transport, std::mutex &TransportOutputMutex) + : Method(Method), Id(Id), Transport(&Transport), + TransportOutputMutex(TransportOutputMutex) {} -Reply::Reply(Reply &&other) - : method(other.method), replied(other.replied.load()), - id(std::move(other.id)), transport(other.transport), - transportOutputMutex(other.transportOutputMutex) { - other.transport = nullptr; +Reply::Reply(Reply &&Other) + : Method(Other.Method), Replied(Other.Replied.load()), + Id(std::move(Other.Id)), Transport(Other.Transport), + TransportOutputMutex(Other.TransportOutputMutex) { + Other.Transport = nullptr; } -void Reply::operator()(llvm::Expected reply) { - if (replied.exchange(true)) { - Logger::error("Replied twice to message {0}({1})", method, id); +void Reply::operator()(llvm::Expected Reply) { + if (Replied.exchange(true)) { + Logger::error("Replied twice to message {0}({1})", Method, Id); assert(false && "must reply to each call only once!"); return; } - assert(transport && "expected valid transport to reply to"); + assert(Transport && "expected valid transport to reply to"); - std::lock_guard transportLock(transportOutputMutex); - if (reply) { - Logger::info("--> reply:{0}({1})", method, id); - transport->reply(std::move(id), std::move(reply)); + std::lock_guard TransportLock(TransportOutputMutex); + if (Reply) { + Logger::info("--> reply:{0}({1})", Method, Id); + Transport->reply(std::move(Id), std::move(Reply)); } else { - llvm::Error error = reply.takeError(); - Logger::info("--> reply:{0}({1}): {2}", method, id, error); - transport->reply(std::move(id), std::move(error)); + llvm::Error Error = Reply.takeError(); + Logger::info("--> reply:{0}({1}): {2}", Method, Id, Error); + Transport->reply(std::move(Id), std::move(Error)); } } @@ -83,61 +83,61 @@ void Reply::operator()(llvm::Expected reply) { // MessageHandler //===----------------------------------------------------------------------===// -bool MessageHandler::onNotify(llvm::StringRef method, llvm::json::Value value) { - Logger::info("--> {0}", method); +bool MessageHandler::onNotify(llvm::StringRef Method, llvm::json::Value Value) { + Logger::info("--> {0}", Method); - if (method == "exit") + if (Method == "exit") return false; - if (method == "$cancel") { + if (Method == "$cancel") { // TODO: Add support for cancelling requests. } else { - auto it = notificationHandlers.find(method); - if (it != notificationHandlers.end()) - it->second(std::move(value)); + auto It = NotificationHandlers.find(Method); + if (It != NotificationHandlers.end()) + It->second(std::move(Value)); } return true; } -bool MessageHandler::onCall(llvm::StringRef method, llvm::json::Value params, - llvm::json::Value id) { - Logger::info("--> {0}({1})", method, id); +bool MessageHandler::onCall(llvm::StringRef Method, llvm::json::Value Params, + llvm::json::Value Id) { + Logger::info("--> {0}({1})", Method, Id); - Reply reply(id, method, transport, transportOutputMutex); + Reply Reply(Id, Method, Transport, TransportOutputMutex); - auto it = methodHandlers.find(method); - if (it != methodHandlers.end()) { - it->second(std::move(params), std::move(reply)); + auto It = MethodHandlers.find(Method); + if (It != MethodHandlers.end()) { + It->second(std::move(Params), std::move(Reply)); } else { - reply(llvm::make_error("method not found: " + method.str(), + Reply(llvm::make_error("method not found: " + Method.str(), ErrorCode::MethodNotFound)); } return true; } -bool MessageHandler::onReply(llvm::json::Value id, - llvm::Expected result) { +bool MessageHandler::onReply(llvm::json::Value Id, + llvm::Expected Result) { // Find the response handler in the mapping. If it exists, move it out of the // mapping and erase it. - ResponseHandlerTy responseHandler; + ResponseHandlerTy ResponseHandler; { - std::lock_guard responseHandlersLock(responseHandlersMutex); - auto it = responseHandlers.find(debugString(id)); - if (it != responseHandlers.end()) { - responseHandler = std::move(it->second); - responseHandlers.erase(it); + std::lock_guard responseHandlersLock(ResponseHandlerTy); + auto It = ResponseHandlers.find(debugString(Id)); + if (It != ResponseHandlers.end()) { + ResponseHandler = std::move(It->second); + ResponseHandlers.erase(It); } } // If we found a response handler, invoke it. Otherwise, log an error. - if (responseHandler.second) { - Logger::info("--> reply:{0}({1})", responseHandler.first, id); - responseHandler.second(std::move(id), std::move(result)); + if (ResponseHandler.second) { + Logger::info("--> reply:{0}({1})", ResponseHandler.first, Id); + ResponseHandler.second(std::move(Id), std::move(Result)); } else { Logger::error( "received a reply with ID {0}, but there was no such outgoing request", - id); - if (!result) - llvm::consumeError(result.takeError()); + Id); + if (!Result) + llvm::consumeError(Result.takeError()); } return true; } @@ -147,155 +147,155 @@ bool MessageHandler::onReply(llvm::json::Value id, //===----------------------------------------------------------------------===// /// Encode the given error as a JSON object. -static llvm::json::Object encodeError(llvm::Error error) { - std::string message; - ErrorCode code = ErrorCode::UnknownErrorCode; - auto handlerFn = [&](const LSPError &lspError) -> llvm::Error { - message = lspError.message; - code = lspError.code; +static llvm::json::Object encodeError(llvm::Error Error) { + std::string Message; + ErrorCode Code = ErrorCode::UnknownErrorCode; + auto HandlerFn = [&](const LSPError &LspError) -> llvm::Error { + Message = LspError.message; + Code = LspError.code; return llvm::Error::success(); }; - if (llvm::Error unhandled = llvm::handleErrors(std::move(error), handlerFn)) - message = llvm::toString(std::move(unhandled)); + if (llvm::Error Unhandled = llvm::handleErrors(std::move(Error), HandlerFn)) + Message = llvm::toString(std::move(Unhandled)); return llvm::json::Object{ - {"message", std::move(message)}, - {"code", int64_t(code)}, + {"message", std::move(Message)}, + {"code", int64_t(Code)}, }; } /// Decode the given JSON object into an error. -llvm::Error decodeError(const llvm::json::Object &o) { - StringRef msg = o.getString("message").value_or("Unspecified error"); - if (std::optional code = o.getInteger("code")) - return llvm::make_error(msg.str(), ErrorCode(*code)); +llvm::Error decodeError(const llvm::json::Object &O) { + StringRef Msg = O.getString("message").value_or("Unspecified error"); + if (std::optional Code = O.getInteger("code")) + return llvm::make_error(Msg.str(), ErrorCode(*Code)); return llvm::make_error(llvm::inconvertibleErrorCode(), - msg.str()); + Msg.str()); } -void JSONTransport::notify(StringRef method, llvm::json::Value params) { +void JSONTransport::notify(StringRef Method, llvm::json::Value Params) { sendMessage(llvm::json::Object{ {"jsonrpc", "2.0"}, - {"method", method}, - {"params", std::move(params)}, + {"method", Method}, + {"params", std::move(Params)}, }); } -void JSONTransport::call(StringRef method, llvm::json::Value params, - llvm::json::Value id) { +void JSONTransport::call(StringRef Method, llvm::json::Value Params, + llvm::json::Value Id) { sendMessage(llvm::json::Object{ {"jsonrpc", "2.0"}, - {"id", std::move(id)}, - {"method", method}, - {"params", std::move(params)}, + {"id", std::move(Id)}, + {"method", Method}, + {"params", std::move(Params)}, }); } -void JSONTransport::reply(llvm::json::Value id, - llvm::Expected result) { - if (result) { +void JSONTransport::reply(llvm::json::Value Id, + llvm::Expected Result) { + if (Result) { return sendMessage(llvm::json::Object{ {"jsonrpc", "2.0"}, - {"id", std::move(id)}, - {"result", std::move(*result)}, + {"id", std::move(Id)}, + {"result", std::move(*Result)}, }); } sendMessage(llvm::json::Object{ {"jsonrpc", "2.0"}, - {"id", std::move(id)}, - {"error", encodeError(result.takeError())}, + {"id", std::move(Id)}, + {"error", encodeError(Result.takeError())}, }); } -llvm::Error JSONTransport::run(MessageHandler &handler) { - std::string json; - while (!in->isEndOfInput()) { - if (in->hasError()) { +llvm::Error JSONTransport::run(MessageHandler &Handler) { + std::string Json; + while (!In->isEndOfInput()) { + if (In->hasError()) { return llvm::errorCodeToError( std::error_code(errno, std::system_category())); } - if (succeeded(in->readMessage(json))) { - if (llvm::Expected doc = llvm::json::parse(json)) { - if (!handleMessage(std::move(*doc), handler)) + if (succeeded(In->readMessage(Json))) { + if (llvm::Expected Doc = llvm::json::parse(Json)) { + if (!handleMessage(std::move(*Doc), Handler)) return llvm::Error::success(); } else { - Logger::error("JSON parse error: {0}", llvm::toString(doc.takeError())); + Logger::error("JSON parse error: {0}", llvm::toString(Doc.takeError())); } } } return llvm::errorCodeToError(std::make_error_code(std::errc::io_error)); } -void JSONTransport::sendMessage(llvm::json::Value msg) { - outputBuffer.clear(); - llvm::raw_svector_ostream os(outputBuffer); - os << llvm::formatv(prettyOutput ? "{0:2}\n" : "{0}", msg); - out << "Content-Length: " << outputBuffer.size() << "\r\n\r\n" - << outputBuffer; - out.flush(); - Logger::debug(">>> {0}\n", outputBuffer); +void JSONTransport::sendMessage(llvm::json::Value Msg) { + OutputBuffer.clear(); + llvm::raw_svector_ostream os(OutputBuffer); + os << llvm::formatv(PrettyOutput ? "{0:2}\n" : "{0}", Msg); + Out << "Content-Length: " << OutputBuffer.size() << "\r\n\r\n" + << OutputBuffer; + Out.flush(); + Logger::debug(">>> {0}\n", OutputBuffer); } -bool JSONTransport::handleMessage(llvm::json::Value msg, - MessageHandler &handler) { +bool JSONTransport::handleMessage(llvm::json::Value Msg, + MessageHandler &Handler) { // Message must be an object with "jsonrpc":"2.0". - llvm::json::Object *object = msg.getAsObject(); - if (!object || - object->getString("jsonrpc") != std::optional("2.0")) + llvm::json::Object *Object = Msg.getAsObject(); + if (!Object || + Object->getString("jsonrpc") != std::optional("2.0")) return false; // `id` may be any JSON value. If absent, this is a notification. - std::optional id; - if (llvm::json::Value *i = object->get("id")) - id = std::move(*i); - std::optional method = object->getString("method"); + std::optional Id; + if (llvm::json::Value *I = Object->get("id")) + Id = std::move(*I); + std::optional Method = Object->getString("method"); // This is a response. - if (!method) { - if (!id) + if (!Method) { + if (!Id) return false; - if (auto *err = object->getObject("error")) - return handler.onReply(std::move(*id), decodeError(*err)); + if (auto *Err = Object->getObject("error")) + return Handler.onReply(std::move(*Id), decodeError(*Err)); // result should be given, use null if not. - llvm::json::Value result = nullptr; - if (llvm::json::Value *r = object->get("result")) - result = std::move(*r); - return handler.onReply(std::move(*id), std::move(result)); + llvm::json::Value Result = nullptr; + if (llvm::json::Value *R = Object->get("result")) + Result = std::move(*R); + return Handler.onReply(std::move(*Id), std::move(Result)); } // Params should be given, use null if not. - llvm::json::Value params = nullptr; - if (llvm::json::Value *p = object->get("params")) - params = std::move(*p); + llvm::json::Value Params = nullptr; + if (llvm::json::Value *P = Object->get("params")) + Params = std::move(*P); - if (id) - return handler.onCall(*method, std::move(params), std::move(*id)); - return handler.onNotify(*method, std::move(params)); + if (Id) + return Handler.onCall(*Method, std::move(Params), std::move(*Id)); + return Handler.onNotify(*Method, std::move(Params)); } /// Tries to read a line up to and including \n. /// If failing, feof(), ferror(), or shutdownRequested() will be set. -LogicalResult readLine(std::FILE *in, SmallVectorImpl &out) { +LogicalResult readLine(std::FILE *In, SmallVectorImpl &Out) { // Big enough to hold any reasonable header line. May not fit content lines // in delimited mode, but performance doesn't matter for that mode. - static constexpr int bufSize = 128; - size_t size = 0; - out.clear(); + static constexpr int BufSize = 128; + size_t Size = 0; + Out.clear(); for (;;) { - out.resize_for_overwrite(size + bufSize); - if (!std::fgets(&out[size], bufSize, in)) + Out.resize_for_overwrite(Size + BufSize); + if (!std::fgets(&Out[Size], BufSize, In)) return failure(); - clearerr(in); + clearerr(In); // If the line contained null bytes, anything after it (including \n) will // be ignored. Fortunately this is not a legal header or JSON. - size_t read = std::strlen(&out[size]); - if (read > 0 && out[size + read - 1] == '\n') { - out.resize(size + read); + size_t Read = std::strlen(&Out[Size]); + if (Read > 0 && Out[Size + Read - 1] == '\n') { + Out.resize(Size + Read); return success(); } - size += read; + Size += Read; } } @@ -303,20 +303,20 @@ LogicalResult readLine(std::FILE *in, SmallVectorImpl &out) { // - ferror(), feof(), or shutdownRequested() are set. // - Content-Length is missing or empty (protocol error) LogicalResult -JSONTransportInputOverFile::readStandardMessage(std::string &json) { +JSONTransportInputOverFile::readStandardMessage(std::string &Json) { // A Language Server Protocol message starts with a set of HTTP headers, // delimited by \r\n, and terminated by an empty line (\r\n). - unsigned long long contentLength = 0; - llvm::SmallString<128> line; + unsigned long long ContentLength = 0; + llvm::SmallString<128> Line; while (true) { - if (feof(in) || hasError() || failed(readLine(in, line))) + if (feof(In) || hasError() || failed(readLine(In, Line))) return failure(); // Content-Length is a mandatory header, and the only one we handle. - StringRef lineRef = line; - if (lineRef.consume_front("Content-Length: ")) { - llvm::getAsUnsignedInteger(lineRef.trim(), 0, contentLength); - } else if (!lineRef.trim().empty()) { + StringRef LineRef = Line; + if (LineRef.consume_front("Content-Length: ")) { + llvm::getAsUnsignedInteger(LineRef.trim(), 0, ContentLength); + } else if (!LineRef.trim().empty()) { // It's another header, ignore it. continue; } else { @@ -326,19 +326,19 @@ JSONTransportInputOverFile::readStandardMessage(std::string &json) { } // The fuzzer likes crashing us by sending "Content-Length: 9999999999999999" - if (contentLength == 0 || contentLength > 1 << 30) + if (ContentLength == 0 || ContentLength > 1 << 30) return failure(); - json.resize(contentLength); - for (size_t pos = 0, read; pos < contentLength; pos += read) { - read = std::fread(&json[pos], 1, contentLength - pos, in); - if (read == 0) + Json.resize(ContentLength); + for (size_t Pos = 0, Read; Pos < ContentLength; Pos += Read) { + Read = std::fread(&Json[Pos], 1, ContentLength - Pos, In); + if (Read == 0) return failure(); // If we're done, the error was transient. If we're not done, either it was // transient or we'll see it again on retry. - clearerr(in); - pos += read; + clearerr(In); + Pos += Read; } return success(); } @@ -350,20 +350,20 @@ JSONTransportInputOverFile::readStandardMessage(std::string &json) { /// When returning failure: feof(), ferror(), or shutdownRequested() will be /// set. LogicalResult -JSONTransportInputOverFile::readDelimitedMessage(std::string &json) { - json.clear(); - llvm::SmallString<128> line; - while (succeeded(readLine(in, line))) { - StringRef lineRef = line.str().trim(); - if (lineRef.starts_with("//")) { +JSONTransportInputOverFile::readDelimitedMessage(std::string &Json) { + Json.clear(); + llvm::SmallString<128> Line; + while (succeeded(readLine(In, Line))) { + StringRef LineRef = Line.str().trim(); + if (LineRef.starts_with("//")) { // Found a delimiter for the message. - if (lineRef == "// -----") + if (LineRef == "// -----") break; continue; } - json += line; + Json += Line; } - return failure(ferror(in)); + return failure(ferror(In)); } From 93232d53519b51088d900153965d13be24de4066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 07:46:30 +0000 Subject: [PATCH 07/13] Clang format files --- llvm/include/llvm/Support/LSP/Logging.h | 9 +++------ llvm/include/llvm/Support/LSP/Protocol.h | 3 +-- llvm/include/llvm/Support/LSP/Transport.h | 2 +- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/llvm/include/llvm/Support/LSP/Logging.h b/llvm/include/llvm/Support/LSP/Logging.h index 6930a7cf246df..d1ecf113a5123 100644 --- a/llvm/include/llvm/Support/LSP/Logging.h +++ b/llvm/include/llvm/Support/LSP/Logging.h @@ -29,16 +29,13 @@ class Logger { /// Initiate a log message at various severity levels. These should be called /// after a call to `initialize`. - template - static void debug(const char *Fmt, Ts &&...Vals) { + template static void debug(const char *Fmt, Ts &&...Vals) { log(Level::Debug, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } - template - static void info(const char *Fmt, Ts &&...Vals) { + template static void info(const char *Fmt, Ts &&...Vals) { log(Level::Info, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } - template - static void error(const char *Fmt, Ts &&...Vals) { + template static void error(const char *Fmt, Ts &&...Vals) { log(Level::Error, Fmt, llvm::formatv(Fmt, std::forward(Vals)...)); } diff --git a/llvm/include/llvm/Support/LSP/Protocol.h b/llvm/include/llvm/Support/LSP/Protocol.h index a01a1a0a00ef2..93b82f1e581f8 100644 --- a/llvm/include/llvm/Support/LSP/Protocol.h +++ b/llvm/include/llvm/Support/LSP/Protocol.h @@ -1248,8 +1248,7 @@ llvm::json::Value toJSON(const CodeAction &); } // namespace llvm namespace llvm { -template <> -struct format_provider { +template <> struct format_provider { static void format(const llvm::lsp::Position &pos, raw_ostream &os, StringRef style) { assert(style.empty() && "style modifiers for this type are not supported"); diff --git a/llvm/include/llvm/Support/LSP/Transport.h b/llvm/include/llvm/Support/LSP/Transport.h index 45a0b6a78e304..ccd7f213aa277 100644 --- a/llvm/include/llvm/Support/LSP/Transport.h +++ b/llvm/include/llvm/Support/LSP/Transport.h @@ -15,12 +15,12 @@ #ifndef LLVM_SUPPORT_LSP_TRANSPORT_H #define LLVM_SUPPORT_LSP_TRANSPORT_H -#include "llvm/Support/LSP/Logging.h" #include "llvm/ADT/FunctionExtras.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/FormatAdapters.h" #include "llvm/Support/JSON.h" +#include "llvm/Support/LSP/Logging.h" #include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/raw_ostream.h" #include From feec5e1c12db4b3cae766d621ade59c461f2d4a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 11:50:38 +0000 Subject: [PATCH 08/13] Fix object inclusion problems --- llvm/lib/Support/CMakeLists.txt | 1 - llvm/lib/Support/LSP/CMakeLists.txt | 14 ++++---------- mlir/lib/Tools/mlir-lsp-server/CMakeLists.txt | 1 + mlir/lib/Tools/mlir-pdll-lsp-server/CMakeLists.txt | 1 + mlir/lib/Tools/tblgen-lsp-server/CMakeLists.txt | 1 + 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/llvm/lib/Support/CMakeLists.txt b/llvm/lib/Support/CMakeLists.txt index 82a32ba817b10..d739f5c0f28b4 100644 --- a/llvm/lib/Support/CMakeLists.txt +++ b/llvm/lib/Support/CMakeLists.txt @@ -289,7 +289,6 @@ add_llvm_component_library(LLVMSupport ${ALLOCATOR_FILES} $ - $ # System Atomic.cpp diff --git a/llvm/lib/Support/LSP/CMakeLists.txt b/llvm/lib/Support/LSP/CMakeLists.txt index 353e649105c17..132dc78b23495 100644 --- a/llvm/lib/Support/LSP/CMakeLists.txt +++ b/llvm/lib/Support/LSP/CMakeLists.txt @@ -2,16 +2,10 @@ add_llvm_library(LLVMSupportLSP STATIC Protocol.cpp Transport.cpp Logging.cpp -) -target_include_directories(LLVMSupportLSP - PUBLIC - $ - $ - $ # for installation -) + ADDITIONAL_HEADER_DIRS + ${LLVM_MAIN_INCLUDE_DIR}/llvm/Support/LSP -target_link_libraries(LLVMSupportLSP - PUBLIC - LLVMSupport + LINK_LIBS + LLVMSupport ) diff --git a/mlir/lib/Tools/mlir-lsp-server/CMakeLists.txt b/mlir/lib/Tools/mlir-lsp-server/CMakeLists.txt index d04d5156fb3c5..db665dd31eaab 100644 --- a/mlir/lib/Tools/mlir-lsp-server/CMakeLists.txt +++ b/mlir/lib/Tools/mlir-lsp-server/CMakeLists.txt @@ -13,4 +13,5 @@ add_mlir_library(MLIRLspServerLib MLIRIR MLIRLspServerSupportLib MLIRParser + LLVMSupportLSP ) diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/CMakeLists.txt b/mlir/lib/Tools/mlir-pdll-lsp-server/CMakeLists.txt index bf25b7e0a64f3..fc1f90b19dc4a 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/CMakeLists.txt +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/CMakeLists.txt @@ -11,4 +11,5 @@ llvm_add_library(MLIRPdllLspServerLib MLIRPDLLCodeGen MLIRPDLLParser MLIRLspServerSupportLib + LLVMSupportLSP ) diff --git a/mlir/lib/Tools/tblgen-lsp-server/CMakeLists.txt b/mlir/lib/Tools/tblgen-lsp-server/CMakeLists.txt index 80fc1ffe4029a..67819247d72cb 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/CMakeLists.txt +++ b/mlir/lib/Tools/tblgen-lsp-server/CMakeLists.txt @@ -17,4 +17,5 @@ llvm_add_library(TableGenLspServerLib LINK_LIBS PUBLIC MLIRLspServerSupportLib MLIRSupport + LLVMSupportLSP ) From 6987df53fa95fa69bf3595b3f77c9f956113eefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 13:54:02 +0000 Subject: [PATCH 09/13] Remove using namespace llvm from MLIR code --- .../mlir/Tools/lsp-server-support/SourceMgrUtils.h | 10 +++++----- mlir/lib/Tools/mlir-lsp-server/MLIRServer.h | 12 +++++++++++- mlir/lib/Tools/mlir-lsp-server/Protocol.cpp | 3 --- mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h | 14 +++++++++++++- mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h | 3 ++- mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h | 8 +++++++- 6 files changed, 38 insertions(+), 12 deletions(-) diff --git a/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h b/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h index b4dc5956778d1..920ce831e42b6 100644 --- a/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h +++ b/mlir/include/mlir/Tools/lsp-server-support/SourceMgrUtils.h @@ -21,7 +21,6 @@ namespace mlir { namespace lsp { -using namespace llvm::lsp; //===----------------------------------------------------------------------===// // Utils //===----------------------------------------------------------------------===// @@ -47,17 +46,18 @@ bool contains(SMRange range, SMLoc loc); /// This class represents a single include within a root file. struct SourceMgrInclude { - SourceMgrInclude(const lsp::URIForFile &uri, const lsp::Range &range) + SourceMgrInclude(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Range &range) : uri(uri), range(range) {} /// Build a hover for the current include file. - Hover buildHover() const; + llvm::lsp::Hover buildHover() const; /// The URI of the file that is included. - lsp::URIForFile uri; + llvm::lsp::URIForFile uri; /// The range of the include directive. - lsp::Range range; + llvm::lsp::Range range; }; /// Given a source manager, gather all of the processed include files. These are diff --git a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h index d681cbb3de0d4..31a01fec8bbc9 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h +++ b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.h @@ -20,7 +20,17 @@ namespace mlir { class DialectRegistry; namespace lsp { -using namespace llvm::lsp; +using llvm::lsp::CodeAction; +using llvm::lsp::CodeActionContext; +using llvm::lsp::CompletionList; +using llvm::lsp::Diagnostic; +using llvm::lsp::DocumentSymbol; +using llvm::lsp::Hover; +using llvm::lsp::Location; +using llvm::lsp::MLIRConvertBytecodeResult; +using llvm::lsp::Position; +using llvm::lsp::Range; +using llvm::lsp::URIForFile; /// This class implements all of the MLIR related functionality necessary for a /// language server. This class allows for keeping the MLIR specific logic diff --git a/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp b/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp index 215d49ea44ff3..28aded304d388 100644 --- a/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/Protocol.cpp @@ -13,9 +13,6 @@ #include "Protocol.h" #include "llvm/Support/JSON.h" -using namespace llvm; -using namespace llvm::lsp; - //===----------------------------------------------------------------------===// // MLIRConvertBytecodeParams //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h index 981ded0756860..d82014d6b0684 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.h @@ -19,7 +19,19 @@ namespace mlir { namespace lsp { -using namespace llvm::lsp; +using llvm::lsp::CompletionList; +using llvm::lsp::Diagnostic; +using llvm::lsp::DocumentLink; +using llvm::lsp::DocumentSymbol; +using llvm::lsp::Hover; +using llvm::lsp::InlayHint; +using llvm::lsp::Location; +using llvm::lsp::Position; +using llvm::lsp::Range; +using llvm::lsp::SignatureHelp; +using llvm::lsp::TextDocumentContentChangeEvent; +using llvm::lsp::URIForFile; + class CompilationDatabase; struct PDLLViewOutputResult; enum class PDLLViewOutputKind; diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h index 68f145597e519..a2775f8cbadc2 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/Protocol.h @@ -24,7 +24,8 @@ namespace mlir { namespace lsp { -using namespace llvm::lsp; +using llvm::lsp::URIForFile; + //===----------------------------------------------------------------------===// // PDLLViewOutputParams //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h index 27bfe3dd699cc..e54b8bcf35e24 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.h @@ -19,7 +19,13 @@ namespace mlir { namespace lsp { -using namespace llvm::lsp; +using llvm::lsp::Diagnostic; +using llvm::lsp::DocumentLink; +using llvm::lsp::Hover; +using llvm::lsp::Location; +using llvm::lsp::Position; +using llvm::lsp::TextDocumentContentChangeEvent; +using llvm::lsp::URIForFile; /// This class implements all of the TableGen related functionality necessary /// for a language server. This class allows for keeping the TableGen specific From 8183fed10cda2deffde162152d250d39e61769fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 15:37:11 +0000 Subject: [PATCH 10/13] Remove using namespace llvm from mlir files pt2 --- .../CompilationDatabase.cpp | 2 +- .../lsp-server-support/SourceMgrUtils.cpp | 4 + mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp | 28 +- mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp | 109 +++-- .../mlir-lsp-server/MlirLspServerMain.cpp | 4 + .../Tools/mlir-pdll-lsp-server/LSPServer.cpp | 25 + .../MlirPdllLspServerMain.cpp | 3 + .../Tools/mlir-pdll-lsp-server/PDLLServer.cpp | 454 +++++++++--------- .../lib/Tools/tblgen-lsp-server/LSPServer.cpp | 20 +- .../TableGenLspServerMain.cpp | 4 + .../tblgen-lsp-server/TableGenServer.cpp | 158 +++--- 11 files changed, 456 insertions(+), 355 deletions(-) diff --git a/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp b/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp index 99fa84e824e25..67b8ef6a256bb 100644 --- a/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp +++ b/mlir/lib/Tools/lsp-server-support/CompilationDatabase.cpp @@ -16,7 +16,7 @@ using namespace mlir; using namespace mlir::lsp; -using namespace llvm::lsp; +using llvm::lsp::Logger; //===----------------------------------------------------------------------===// // YamlFileInfo diff --git a/mlir/lib/Tools/lsp-server-support/SourceMgrUtils.cpp b/mlir/lib/Tools/lsp-server-support/SourceMgrUtils.cpp index f1a362385f285..5cd1c85d054ab 100644 --- a/mlir/lib/Tools/lsp-server-support/SourceMgrUtils.cpp +++ b/mlir/lib/Tools/lsp-server-support/SourceMgrUtils.cpp @@ -14,6 +14,10 @@ using namespace mlir; using namespace mlir::lsp; +using llvm::lsp::Hover; +using llvm::lsp::Range; +using llvm::lsp::URIForFile; + //===----------------------------------------------------------------------===// // Utils //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp b/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp index fe1bbe4e750a7..1bbbcdecb57af 100644 --- a/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/LSPServer.cpp @@ -17,7 +17,33 @@ using namespace mlir; using namespace mlir::lsp; -using namespace llvm::lsp; + +using llvm::lsp::Callback; +using llvm::lsp::CodeAction; +using llvm::lsp::CodeActionParams; +using llvm::lsp::CompletionList; +using llvm::lsp::CompletionParams; +using llvm::lsp::DidChangeTextDocumentParams; +using llvm::lsp::DidCloseTextDocumentParams; +using llvm::lsp::DidOpenTextDocumentParams; +using llvm::lsp::DocumentSymbol; +using llvm::lsp::DocumentSymbolParams; +using llvm::lsp::Hover; +using llvm::lsp::InitializedParams; +using llvm::lsp::InitializeParams; +using llvm::lsp::JSONTransport; +using llvm::lsp::Location; +using llvm::lsp::Logger; +using llvm::lsp::MessageHandler; +using llvm::lsp::MLIRConvertBytecodeParams; +using llvm::lsp::MLIRConvertBytecodeResult; +using llvm::lsp::NoParams; +using llvm::lsp::OutgoingNotification; +using llvm::lsp::PublishDiagnosticsParams; +using llvm::lsp::ReferenceParams; +using llvm::lsp::TextDocumentPositionParams; +using llvm::lsp::TextDocumentSyncKind; +using llvm::lsp::URIForFile; //===----------------------------------------------------------------------===// // LSPServer diff --git a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp index 594e2e3d1c47b..47b4328d0d9ec 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/MLIRServer.cpp @@ -39,9 +39,9 @@ static std::optional getLocationFromLoc(StringRef uriScheme, llvm::Expected sourceURI = lsp::URIForFile::fromFile(loc.getFilename(), uriScheme); if (!sourceURI) { - lsp::Logger::error("Failed to create URI for file `{0}`: {1}", - loc.getFilename(), - llvm::toString(sourceURI.takeError())); + llvm::lsp::Logger::error("Failed to create URI for file `{0}`: {1}", + loc.getFilename(), + llvm::toString(sourceURI.takeError())); return std::nullopt; } @@ -220,19 +220,19 @@ static lsp::Diagnostic getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, case mlir::DiagnosticSeverity::Note: llvm_unreachable("expected notes to be handled separately"); case mlir::DiagnosticSeverity::Warning: - lspDiag.severity = lsp::DiagnosticSeverity::Warning; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Warning; break; case mlir::DiagnosticSeverity::Error: - lspDiag.severity = lsp::DiagnosticSeverity::Error; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Error; break; case mlir::DiagnosticSeverity::Remark: - lspDiag.severity = lsp::DiagnosticSeverity::Information; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Information; break; } lspDiag.message = diag.str(); // Attach any notes to the main diagnostic as related information. - std::vector relatedDiags; + std::vector relatedDiags; for (Diagnostic ¬e : diag.getNotes()) { lsp::Location noteLoc; if (std::optional loc = @@ -317,7 +317,7 @@ struct MLIRDocument { void getCodeActionForDiagnostic(const lsp::URIForFile &uri, lsp::Position &pos, StringRef severity, StringRef message, - std::vector &edits); + std::vector &edits); //===--------------------------------------------------------------------===// // Bytecode @@ -355,7 +355,8 @@ MLIRDocument::MLIRDocument(MLIRContext &context, const lsp::URIForFile &uri, // Try to parsed the given IR string. auto memBuffer = llvm::MemoryBuffer::getMemBufferCopy(contents, uri.file()); if (!memBuffer) { - lsp::Logger::error("Failed to create memory buffer for file", uri.file()); + llvm::lsp::Logger::error("Failed to create memory buffer for file", + uri.file()); return; } @@ -695,8 +696,8 @@ void MLIRDocument::findDocumentSymbols( if (SymbolOpInterface symbol = dyn_cast(op)) { symbols.emplace_back(symbol.getName(), isa(op) - ? lsp::SymbolKind::Function - : lsp::SymbolKind::Class, + ? llvm::lsp::SymbolKind::Function + : llvm::lsp::SymbolKind::Class, lsp::Range(sourceMgr, def->scopeLoc), lsp::Range(sourceMgr, def->loc)); childSymbols = &symbols.back().children; @@ -704,9 +705,9 @@ void MLIRDocument::findDocumentSymbols( } else if (op->hasTrait()) { // Otherwise, if this is a symbol table push an anonymous document symbol. symbols.emplace_back("<" + op->getName().getStringRef() + ">", - lsp::SymbolKind::Namespace, - lsp::Range(sourceMgr, def->scopeLoc), - lsp::Range(sourceMgr, def->loc)); + llvm::lsp::SymbolKind::Namespace, + llvm::lsp::Range(sourceMgr, def->scopeLoc), + llvm::lsp::Range(sourceMgr, def->loc)); childSymbols = &symbols.back().children; } } @@ -734,9 +735,9 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { /// Signal code completion for a dialect name, with an optional prefix. void completeDialectName(StringRef prefix) final { for (StringRef dialect : ctx->getAvailableDialects()) { - lsp::CompletionItem item(prefix + dialect, - lsp::CompletionItemKind::Module, - /*sortText=*/"3"); + llvm::lsp::CompletionItem item(prefix + dialect, + llvm::lsp::CompletionItemKind::Module, + /*sortText=*/"3"); item.detail = "dialect"; completionList.items.emplace_back(item); } @@ -753,9 +754,9 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { if (&op.getDialect() != dialect) continue; - lsp::CompletionItem item( + llvm::lsp::CompletionItem item( op.getStringRef().drop_front(dialectName.size() + 1), - lsp::CompletionItemKind::Field, + llvm::lsp::CompletionItemKind::Field, /*sortText=*/"1"); item.detail = "operation"; completionList.items.emplace_back(item); @@ -768,7 +769,8 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { // Check if we need to insert the `%` or not. bool stripPrefix = getCodeCompleteLoc().getPointer()[-1] == '%'; - lsp::CompletionItem item(name, lsp::CompletionItemKind::Variable); + llvm::lsp::CompletionItem item(name, + llvm::lsp::CompletionItemKind::Variable); if (stripPrefix) item.insertText = name.drop_front(1).str(); item.detail = std::move(typeData); @@ -781,7 +783,7 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { // Check if we need to insert the `^` or not. bool stripPrefix = getCodeCompleteLoc().getPointer()[-1] == '^'; - lsp::CompletionItem item(name, lsp::CompletionItemKind::Field); + llvm::lsp::CompletionItem item(name, llvm::lsp::CompletionItemKind::Field); if (stripPrefix) item.insertText = name.drop_front(1).str(); completionList.items.emplace_back(item); @@ -790,8 +792,9 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { /// Signal a completion for the given expected token. void completeExpectedTokens(ArrayRef tokens, bool optional) final { for (StringRef token : tokens) { - lsp::CompletionItem item(token, lsp::CompletionItemKind::Keyword, - /*sortText=*/"0"); + llvm::lsp::CompletionItem item(token, + llvm::lsp::CompletionItemKind::Keyword, + /*sortText=*/"0"); item.detail = optional ? "optional" : ""; completionList.items.emplace_back(item); } @@ -802,7 +805,7 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { appendSimpleCompletions({"affine_set", "affine_map", "dense", "dense_resource", "false", "loc", "sparse", "true", "unit"}, - lsp::CompletionItemKind::Field, + llvm::lsp::CompletionItemKind::Field, /*sortText=*/"1"); completeDialectName("#"); @@ -820,13 +823,14 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { appendSimpleCompletions({"memref", "tensor", "complex", "tuple", "vector", "bf16", "f16", "f32", "f64", "f80", "f128", "index", "none"}, - lsp::CompletionItemKind::Field, + llvm::lsp::CompletionItemKind::Field, /*sortText=*/"1"); // Handle the builtin integer types. for (StringRef type : {"i", "si", "ui"}) { - lsp::CompletionItem item(type + "", lsp::CompletionItemKind::Field, - /*sortText=*/"1"); + llvm::lsp::CompletionItem item(type + "", + llvm::lsp::CompletionItemKind::Field, + /*sortText=*/"1"); item.insertText = type.str(); completionList.items.emplace_back(item); } @@ -846,9 +850,9 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { void completeAliases(const llvm::StringMap &aliases, StringRef prefix = "") { for (const auto &alias : aliases) { - lsp::CompletionItem item(prefix + alias.getKey(), - lsp::CompletionItemKind::Field, - /*sortText=*/"2"); + llvm::lsp::CompletionItem item(prefix + alias.getKey(), + llvm::lsp::CompletionItemKind::Field, + /*sortText=*/"2"); llvm::raw_string_ostream(item.detail) << "alias: " << alias.getValue(); completionList.items.emplace_back(item); } @@ -856,7 +860,7 @@ class LSPCodeCompleteContext : public AsmParserCodeCompleteContext { /// Add a set of simple completions that all have the same kind. void appendSimpleCompletions(ArrayRef completions, - lsp::CompletionItemKind kind, + llvm::lsp::CompletionItemKind kind, StringRef sortText = "") { for (StringRef completion : completions) completionList.items.emplace_back(completion, kind, sortText); @@ -897,7 +901,7 @@ MLIRDocument::getCodeCompletion(const lsp::URIForFile &uri, void MLIRDocument::getCodeActionForDiagnostic( const lsp::URIForFile &uri, lsp::Position &pos, StringRef severity, - StringRef message, std::vector &edits) { + StringRef message, std::vector &edits) { // Ignore diagnostics that print the current operation. These are always // enabled for the language server, but not generally during normal // parsing/verification. @@ -913,7 +917,7 @@ void MLIRDocument::getCodeActionForDiagnostic( // Add a text edit for adding an expected-* diagnostic check for this // diagnostic. - lsp::TextEdit edit; + llvm::lsp::TextEdit edit; edit.range = lsp::Range(lsp::Position(pos.line, 0)); // Use the indent of the current line for the expected-* diagnostic. @@ -937,13 +941,14 @@ MLIRDocument::convertToBytecode() { // conceptually be relaxed. if (!llvm::hasSingleElement(parsedIR)) { if (parsedIR.empty()) { - return llvm::make_error( + return llvm::make_error( "expected a single and valid top-level operation, please ensure " "there are no errors", - lsp::ErrorCode::RequestFailed); + llvm::lsp::ErrorCode::RequestFailed); } - return llvm::make_error( - "expected a single top-level operation", lsp::ErrorCode::RequestFailed); + return llvm::make_error( + "expected a single top-level operation", + llvm::lsp::ErrorCode::RequestFailed); } lsp::MLIRConvertBytecodeResult result; @@ -1134,7 +1139,7 @@ void MLIRTextFile::findDocumentSymbols( lsp::Position endPos((i == e - 1) ? totalNumLines - 1 : chunks[i + 1]->lineOffset); lsp::DocumentSymbol symbol("", - lsp::SymbolKind::Namespace, + llvm::lsp::SymbolKind::Namespace, /*range=*/lsp::Range(startPos, endPos), /*selectionRange=*/lsp::Range(startPos)); chunk.document.findDocumentSymbols(symbol.children); @@ -1167,10 +1172,10 @@ lsp::CompletionList MLIRTextFile::getCodeCompletion(const lsp::URIForFile &uri, uri, completePos, context.getDialectRegistry()); // Adjust any completion locations. - for (lsp::CompletionItem &item : completionList.items) { + for (llvm::lsp::CompletionItem &item : completionList.items) { if (item.textEdit) chunk.adjustLocForChunkOffset(item.textEdit->range); - for (lsp::TextEdit &edit : item.additionalTextEdits) + for (llvm::lsp::TextEdit &edit : item.additionalTextEdits) chunk.adjustLocForChunkOffset(edit.range); } return completionList; @@ -1194,10 +1199,10 @@ void MLIRTextFile::getCodeActions(const lsp::URIForFile &uri, StringRef severity; switch (diag.severity) { - case lsp::DiagnosticSeverity::Error: + case llvm::lsp::DiagnosticSeverity::Error: severity = "error"; break; - case lsp::DiagnosticSeverity::Warning: + case llvm::lsp::DiagnosticSeverity::Warning: severity = "warning"; break; default: @@ -1205,7 +1210,7 @@ void MLIRTextFile::getCodeActions(const lsp::URIForFile &uri, } // Get edits for the diagnostic. - std::vector edits; + std::vector edits; chunk.document.getCodeActionForDiagnostic(uri, diagPos, severity, diag.message, edits); @@ -1221,7 +1226,7 @@ void MLIRTextFile::getCodeActions(const lsp::URIForFile &uri, } } // Fixup the locations for any edits. - for (lsp::TextEdit &edit : edits) + for (llvm::lsp::TextEdit &edit : edits) chunk.adjustLocForChunkOffset(edit.range); action.edit.emplace(); @@ -1236,9 +1241,9 @@ llvm::Expected MLIRTextFile::convertToBytecode() { // Bail out if there is more than one chunk, bytecode wants a single module. if (chunks.size() != 1) { - return llvm::make_error( + return llvm::make_error( "unexpected split file, please remove all `// -----`", - lsp::ErrorCode::RequestFailed); + llvm::lsp::ErrorCode::RequestFailed); } return chunks.front()->document.convertToBytecode(); } @@ -1367,17 +1372,17 @@ lsp::MLIRServer::convertFromBytecode(const URIForFile &uri) { // Try to parse the given source file. Block parsedBlock; if (failed(parseSourceFile(uri.file(), &parsedBlock, parserConfig))) { - return llvm::make_error( + return llvm::make_error( "failed to parse bytecode source file: " + errorMsg, - lsp::ErrorCode::RequestFailed); + llvm::lsp::ErrorCode::RequestFailed); } // TODO: We currently expect a single top-level operation, but this could // conceptually be relaxed. if (!llvm::hasSingleElement(parsedBlock)) { - return llvm::make_error( + return llvm::make_error( "expected bytecode to contain a single top-level operation", - lsp::ErrorCode::RequestFailed); + llvm::lsp::ErrorCode::RequestFailed); } // Print the module to a buffer. @@ -1401,9 +1406,9 @@ llvm::Expected lsp::MLIRServer::convertToBytecode(const URIForFile &uri) { auto fileIt = impl->files.find(uri.file()); if (fileIt == impl->files.end()) { - return llvm::make_error( + return llvm::make_error( "language server does not contain an entry for this source file", - lsp::ErrorCode::RequestFailed); + llvm::lsp::ErrorCode::RequestFailed); } return fileIt->second->convertToBytecode(); } diff --git a/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp b/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp index ed20dd5bd62d5..d4589b240e39e 100644 --- a/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp +++ b/mlir/lib/Tools/mlir-lsp-server/MlirLspServerMain.cpp @@ -17,6 +17,10 @@ using namespace mlir; using namespace mlir::lsp; +using llvm::lsp::JSONStreamStyle; +using llvm::lsp::JSONTransport; +using llvm::lsp::Logger; + LogicalResult mlir::MlirLspServerMain(int argc, char **argv, DialectRegistryFn registry_fn) { llvm::cl::opt inputStyle{ diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp index f7a8a127c246b..7b23adcc7e2e1 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/LSPServer.cpp @@ -11,6 +11,7 @@ #include "PDLLServer.h" #include "Protocol.h" #include "llvm/Support/LSP/Logging.h" +#include "llvm/Support/LSP/Protocol.h" #include "llvm/Support/LSP/Transport.h" #include @@ -19,6 +20,30 @@ using namespace mlir; using namespace mlir::lsp; +using llvm::lsp::Callback; +using llvm::lsp::CompletionList; +using llvm::lsp::CompletionParams; +using llvm::lsp::DidChangeTextDocumentParams; +using llvm::lsp::DidCloseTextDocumentParams; +using llvm::lsp::DidOpenTextDocumentParams; +using llvm::lsp::DocumentLinkParams; +using llvm::lsp::DocumentSymbol; +using llvm::lsp::DocumentSymbolParams; +using llvm::lsp::Hover; +using llvm::lsp::InitializedParams; +using llvm::lsp::InitializeParams; +using llvm::lsp::InlayHintsParams; +using llvm::lsp::JSONTransport; +using llvm::lsp::Location; +using llvm::lsp::Logger; +using llvm::lsp::MessageHandler; +using llvm::lsp::NoParams; +using llvm::lsp::OutgoingNotification; +using llvm::lsp::PublishDiagnosticsParams; +using llvm::lsp::ReferenceParams; +using llvm::lsp::TextDocumentPositionParams; +using llvm::lsp::TextDocumentSyncKind; + //===----------------------------------------------------------------------===// // LSPServer //===----------------------------------------------------------------------===// diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp index 1a0560694b132..5dea130675cdb 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/MlirPdllLspServerMain.cpp @@ -17,6 +17,9 @@ using namespace mlir; using namespace mlir::lsp; +using llvm::lsp::JSONStreamStyle; +using llvm::lsp::Logger; + LogicalResult mlir::MlirPdllLspServerMain(int argc, char **argv) { llvm::cl::opt inputStyle{ "input-style", diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp index 5443dc3ec7da1..f040f41d2996c 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp @@ -38,16 +38,16 @@ using namespace mlir::pdll; /// Returns a language server uri for the given source location. `mainFileURI` /// corresponds to the uri for the main file of the source manager. -static lsp::URIForFile getURIFromLoc(llvm::SourceMgr &mgr, SMRange loc, - const lsp::URIForFile &mainFileURI) { +static llvm::lsp::URIForFile getURIFromLoc(llvm::SourceMgr &mgr, SMRange loc, + const llvm::lsp::URIForFile &mainFileURI) { int bufferId = mgr.FindBufferContainingLoc(loc.Start); if (bufferId == 0 || bufferId == static_cast(mgr.getMainFileID())) return mainFileURI; - llvm::Expected fileForLoc = lsp::URIForFile::fromFile( + llvm::Expected fileForLoc = llvm::lsp::URIForFile::fromFile( mgr.getBufferInfo(bufferId).Buffer->getBufferIdentifier()); if (fileForLoc) return *fileForLoc; - lsp::Logger::error("Failed to create URI for include file: {0}", + llvm::lsp::Logger::error("Failed to create URI for include file: {0}", llvm::toString(fileForLoc.takeError())); return mainFileURI; } @@ -59,16 +59,16 @@ static bool isMainFileLoc(llvm::SourceMgr &mgr, SMRange loc) { } /// Returns a language server location from the given source range. -static lsp::Location getLocationFromLoc(llvm::SourceMgr &mgr, SMRange range, - const lsp::URIForFile &uri) { - return lsp::Location(getURIFromLoc(mgr, range, uri), lsp::Range(mgr, range)); +static llvm::lsp::Location getLocationFromLoc(llvm::SourceMgr &mgr, SMRange range, + const llvm::lsp::URIForFile &uri) { + return llvm::lsp::Location(getURIFromLoc(mgr, range, uri), llvm::lsp::Range(mgr, range)); } /// Convert the given MLIR diagnostic to the LSP form. -static std::optional +static std::optional getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, const ast::Diagnostic &diag, - const lsp::URIForFile &uri) { - lsp::Diagnostic lspDiag; + const llvm::lsp::URIForFile &uri) { + llvm::lsp::Diagnostic lspDiag; lspDiag.source = "pdll"; // FIXME: Right now all of the diagnostics are treated as parser issues, but @@ -76,7 +76,7 @@ getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, const ast::Diagnostic &diag, lspDiag.category = "Parse Error"; // Try to grab a file location for this diagnostic. - lsp::Location loc = getLocationFromLoc(sourceMgr, diag.getLocation(), uri); + llvm::lsp::Location loc = getLocationFromLoc(sourceMgr, diag.getLocation(), uri); lspDiag.range = loc.range; // Skip diagnostics that weren't emitted within the main file. @@ -88,19 +88,19 @@ getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, const ast::Diagnostic &diag, case ast::Diagnostic::Severity::DK_Note: llvm_unreachable("expected notes to be handled separately"); case ast::Diagnostic::Severity::DK_Warning: - lspDiag.severity = lsp::DiagnosticSeverity::Warning; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Warning; break; case ast::Diagnostic::Severity::DK_Error: - lspDiag.severity = lsp::DiagnosticSeverity::Error; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Error; break; case ast::Diagnostic::Severity::DK_Remark: - lspDiag.severity = lsp::DiagnosticSeverity::Information; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Information; break; } lspDiag.message = diag.getMessage().str(); // Attach any notes to the main diagnostic as related information. - std::vector relatedDiags; + std::vector relatedDiags; for (const ast::Diagnostic ¬e : diag.getNotes()) { relatedDiags.emplace_back( getLocationFromLoc(sourceMgr, note.getLocation(), uri), @@ -259,9 +259,9 @@ namespace { /// This class represents all of the information pertaining to a specific PDL /// document. struct PDLDocument { - PDLDocument(const lsp::URIForFile &uri, StringRef contents, + PDLDocument(const llvm::lsp::URIForFile &uri, StringRef contents, const std::vector &extraDirs, - std::vector &diagnostics); + std::vector &diagnostics); PDLDocument(const PDLDocument &) = delete; PDLDocument &operator=(const PDLDocument &) = delete; @@ -269,36 +269,36 @@ struct PDLDocument { // Definitions and References //===--------------------------------------------------------------------===// - void getLocationsOf(const lsp::URIForFile &uri, const lsp::Position &defPos, - std::vector &locations); - void findReferencesOf(const lsp::URIForFile &uri, const lsp::Position &pos, - std::vector &references); + void getLocationsOf(const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &defPos, + std::vector &locations); + void findReferencesOf(const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &pos, + std::vector &references); //===--------------------------------------------------------------------===// // Document Links //===--------------------------------------------------------------------===// - void getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links); + void getDocumentLinks(const llvm::lsp::URIForFile &uri, + std::vector &links); //===--------------------------------------------------------------------===// // Hover //===--------------------------------------------------------------------===// - std::optional findHover(const lsp::URIForFile &uri, - const lsp::Position &hoverPos); - std::optional findHover(const ast::Decl *decl, + std::optional findHover(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &hoverPos); + std::optional findHover(const ast::Decl *decl, const SMRange &hoverRange); - lsp::Hover buildHoverForOpName(const ods::Operation *op, + llvm::lsp::Hover buildHoverForOpName(const ods::Operation *op, const SMRange &hoverRange); - lsp::Hover buildHoverForVariable(const ast::VariableDecl *varDecl, + llvm::lsp::Hover buildHoverForVariable(const ast::VariableDecl *varDecl, const SMRange &hoverRange); - lsp::Hover buildHoverForPattern(const ast::PatternDecl *decl, + llvm::lsp::Hover buildHoverForPattern(const ast::PatternDecl *decl, const SMRange &hoverRange); - lsp::Hover buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, + llvm::lsp::Hover buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, const SMRange &hoverRange); template - lsp::Hover buildHoverForUserConstraintOrRewrite(StringRef typeName, + llvm::lsp::Hover buildHoverForUserConstraintOrRewrite(StringRef typeName, const T *decl, const SMRange &hoverRange); @@ -306,39 +306,39 @@ struct PDLDocument { // Document Symbols //===--------------------------------------------------------------------===// - void findDocumentSymbols(std::vector &symbols); + void findDocumentSymbols(std::vector &symbols); //===--------------------------------------------------------------------===// // Code Completion //===--------------------------------------------------------------------===// - lsp::CompletionList getCodeCompletion(const lsp::URIForFile &uri, - const lsp::Position &completePos); + llvm::lsp::CompletionList getCodeCompletion(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &completePos); //===--------------------------------------------------------------------===// // Signature Help //===--------------------------------------------------------------------===// - lsp::SignatureHelp getSignatureHelp(const lsp::URIForFile &uri, - const lsp::Position &helpPos); + llvm::lsp::SignatureHelp getSignatureHelp(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &helpPos); //===--------------------------------------------------------------------===// // Inlay Hints //===--------------------------------------------------------------------===// - void getInlayHints(const lsp::URIForFile &uri, const lsp::Range &range, - std::vector &inlayHints); + void getInlayHints(const llvm::lsp::URIForFile &uri, const llvm::lsp::Range &range, + std::vector &inlayHints); void getInlayHintsFor(const ast::VariableDecl *decl, - const lsp::URIForFile &uri, - std::vector &inlayHints); - void getInlayHintsFor(const ast::CallExpr *expr, const lsp::URIForFile &uri, - std::vector &inlayHints); + const llvm::lsp::URIForFile &uri, + std::vector &inlayHints); + void getInlayHintsFor(const ast::CallExpr *expr, const llvm::lsp::URIForFile &uri, + std::vector &inlayHints); void getInlayHintsFor(const ast::OperationExpr *expr, - const lsp::URIForFile &uri, - std::vector &inlayHints); + const llvm::lsp::URIForFile &uri, + std::vector &inlayHints); /// Add a parameter hint for the given expression using `label`. - void addParameterHintFor(std::vector &inlayHints, + void addParameterHintFor(std::vector &inlayHints, const ast::Expr *expr, StringRef label); //===--------------------------------------------------------------------===// @@ -372,13 +372,13 @@ struct PDLDocument { }; } // namespace -PDLDocument::PDLDocument(const lsp::URIForFile &uri, StringRef contents, +PDLDocument::PDLDocument(const llvm::lsp::URIForFile &uri, StringRef contents, const std::vector &extraDirs, - std::vector &diagnostics) + std::vector &diagnostics) : astContext(odsContext) { auto memBuffer = llvm::MemoryBuffer::getMemBufferCopy(contents, uri.file()); if (!memBuffer) { - lsp::Logger::error("Failed to create memory buffer for file", uri.file()); + llvm::lsp::Logger::error("Failed to create memory buffer for file", uri.file()); return; } @@ -412,9 +412,9 @@ PDLDocument::PDLDocument(const lsp::URIForFile &uri, StringRef contents, // PDLDocument: Definitions and References //===----------------------------------------------------------------------===// -void PDLDocument::getLocationsOf(const lsp::URIForFile &uri, - const lsp::Position &defPos, - std::vector &locations) { +void PDLDocument::getLocationsOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &defPos, + std::vector &locations) { SMLoc posLoc = defPos.getAsSMLoc(sourceMgr); const PDLIndexSymbol *symbol = index.lookup(posLoc); if (!symbol) @@ -423,9 +423,9 @@ void PDLDocument::getLocationsOf(const lsp::URIForFile &uri, locations.push_back(getLocationFromLoc(sourceMgr, symbol->getDefLoc(), uri)); } -void PDLDocument::findReferencesOf(const lsp::URIForFile &uri, - const lsp::Position &pos, - std::vector &references) { +void PDLDocument::findReferencesOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &pos, + std::vector &references) { SMLoc posLoc = pos.getAsSMLoc(sourceMgr); const PDLIndexSymbol *symbol = index.lookup(posLoc); if (!symbol) @@ -440,8 +440,8 @@ void PDLDocument::findReferencesOf(const lsp::URIForFile &uri, // PDLDocument: Document Links //===--------------------------------------------------------------------===// -void PDLDocument::getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links) { +void PDLDocument::getDocumentLinks(const llvm::lsp::URIForFile &uri, + std::vector &links) { for (const lsp::SourceMgrInclude &include : parsedIncludes) links.emplace_back(include.range, include.uri); } @@ -450,9 +450,9 @@ void PDLDocument::getDocumentLinks(const lsp::URIForFile &uri, // PDLDocument: Hover //===----------------------------------------------------------------------===// -std::optional -PDLDocument::findHover(const lsp::URIForFile &uri, - const lsp::Position &hoverPos) { +std::optional +PDLDocument::findHover(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &hoverPos) { SMLoc posLoc = hoverPos.getAsSMLoc(sourceMgr); // Check for a reference to an include. @@ -474,7 +474,7 @@ PDLDocument::findHover(const lsp::URIForFile &uri, return findHover(decl, hoverRange); } -std::optional PDLDocument::findHover(const ast::Decl *decl, +std::optional PDLDocument::findHover(const ast::Decl *decl, const SMRange &hoverRange) { // Add hover for variables. if (const auto *varDecl = dyn_cast(decl)) @@ -499,9 +499,9 @@ std::optional PDLDocument::findHover(const ast::Decl *decl, return std::nullopt; } -lsp::Hover PDLDocument::buildHoverForOpName(const ods::Operation *op, +llvm::lsp::Hover PDLDocument::buildHoverForOpName(const ods::Operation *op, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**OpName**: `" << op->getName() << "`\n***\n" @@ -511,9 +511,9 @@ lsp::Hover PDLDocument::buildHoverForOpName(const ods::Operation *op, return hover; } -lsp::Hover PDLDocument::buildHoverForVariable(const ast::VariableDecl *varDecl, +llvm::lsp::Hover PDLDocument::buildHoverForVariable(const ast::VariableDecl *varDecl, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**Variable**: `" << varDecl->getName().getName() << "`\n***\n" @@ -522,9 +522,9 @@ lsp::Hover PDLDocument::buildHoverForVariable(const ast::VariableDecl *varDecl, return hover; } -lsp::Hover PDLDocument::buildHoverForPattern(const ast::PatternDecl *decl, +llvm::lsp::Hover PDLDocument::buildHoverForPattern(const ast::PatternDecl *decl, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**Pattern**"; @@ -545,10 +545,10 @@ lsp::Hover PDLDocument::buildHoverForPattern(const ast::PatternDecl *decl, return hover; } -lsp::Hover +llvm::lsp::Hover PDLDocument::buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**Constraint**: `"; @@ -573,9 +573,9 @@ PDLDocument::buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, } template -lsp::Hover PDLDocument::buildHoverForUserConstraintOrRewrite( +llvm::lsp::Hover PDLDocument::buildHoverForUserConstraintOrRewrite( StringRef typeName, const T *decl, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**" << typeName << "**: `" << decl->getName().getName() @@ -617,7 +617,7 @@ lsp::Hover PDLDocument::buildHoverForUserConstraintOrRewrite( //===----------------------------------------------------------------------===// void PDLDocument::findDocumentSymbols( - std::vector &symbols) { + std::vector &symbols) { if (failed(astModule)) return; @@ -632,24 +632,24 @@ void PDLDocument::findDocumentSymbols( SMRange bodyLoc(nameLoc.Start, patternDecl->getBody()->getLoc().End); symbols.emplace_back( - name ? name->getName() : "", lsp::SymbolKind::Class, - lsp::Range(sourceMgr, bodyLoc), lsp::Range(sourceMgr, nameLoc)); + name ? name->getName() : "", llvm::lsp::SymbolKind::Class, + llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); } else if (const auto *cDecl = dyn_cast(decl)) { // TODO: Add source information for the code block body. SMRange nameLoc = cDecl->getName().getLoc(); SMRange bodyLoc = nameLoc; symbols.emplace_back( - cDecl->getName().getName(), lsp::SymbolKind::Function, - lsp::Range(sourceMgr, bodyLoc), lsp::Range(sourceMgr, nameLoc)); + cDecl->getName().getName(), llvm::lsp::SymbolKind::Function, + llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); } else if (const auto *cDecl = dyn_cast(decl)) { // TODO: Add source information for the code block body. SMRange nameLoc = cDecl->getName().getLoc(); SMRange bodyLoc = nameLoc; symbols.emplace_back( - cDecl->getName().getName(), lsp::SymbolKind::Function, - lsp::Range(sourceMgr, bodyLoc), lsp::Range(sourceMgr, nameLoc)); + cDecl->getName().getName(), llvm::lsp::SymbolKind::Function, + llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); } } } @@ -662,7 +662,7 @@ namespace { class LSPCodeCompleteContext : public CodeCompleteContext { public: LSPCodeCompleteContext(SMLoc completeLoc, llvm::SourceMgr &sourceMgr, - lsp::CompletionList &completionList, + llvm::lsp::CompletionList &completionList, ods::Context &odsContext, ArrayRef includeDirs) : CodeCompleteContext(completeLoc), sourceMgr(sourceMgr), @@ -674,13 +674,13 @@ class LSPCodeCompleteContext : public CodeCompleteContext { ArrayRef elementNames = tupleType.getElementNames(); for (unsigned i = 0, e = tupleType.size(); i < e; ++i) { // Push back a completion item that uses the result index. - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = llvm::formatv("{0} (field #{0})", i).str(); item.insertText = Twine(i).str(); item.filterText = item.sortText = item.insertText; - item.kind = lsp::CompletionItemKind::Field; + item.kind = llvm::lsp::CompletionItemKind::Field; item.detail = llvm::formatv("{0}: {1}", i, elementTypes[i]); - item.insertTextFormat = lsp::InsertTextFormat::PlainText; + item.insertTextFormat = llvm::lsp::InsertTextFormat::PlainText; completionList.items.emplace_back(item); // If the element has a name, push back a completion item with that name. @@ -705,11 +705,11 @@ class LSPCodeCompleteContext : public CodeCompleteContext { const ods::TypeConstraint &constraint = result.getConstraint(); // Push back a completion item that uses the result index. - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = llvm::formatv("{0} (field #{0})", it.index()).str(); item.insertText = Twine(it.index()).str(); item.filterText = item.sortText = item.insertText; - item.kind = lsp::CompletionItemKind::Field; + item.kind = llvm::lsp::CompletionItemKind::Field; switch (result.getVariableLengthKind()) { case ods::VariableLengthKind::Single: item.detail = llvm::formatv("{0}: Value", it.index()).str(); @@ -721,12 +721,12 @@ class LSPCodeCompleteContext : public CodeCompleteContext { item.detail = llvm::formatv("{0}: ValueRange", it.index()).str(); break; } - item.documentation = lsp::MarkupContent{ - lsp::MarkupKind::Markdown, + item.documentation = llvm::lsp::MarkupContent{ + llvm::lsp::MarkupKind::Markdown, llvm::formatv("{0}\n\n```c++\n{1}\n```\n", constraint.getSummary(), constraint.getCppClass()) .str()}; - item.insertTextFormat = lsp::InsertTextFormat::PlainText; + item.insertTextFormat = llvm::lsp::InsertTextFormat::PlainText; completionList.items.emplace_back(item); // If the result has a name, push back a completion item with the result @@ -750,16 +750,16 @@ class LSPCodeCompleteContext : public CodeCompleteContext { for (const ods::Attribute &attr : odsOp->getAttributes()) { const ods::AttributeConstraint &constraint = attr.getConstraint(); - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = attr.getName().str(); - item.kind = lsp::CompletionItemKind::Field; + item.kind = llvm::lsp::CompletionItemKind::Field; item.detail = attr.isOptional() ? "optional" : ""; - item.documentation = lsp::MarkupContent{ - lsp::MarkupKind::Markdown, + item.documentation = llvm::lsp::MarkupContent{ + llvm::lsp::MarkupKind::Markdown, llvm::formatv("{0}\n\n```c++\n{1}\n```\n", constraint.getSummary(), constraint.getCppClass()) .str()}; - item.insertTextFormat = lsp::InsertTextFormat::PlainText; + item.insertTextFormat = llvm::lsp::InsertTextFormat::PlainText; completionList.items.emplace_back(item); } } @@ -769,18 +769,18 @@ class LSPCodeCompleteContext : public CodeCompleteContext { const ast::DeclScope *scope) final { auto addCoreConstraint = [&](StringRef constraint, StringRef mlirType, StringRef snippetText = "") { - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = constraint.str(); - item.kind = lsp::CompletionItemKind::Class; + item.kind = llvm::lsp::CompletionItemKind::Class; item.detail = (constraint + " constraint").str(); - item.documentation = lsp::MarkupContent{ - lsp::MarkupKind::Markdown, + item.documentation = llvm::lsp::MarkupContent{ + llvm::lsp::MarkupKind::Markdown, ("A single entity core constraint of type `" + mlirType + "`").str()}; item.sortText = "0"; item.insertText = snippetText.str(); item.insertTextFormat = snippetText.empty() - ? lsp::InsertTextFormat::PlainText - : lsp::InsertTextFormat::Snippet; + ? llvm::lsp::InsertTextFormat::PlainText + : llvm::lsp::InsertTextFormat::Snippet; completionList.items.emplace_back(item); }; @@ -812,9 +812,9 @@ class LSPCodeCompleteContext : public CodeCompleteContext { while (scope) { for (const ast::Decl *decl : scope->getDecls()) { if (const auto *cst = dyn_cast(decl)) { - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = cst->getName().getName().str(); - item.kind = lsp::CompletionItemKind::Interface; + item.kind = llvm::lsp::CompletionItemKind::Interface; item.sortText = "2_" + item.label; // Skip constraints that are not single-arg. We currently only @@ -842,7 +842,7 @@ class LSPCodeCompleteContext : public CodeCompleteContext { if (std::optional doc = getDocumentationFor(sourceMgr, cst)) { item.documentation = - lsp::MarkupContent{lsp::MarkupKind::Markdown, std::move(*doc)}; + llvm::lsp::MarkupContent{llvm::lsp::MarkupKind::Markdown, std::move(*doc)}; } completionList.items.emplace_back(item); @@ -856,10 +856,10 @@ class LSPCodeCompleteContext : public CodeCompleteContext { void codeCompleteDialectName() final { // Code complete known dialects. for (const ods::Dialect &dialect : odsContext.getDialects()) { - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = dialect.getName().str(); - item.kind = lsp::CompletionItemKind::Class; - item.insertTextFormat = lsp::InsertTextFormat::PlainText; + item.kind = llvm::lsp::CompletionItemKind::Class; + item.insertTextFormat = llvm::lsp::InsertTextFormat::PlainText; completionList.items.emplace_back(item); } } @@ -872,10 +872,10 @@ class LSPCodeCompleteContext : public CodeCompleteContext { for (const auto &it : dialect->getOperations()) { const ods::Operation &op = *it.second; - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = op.getName().drop_front(dialectName.size() + 1).str(); - item.kind = lsp::CompletionItemKind::Field; - item.insertTextFormat = lsp::InsertTextFormat::PlainText; + item.kind = llvm::lsp::CompletionItemKind::Field; + item.insertTextFormat = llvm::lsp::InsertTextFormat::PlainText; completionList.items.emplace_back(item); } } @@ -883,16 +883,16 @@ class LSPCodeCompleteContext : public CodeCompleteContext { void codeCompletePatternMetadata() final { auto addSimpleConstraint = [&](StringRef constraint, StringRef desc, StringRef snippetText = "") { - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = constraint.str(); - item.kind = lsp::CompletionItemKind::Class; + item.kind = llvm::lsp::CompletionItemKind::Class; item.detail = "pattern metadata"; item.documentation = - lsp::MarkupContent{lsp::MarkupKind::Markdown, desc.str()}; + llvm::lsp::MarkupContent{llvm::lsp::MarkupKind::Markdown, desc.str()}; item.insertText = snippetText.str(); item.insertTextFormat = snippetText.empty() - ? lsp::InsertTextFormat::PlainText - : lsp::InsertTextFormat::Snippet; + ? llvm::lsp::InsertTextFormat::PlainText + : llvm::lsp::InsertTextFormat::Snippet; completionList.items.emplace_back(item); }; @@ -913,10 +913,10 @@ class LSPCodeCompleteContext : public CodeCompleteContext { // Functor used to add a single include completion item. auto addIncludeCompletion = [&](StringRef path, bool isDirectory) { - lsp::CompletionItem item; + llvm::lsp::CompletionItem item; item.label = path.str(); - item.kind = isDirectory ? lsp::CompletionItemKind::Folder - : lsp::CompletionItemKind::File; + item.kind = isDirectory ? llvm::lsp::CompletionItemKind::Folder + : llvm::lsp::CompletionItemKind::File; if (seenResults.insert(item.label).second) completionList.items.emplace_back(item); }; @@ -961,31 +961,31 @@ class LSPCodeCompleteContext : public CodeCompleteContext { // Sort the completion results to make sure the output is deterministic in // the face of different iteration schemes for different platforms. - llvm::sort(completionList.items, [](const lsp::CompletionItem &lhs, - const lsp::CompletionItem &rhs) { + llvm::sort(completionList.items, [](const llvm::lsp::CompletionItem &lhs, + const llvm::lsp::CompletionItem &rhs) { return lhs.label < rhs.label; }); } private: llvm::SourceMgr &sourceMgr; - lsp::CompletionList &completionList; + llvm::lsp::CompletionList &completionList; ods::Context &odsContext; ArrayRef includeDirs; }; } // namespace -lsp::CompletionList -PDLDocument::getCodeCompletion(const lsp::URIForFile &uri, - const lsp::Position &completePos) { +llvm::lsp::CompletionList +PDLDocument::getCodeCompletion(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &completePos) { SMLoc posLoc = completePos.getAsSMLoc(sourceMgr); if (!posLoc.isValid()) - return lsp::CompletionList(); + return llvm::lsp::CompletionList(); // To perform code completion, we run another parse of the module with the // code completion context provided. ods::Context tmpODSContext; - lsp::CompletionList completionList; + llvm::lsp::CompletionList completionList; LSPCodeCompleteContext lspCompleteContext(posLoc, sourceMgr, completionList, tmpODSContext, sourceMgr.getIncludeDirs()); @@ -1005,7 +1005,7 @@ namespace { class LSPSignatureHelpContext : public CodeCompleteContext { public: LSPSignatureHelpContext(SMLoc completeLoc, llvm::SourceMgr &sourceMgr, - lsp::SignatureHelp &signatureHelp, + llvm::lsp::SignatureHelp &signatureHelp, ods::Context &odsContext) : CodeCompleteContext(completeLoc), sourceMgr(sourceMgr), signatureHelp(signatureHelp), odsContext(odsContext) {} @@ -1014,7 +1014,7 @@ class LSPSignatureHelpContext : public CodeCompleteContext { unsigned currentNumArgs) final { signatureHelp.activeParameter = currentNumArgs; - lsp::SignatureInformation signatureInfo; + llvm::lsp::SignatureInformation signatureInfo; { llvm::raw_string_ostream strOS(signatureInfo.label); strOS << callable->getName()->getName() << "("; @@ -1022,7 +1022,7 @@ class LSPSignatureHelpContext : public CodeCompleteContext { unsigned paramStart = strOS.str().size(); strOS << var->getName().getName() << ": " << var->getType(); unsigned paramEnd = strOS.str().size(); - signatureInfo.parameters.emplace_back(lsp::ParameterInformation{ + signatureInfo.parameters.emplace_back(llvm::lsp::ParameterInformation{ StringRef(strOS.str()).slice(paramStart, paramEnd).str(), std::make_pair(paramStart, paramEnd), /*paramDoc*/ std::string()}); }; @@ -1070,7 +1070,7 @@ class LSPSignatureHelpContext : public CodeCompleteContext { // not more than what is defined in ODS, as this will result in an error // anyways. if (odsOp && currentValue < values.size()) { - lsp::SignatureInformation signatureInfo; + llvm::lsp::SignatureInformation signatureInfo; // Build the signature label. { @@ -1099,7 +1099,7 @@ class LSPSignatureHelpContext : public CodeCompleteContext { } unsigned paramEnd = strOS.str().size(); - signatureInfo.parameters.emplace_back(lsp::ParameterInformation{ + signatureInfo.parameters.emplace_back(llvm::lsp::ParameterInformation{ StringRef(strOS.str()).slice(paramStart, paramEnd).str(), std::make_pair(paramStart, paramEnd), paramDoc}); }; @@ -1114,12 +1114,12 @@ class LSPSignatureHelpContext : public CodeCompleteContext { // If there aren't any arguments yet, we also add the generic signature. if (currentValue == 0 && (!odsOp || !values.empty())) { - lsp::SignatureInformation signatureInfo; + llvm::lsp::SignatureInformation signatureInfo; signatureInfo.label = llvm::formatv("(<{0}s>: {1}Range)", label, dataType).str(); signatureInfo.documentation = ("Generic operation " + label + " specification").str(); - signatureInfo.parameters.emplace_back(lsp::ParameterInformation{ + signatureInfo.parameters.emplace_back(llvm::lsp::ParameterInformation{ StringRef(signatureInfo.label).drop_front().drop_back().str(), std::pair(1, signatureInfo.label.size() - 1), ("All of the " + label + "s of the operation.").str()}); @@ -1129,21 +1129,21 @@ class LSPSignatureHelpContext : public CodeCompleteContext { private: llvm::SourceMgr &sourceMgr; - lsp::SignatureHelp &signatureHelp; + llvm::lsp::SignatureHelp &signatureHelp; ods::Context &odsContext; }; } // namespace -lsp::SignatureHelp PDLDocument::getSignatureHelp(const lsp::URIForFile &uri, - const lsp::Position &helpPos) { +llvm::lsp::SignatureHelp PDLDocument::getSignatureHelp(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &helpPos) { SMLoc posLoc = helpPos.getAsSMLoc(sourceMgr); if (!posLoc.isValid()) - return lsp::SignatureHelp(); + return llvm::lsp::SignatureHelp(); // To perform code completion, we run another parse of the module with the // code completion context provided. ods::Context tmpODSContext; - lsp::SignatureHelp signatureHelp; + llvm::lsp::SignatureHelp signatureHelp; LSPSignatureHelpContext completeContext(posLoc, sourceMgr, signatureHelp, tmpODSContext); @@ -1173,9 +1173,9 @@ static bool shouldAddHintFor(const ast::Expr *expr, StringRef name) { return true; } -void PDLDocument::getInlayHints(const lsp::URIForFile &uri, - const lsp::Range &range, - std::vector &inlayHints) { +void PDLDocument::getInlayHints(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Range &range, + std::vector &inlayHints) { if (failed(astModule)) return; SMRange rangeLoc = range.getAsSMRange(sourceMgr); @@ -1199,8 +1199,8 @@ void PDLDocument::getInlayHints(const lsp::URIForFile &uri, } void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, - const lsp::URIForFile &uri, - std::vector &inlayHints) { + const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Check to see if the variable has a constraint list, if it does we don't // provide initializer hints. if (!decl->getConstraints().empty()) @@ -1215,8 +1215,8 @@ void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, return; } - lsp::InlayHint hint(lsp::InlayHintKind::Type, - lsp::Position(sourceMgr, decl->getLoc().End)); + llvm::lsp::InlayHint hint(llvm::lsp::InlayHintKind::Type, + llvm::lsp::Position(sourceMgr, decl->getLoc().End)); { llvm::raw_string_ostream labelOS(hint.label); labelOS << ": " << decl->getType(); @@ -1226,8 +1226,8 @@ void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, } void PDLDocument::getInlayHintsFor(const ast::CallExpr *expr, - const lsp::URIForFile &uri, - std::vector &inlayHints) { + const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Try to extract the callable of this call. const auto *callableRef = dyn_cast(expr->getCallableExpr()); const auto *callable = @@ -1243,8 +1243,8 @@ void PDLDocument::getInlayHintsFor(const ast::CallExpr *expr, } void PDLDocument::getInlayHintsFor(const ast::OperationExpr *expr, - const lsp::URIForFile &uri, - std::vector &inlayHints) { + const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Check for ODS information. ast::OperationType opType = dyn_cast(expr->getType()); const auto *odsOp = opType ? opType.getODSOperation() : nullptr; @@ -1290,13 +1290,13 @@ void PDLDocument::getInlayHintsFor(const ast::OperationExpr *expr, "results"); } -void PDLDocument::addParameterHintFor(std::vector &inlayHints, +void PDLDocument::addParameterHintFor(std::vector &inlayHints, const ast::Expr *expr, StringRef label) { if (!shouldAddHintFor(expr, label)) return; - lsp::InlayHint hint(lsp::InlayHintKind::Parameter, - lsp::Position(sourceMgr, expr->getLoc().Start)); + llvm::lsp::InlayHint hint(llvm::lsp::InlayHintKind::Parameter, + llvm::lsp::Position(sourceMgr, expr->getLoc().Start)); hint.label = (label + ":").str(); hint.paddingRight = true; inlayHints.emplace_back(std::move(hint)); @@ -1342,22 +1342,22 @@ void PDLDocument::getPDLLViewOutput(raw_ostream &os, namespace { /// This class represents a single chunk of an PDL text file. struct PDLTextFileChunk { - PDLTextFileChunk(uint64_t lineOffset, const lsp::URIForFile &uri, + PDLTextFileChunk(uint64_t lineOffset, const llvm::lsp::URIForFile &uri, StringRef contents, const std::vector &extraDirs, - std::vector &diagnostics) + std::vector &diagnostics) : lineOffset(lineOffset), document(uri, contents, extraDirs, diagnostics) {} /// Adjust the line number of the given range to anchor at the beginning of /// the file, instead of the beginning of this chunk. - void adjustLocForChunkOffset(lsp::Range &range) { + void adjustLocForChunkOffset(llvm::lsp::Range &range) { adjustLocForChunkOffset(range.start); adjustLocForChunkOffset(range.end); } /// Adjust the line number of the given position to anchor at the beginning of /// the file, instead of the beginning of this chunk. - void adjustLocForChunkOffset(lsp::Position &pos) { pos.line += lineOffset; } + void adjustLocForChunkOffset(llvm::lsp::Position &pos) { pos.line += lineOffset; } /// The line offset of this chunk from the beginning of the file. uint64_t lineOffset; @@ -1374,38 +1374,38 @@ namespace { /// This class represents a text file containing one or more PDL documents. class PDLTextFile { public: - PDLTextFile(const lsp::URIForFile &uri, StringRef fileContents, + PDLTextFile(const llvm::lsp::URIForFile &uri, StringRef fileContents, int64_t version, const std::vector &extraDirs, - std::vector &diagnostics); + std::vector &diagnostics); /// Return the current version of this text file. int64_t getVersion() const { return version; } /// Update the file to the new version using the provided set of content /// changes. Returns failure if the update was unsuccessful. - LogicalResult update(const lsp::URIForFile &uri, int64_t newVersion, - ArrayRef changes, - std::vector &diagnostics); + LogicalResult update(const llvm::lsp::URIForFile &uri, int64_t newVersion, + ArrayRef changes, + std::vector &diagnostics); //===--------------------------------------------------------------------===// // LSP Queries //===--------------------------------------------------------------------===// - void getLocationsOf(const lsp::URIForFile &uri, lsp::Position defPos, - std::vector &locations); - void findReferencesOf(const lsp::URIForFile &uri, lsp::Position pos, - std::vector &references); - void getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links); - std::optional findHover(const lsp::URIForFile &uri, - lsp::Position hoverPos); - void findDocumentSymbols(std::vector &symbols); - lsp::CompletionList getCodeCompletion(const lsp::URIForFile &uri, - lsp::Position completePos); - lsp::SignatureHelp getSignatureHelp(const lsp::URIForFile &uri, - lsp::Position helpPos); - void getInlayHints(const lsp::URIForFile &uri, lsp::Range range, - std::vector &inlayHints); + void getLocationsOf(const llvm::lsp::URIForFile &uri, llvm::lsp::Position defPos, + std::vector &locations); + void findReferencesOf(const llvm::lsp::URIForFile &uri, llvm::lsp::Position pos, + std::vector &references); + void getDocumentLinks(const llvm::lsp::URIForFile &uri, + std::vector &links); + std::optional findHover(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position hoverPos); + void findDocumentSymbols(std::vector &symbols); + llvm::lsp::CompletionList getCodeCompletion(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position completePos); + llvm::lsp::SignatureHelp getSignatureHelp(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position helpPos); + void getInlayHints(const llvm::lsp::URIForFile &uri, llvm::lsp::Range range, + std::vector &inlayHints); lsp::PDLLViewOutputResult getPDLLViewOutput(lsp::PDLLViewOutputKind kind); private: @@ -1413,14 +1413,14 @@ class PDLTextFile { std::vector>::iterator>; /// Initialize the text file from the given file contents. - void initialize(const lsp::URIForFile &uri, int64_t newVersion, - std::vector &diagnostics); + void initialize(const llvm::lsp::URIForFile &uri, int64_t newVersion, + std::vector &diagnostics); /// Find the PDL document that contains the given position, and update the /// position to be anchored at the start of the found chunk instead of the /// beginning of the file. - ChunkIterator getChunkItFor(lsp::Position &pos); - PDLTextFileChunk &getChunkFor(lsp::Position &pos) { + ChunkIterator getChunkItFor(llvm::lsp::Position &pos); + PDLTextFileChunk &getChunkFor(llvm::lsp::Position &pos) { return *getChunkItFor(pos); } @@ -1442,20 +1442,20 @@ class PDLTextFile { }; } // namespace -PDLTextFile::PDLTextFile(const lsp::URIForFile &uri, StringRef fileContents, +PDLTextFile::PDLTextFile(const llvm::lsp::URIForFile &uri, StringRef fileContents, int64_t version, const std::vector &extraDirs, - std::vector &diagnostics) + std::vector &diagnostics) : contents(fileContents.str()), extraIncludeDirs(extraDirs) { initialize(uri, version, diagnostics); } LogicalResult -PDLTextFile::update(const lsp::URIForFile &uri, int64_t newVersion, - ArrayRef changes, - std::vector &diagnostics) { - if (failed(lsp::TextDocumentContentChangeEvent::applyTo(changes, contents))) { - lsp::Logger::error("Failed to update contents of {0}", uri.file()); +PDLTextFile::update(const llvm::lsp::URIForFile &uri, int64_t newVersion, + ArrayRef changes, + std::vector &diagnostics) { + if (failed(llvm::lsp::TextDocumentContentChangeEvent::applyTo(changes, contents))) { + llvm::lsp::Logger::error("Failed to update contents of {0}", uri.file()); return failure(); } @@ -1464,36 +1464,36 @@ PDLTextFile::update(const lsp::URIForFile &uri, int64_t newVersion, return success(); } -void PDLTextFile::getLocationsOf(const lsp::URIForFile &uri, - lsp::Position defPos, - std::vector &locations) { +void PDLTextFile::getLocationsOf(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position defPos, + std::vector &locations) { PDLTextFileChunk &chunk = getChunkFor(defPos); chunk.document.getLocationsOf(uri, defPos, locations); // Adjust any locations within this file for the offset of this chunk. if (chunk.lineOffset == 0) return; - for (lsp::Location &loc : locations) + for (llvm::lsp::Location &loc : locations) if (loc.uri == uri) chunk.adjustLocForChunkOffset(loc.range); } -void PDLTextFile::findReferencesOf(const lsp::URIForFile &uri, - lsp::Position pos, - std::vector &references) { +void PDLTextFile::findReferencesOf(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position pos, + std::vector &references) { PDLTextFileChunk &chunk = getChunkFor(pos); chunk.document.findReferencesOf(uri, pos, references); // Adjust any locations within this file for the offset of this chunk. if (chunk.lineOffset == 0) return; - for (lsp::Location &loc : references) + for (llvm::lsp::Location &loc : references) if (loc.uri == uri) chunk.adjustLocForChunkOffset(loc.range); } -void PDLTextFile::getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links) { +void PDLTextFile::getDocumentLinks(const llvm::lsp::URIForFile &uri, + std::vector &links) { chunks.front()->document.getDocumentLinks(uri, links); for (const auto &it : llvm::drop_begin(chunks)) { size_t currentNumLinks = links.size(); @@ -1506,10 +1506,10 @@ void PDLTextFile::getDocumentLinks(const lsp::URIForFile &uri, } } -std::optional PDLTextFile::findHover(const lsp::URIForFile &uri, - lsp::Position hoverPos) { +std::optional PDLTextFile::findHover(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position hoverPos) { PDLTextFileChunk &chunk = getChunkFor(hoverPos); - std::optional hoverInfo = chunk.document.findHover(uri, hoverPos); + std::optional hoverInfo = chunk.document.findHover(uri, hoverPos); // Adjust any locations within this file for the offset of this chunk. if (chunk.lineOffset != 0 && hoverInfo && hoverInfo->range) @@ -1518,7 +1518,7 @@ std::optional PDLTextFile::findHover(const lsp::URIForFile &uri, } void PDLTextFile::findDocumentSymbols( - std::vector &symbols) { + std::vector &symbols) { if (chunks.size() == 1) return chunks.front()->document.findDocumentSymbols(symbols); @@ -1526,27 +1526,27 @@ void PDLTextFile::findDocumentSymbols( // each chunk. for (unsigned i = 0, e = chunks.size(); i < e; ++i) { PDLTextFileChunk &chunk = *chunks[i]; - lsp::Position startPos(chunk.lineOffset); - lsp::Position endPos((i == e - 1) ? totalNumLines - 1 + llvm::lsp::Position startPos(chunk.lineOffset); + llvm::lsp::Position endPos((i == e - 1) ? totalNumLines - 1 : chunks[i + 1]->lineOffset); - lsp::DocumentSymbol symbol("", - lsp::SymbolKind::Namespace, - /*range=*/lsp::Range(startPos, endPos), - /*selectionRange=*/lsp::Range(startPos)); + llvm::lsp::DocumentSymbol symbol("", + llvm::lsp::SymbolKind::Namespace, + /*range=*/llvm::lsp::Range(startPos, endPos), + /*selectionRange=*/llvm::lsp::Range(startPos)); chunk.document.findDocumentSymbols(symbol.children); // Fixup the locations of document symbols within this chunk. if (i != 0) { - SmallVector symbolsToFix; - for (lsp::DocumentSymbol &childSymbol : symbol.children) + SmallVector symbolsToFix; + for (llvm::lsp::DocumentSymbol &childSymbol : symbol.children) symbolsToFix.push_back(&childSymbol); while (!symbolsToFix.empty()) { - lsp::DocumentSymbol *symbol = symbolsToFix.pop_back_val(); + llvm::lsp::DocumentSymbol *symbol = symbolsToFix.pop_back_val(); chunk.adjustLocForChunkOffset(symbol->range); chunk.adjustLocForChunkOffset(symbol->selectionRange); - for (lsp::DocumentSymbol &childSymbol : symbol->children) + for (llvm::lsp::DocumentSymbol &childSymbol : symbol->children) symbolsToFix.push_back(&childSymbol); } } @@ -1556,34 +1556,34 @@ void PDLTextFile::findDocumentSymbols( } } -lsp::CompletionList PDLTextFile::getCodeCompletion(const lsp::URIForFile &uri, - lsp::Position completePos) { +llvm::lsp::CompletionList PDLTextFile::getCodeCompletion(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position completePos) { PDLTextFileChunk &chunk = getChunkFor(completePos); - lsp::CompletionList completionList = + llvm::lsp::CompletionList completionList = chunk.document.getCodeCompletion(uri, completePos); // Adjust any completion locations. - for (lsp::CompletionItem &item : completionList.items) { + for (llvm::lsp::CompletionItem &item : completionList.items) { if (item.textEdit) chunk.adjustLocForChunkOffset(item.textEdit->range); - for (lsp::TextEdit &edit : item.additionalTextEdits) + for (llvm::lsp::TextEdit &edit : item.additionalTextEdits) chunk.adjustLocForChunkOffset(edit.range); } return completionList; } -lsp::SignatureHelp PDLTextFile::getSignatureHelp(const lsp::URIForFile &uri, - lsp::Position helpPos) { +llvm::lsp::SignatureHelp PDLTextFile::getSignatureHelp(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position helpPos) { return getChunkFor(helpPos).document.getSignatureHelp(uri, helpPos); } -void PDLTextFile::getInlayHints(const lsp::URIForFile &uri, lsp::Range range, - std::vector &inlayHints) { +void PDLTextFile::getInlayHints(const llvm::lsp::URIForFile &uri, llvm::lsp::Range range, + std::vector &inlayHints) { auto startIt = getChunkItFor(range.start); auto endIt = getChunkItFor(range.end); // Functor used to get the chunks for a given file, and fixup any locations - auto getHintsForChunk = [&](ChunkIterator chunkIt, lsp::Range range) { + auto getHintsForChunk = [&](ChunkIterator chunkIt, llvm::lsp::Range range) { size_t currentNumHints = inlayHints.size(); chunkIt->document.getInlayHints(uri, range, inlayHints); @@ -1605,15 +1605,15 @@ void PDLTextFile::getInlayHints(const lsp::URIForFile &uri, lsp::Range range, // Otherwise, the range is split between multiple chunks. The first chunk // has the correct range start, but covers the total document. - getHintsForChunk(startIt, lsp::Range(range.start, getNumLines(startIt))); + getHintsForChunk(startIt, llvm::lsp::Range(range.start, getNumLines(startIt))); // Every chunk in between uses the full document. for (++startIt; startIt != endIt; ++startIt) - getHintsForChunk(startIt, lsp::Range(0, getNumLines(startIt))); + getHintsForChunk(startIt, llvm::lsp::Range(0, getNumLines(startIt))); // The range for the last chunk starts at the beginning of the document, up // through the end of the input range. - getHintsForChunk(startIt, lsp::Range(0, range.end)); + getHintsForChunk(startIt, llvm::lsp::Range(0, range.end)); } lsp::PDLLViewOutputResult @@ -1632,8 +1632,8 @@ PDLTextFile::getPDLLViewOutput(lsp::PDLLViewOutputKind kind) { return result; } -void PDLTextFile::initialize(const lsp::URIForFile &uri, int64_t newVersion, - std::vector &diagnostics) { +void PDLTextFile::initialize(const llvm::lsp::URIForFile &uri, int64_t newVersion, + std::vector &diagnostics) { version = newVersion; chunks.clear(); @@ -1653,7 +1653,7 @@ void PDLTextFile::initialize(const lsp::URIForFile &uri, int64_t newVersion, // Adjust locations used in diagnostics to account for the offset from the // beginning of the file. - for (lsp::Diagnostic &diag : + for (llvm::lsp::Diagnostic &diag : llvm::drop_begin(diagnostics, currentNumDiags)) { chunk->adjustLocForChunkOffset(diag.range); @@ -1668,14 +1668,14 @@ void PDLTextFile::initialize(const lsp::URIForFile &uri, int64_t newVersion, totalNumLines = lineOffset; } -PDLTextFile::ChunkIterator PDLTextFile::getChunkItFor(lsp::Position &pos) { +PDLTextFile::ChunkIterator PDLTextFile::getChunkItFor(llvm::lsp::Position &pos) { if (chunks.size() == 1) return chunks.begin(); // Search for the first chunk with a greater line offset, the previous chunk // is the one that contains `pos`. auto it = llvm::upper_bound( - chunks, pos, [](const lsp::Position &pos, const auto &chunk) { + chunks, pos, [](const llvm::lsp::Position &pos, const auto &chunk) { return static_cast(pos.line) < chunk->lineOffset; }); ChunkIterator chunkIt(it == chunks.end() ? (chunks.end() - 1) : --it); @@ -1769,7 +1769,7 @@ void lsp::PDLLServer::getDocumentLinks( return fileIt->second->getDocumentLinks(uri, documentLinks); } -std::optional lsp::PDLLServer::findHover(const URIForFile &uri, +std::optional lsp::PDLLServer::findHover(const URIForFile &uri, const Position &hoverPos) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) @@ -1793,7 +1793,7 @@ lsp::PDLLServer::getCodeCompletion(const URIForFile &uri, return CompletionList(); } -lsp::SignatureHelp lsp::PDLLServer::getSignatureHelp(const URIForFile &uri, +llvm::lsp::SignatureHelp lsp::PDLLServer::getSignatureHelp(const URIForFile &uri, const Position &helpPos) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) diff --git a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp index 015d185a7d667..95a457f3144c5 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/LSPServer.cpp @@ -16,7 +16,25 @@ using namespace mlir; using namespace mlir::lsp; -using namespace llvm::lsp; + +using llvm::lsp::Callback; +using llvm::lsp::DidChangeTextDocumentParams; +using llvm::lsp::DidCloseTextDocumentParams; +using llvm::lsp::DidOpenTextDocumentParams; +using llvm::lsp::DocumentLinkParams; +using llvm::lsp::Hover; +using llvm::lsp::InitializedParams; +using llvm::lsp::InitializeParams; +using llvm::lsp::JSONTransport; +using llvm::lsp::Location; +using llvm::lsp::Logger; +using llvm::lsp::MessageHandler; +using llvm::lsp::NoParams; +using llvm::lsp::OutgoingNotification; +using llvm::lsp::PublishDiagnosticsParams; +using llvm::lsp::ReferenceParams; +using llvm::lsp::TextDocumentPositionParams; +using llvm::lsp::TextDocumentSyncKind; //===----------------------------------------------------------------------===// // LSPServer diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp b/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp index b581acbaa6e5b..8014b8d6dba4a 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenLspServerMain.cpp @@ -17,6 +17,10 @@ using namespace mlir; using namespace mlir::lsp; +using llvm::lsp::JSONStreamStyle; +using llvm::lsp::JSONTransport; +using llvm::lsp::Logger; + LogicalResult mlir::TableGenLspServerMain(int argc, char **argv) { llvm::cl::opt inputStyle{ "input-style", diff --git a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp index 8cdb73e26cd39..3080b78f187b1 100644 --- a/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp +++ b/mlir/lib/Tools/tblgen-lsp-server/TableGenServer.cpp @@ -36,45 +36,49 @@ static SMRange convertTokenLocToRange(SMLoc loc) { /// Returns a language server uri for the given source location. `mainFileURI` /// corresponds to the uri for the main file of the source manager. -static lsp::URIForFile getURIFromLoc(const SourceMgr &mgr, SMLoc loc, - const lsp::URIForFile &mainFileURI) { +static llvm::lsp::URIForFile +getURIFromLoc(const SourceMgr &mgr, SMLoc loc, + const llvm::lsp::URIForFile &mainFileURI) { int bufferId = mgr.FindBufferContainingLoc(loc); if (bufferId == 0 || bufferId == static_cast(mgr.getMainFileID())) return mainFileURI; - llvm::Expected fileForLoc = lsp::URIForFile::fromFile( - mgr.getBufferInfo(bufferId).Buffer->getBufferIdentifier()); + llvm::Expected fileForLoc = + llvm::lsp::URIForFile::fromFile( + mgr.getBufferInfo(bufferId).Buffer->getBufferIdentifier()); if (fileForLoc) return *fileForLoc; - lsp::Logger::error("Failed to create URI for include file: {0}", - llvm::toString(fileForLoc.takeError())); + llvm::lsp::Logger::error("Failed to create URI for include file: {0}", + llvm::toString(fileForLoc.takeError())); return mainFileURI; } /// Returns a language server location from the given source range. -static lsp::Location getLocationFromLoc(SourceMgr &mgr, SMRange loc, - const lsp::URIForFile &uri) { - return lsp::Location(getURIFromLoc(mgr, loc.Start, uri), - lsp::Range(mgr, loc)); +static llvm::lsp::Location +getLocationFromLoc(SourceMgr &mgr, SMRange loc, + const llvm::lsp::URIForFile &uri) { + return llvm::lsp::Location(getURIFromLoc(mgr, loc.Start, uri), + llvm::lsp::Range(mgr, loc)); } -static lsp::Location getLocationFromLoc(SourceMgr &mgr, SMLoc loc, - const lsp::URIForFile &uri) { +static llvm::lsp::Location +getLocationFromLoc(SourceMgr &mgr, SMLoc loc, + const llvm::lsp::URIForFile &uri) { return getLocationFromLoc(mgr, convertTokenLocToRange(loc), uri); } /// Convert the given TableGen diagnostic to the LSP form. -static std::optional +static std::optional getLspDiagnoticFromDiag(const llvm::SMDiagnostic &diag, - const lsp::URIForFile &uri) { + const llvm::lsp::URIForFile &uri) { auto *sourceMgr = const_cast(diag.getSourceMgr()); if (!sourceMgr || !diag.getLoc().isValid()) return std::nullopt; - lsp::Diagnostic lspDiag; + llvm::lsp::Diagnostic lspDiag; lspDiag.source = "tablegen"; lspDiag.category = "Parse Error"; // Try to grab a file location for this diagnostic. - lsp::Location loc = getLocationFromLoc(*sourceMgr, diag.getLoc(), uri); + llvm::lsp::Location loc = getLocationFromLoc(*sourceMgr, diag.getLoc(), uri); lspDiag.range = loc.range; // Skip diagnostics that weren't emitted within the main file. @@ -84,17 +88,17 @@ getLspDiagnoticFromDiag(const llvm::SMDiagnostic &diag, // Convert the severity for the diagnostic. switch (diag.getKind()) { case SourceMgr::DK_Warning: - lspDiag.severity = lsp::DiagnosticSeverity::Warning; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Warning; break; case SourceMgr::DK_Error: - lspDiag.severity = lsp::DiagnosticSeverity::Error; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Error; break; case SourceMgr::DK_Note: // Notes are emitted separately from the main diagnostic, so we just treat // them as remarks given that we can't determine the diagnostic to relate // them to. case SourceMgr::DK_Remark: - lspDiag.severity = lsp::DiagnosticSeverity::Information; + lspDiag.severity = llvm::lsp::DiagnosticSeverity::Information; break; } lspDiag.message = diag.getMessage().str(); @@ -322,54 +326,59 @@ namespace { /// This class represents a text file containing one or more TableGen documents. class TableGenTextFile { public: - TableGenTextFile(const lsp::URIForFile &uri, StringRef fileContents, + TableGenTextFile(const llvm::lsp::URIForFile &uri, StringRef fileContents, int64_t version, const std::vector &extraIncludeDirs, - std::vector &diagnostics); + std::vector &diagnostics); /// Return the current version of this text file. int64_t getVersion() const { return version; } /// Update the file to the new version using the provided set of content /// changes. Returns failure if the update was unsuccessful. - LogicalResult update(const lsp::URIForFile &uri, int64_t newVersion, - ArrayRef changes, - std::vector &diagnostics); + LogicalResult + update(const llvm::lsp::URIForFile &uri, int64_t newVersion, + ArrayRef changes, + std::vector &diagnostics); //===--------------------------------------------------------------------===// // Definitions and References //===--------------------------------------------------------------------===// - void getLocationsOf(const lsp::URIForFile &uri, const lsp::Position &defPos, - std::vector &locations); - void findReferencesOf(const lsp::URIForFile &uri, const lsp::Position &pos, - std::vector &references); + void getLocationsOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &defPos, + std::vector &locations); + void findReferencesOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &pos, + std::vector &references); //===--------------------------------------------------------------------===// // Document Links //===--------------------------------------------------------------------===// - void getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links); + void getDocumentLinks(const llvm::lsp::URIForFile &uri, + std::vector &links); //===--------------------------------------------------------------------===// // Hover //===--------------------------------------------------------------------===// - std::optional findHover(const lsp::URIForFile &uri, - const lsp::Position &hoverPos); - lsp::Hover buildHoverForRecord(const Record *record, - const SMRange &hoverRange); - lsp::Hover buildHoverForTemplateArg(const Record *record, + std::optional + findHover(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &hoverPos); + llvm::lsp::Hover buildHoverForRecord(const Record *record, + const SMRange &hoverRange); + llvm::lsp::Hover buildHoverForTemplateArg(const Record *record, + const RecordVal *value, + const SMRange &hoverRange); + llvm::lsp::Hover buildHoverForField(const Record *record, const RecordVal *value, const SMRange &hoverRange); - lsp::Hover buildHoverForField(const Record *record, const RecordVal *value, - const SMRange &hoverRange); private: /// Initialize the text file from the given file contents. - void initialize(const lsp::URIForFile &uri, int64_t newVersion, - std::vector &diagnostics); + void initialize(const llvm::lsp::URIForFile &uri, int64_t newVersion, + std::vector &diagnostics); /// The full string contents of the file. std::string contents; @@ -395,9 +404,9 @@ class TableGenTextFile { } // namespace TableGenTextFile::TableGenTextFile( - const lsp::URIForFile &uri, StringRef fileContents, int64_t version, + const llvm::lsp::URIForFile &uri, StringRef fileContents, int64_t version, const std::vector &extraIncludeDirs, - std::vector &diagnostics) + std::vector &diagnostics) : contents(fileContents.str()), version(version) { // Build the set of include directories for this file. llvm::SmallString<32> uriDirectory(uri.file()); @@ -409,12 +418,13 @@ TableGenTextFile::TableGenTextFile( initialize(uri, version, diagnostics); } -LogicalResult -TableGenTextFile::update(const lsp::URIForFile &uri, int64_t newVersion, - ArrayRef changes, - std::vector &diagnostics) { - if (failed(lsp::TextDocumentContentChangeEvent::applyTo(changes, contents))) { - lsp::Logger::error("Failed to update contents of {0}", uri.file()); +LogicalResult TableGenTextFile::update( + const llvm::lsp::URIForFile &uri, int64_t newVersion, + ArrayRef changes, + std::vector &diagnostics) { + if (failed(llvm::lsp::TextDocumentContentChangeEvent::applyTo(changes, + contents))) { + llvm::lsp::Logger::error("Failed to update contents of {0}", uri.file()); return failure(); } @@ -423,9 +433,9 @@ TableGenTextFile::update(const lsp::URIForFile &uri, int64_t newVersion, return success(); } -void TableGenTextFile::initialize(const lsp::URIForFile &uri, - int64_t newVersion, - std::vector &diagnostics) { +void TableGenTextFile::initialize( + const llvm::lsp::URIForFile &uri, int64_t newVersion, + std::vector &diagnostics) { version = newVersion; sourceMgr = SourceMgr(); recordKeeper = std::make_unique(); @@ -433,7 +443,8 @@ void TableGenTextFile::initialize(const lsp::URIForFile &uri, // Build a buffer for this file. auto memBuffer = llvm::MemoryBuffer::getMemBuffer(contents, uri.file()); if (!memBuffer) { - lsp::Logger::error("Failed to create memory buffer for file", uri.file()); + llvm::lsp::Logger::error("Failed to create memory buffer for file", + uri.file()); return; } sourceMgr.setIncludeDirs(includeDirs); @@ -442,8 +453,8 @@ void TableGenTextFile::initialize(const lsp::URIForFile &uri, // This class provides a context argument for the SourceMgr diagnostic // handler. struct DiagHandlerContext { - std::vector &diagnostics; - const lsp::URIForFile &uri; + std::vector &diagnostics; + const llvm::lsp::URIForFile &uri; } handlerContext{diagnostics, uri}; // Set the diagnostic handler for the tablegen source manager. @@ -469,9 +480,9 @@ void TableGenTextFile::initialize(const lsp::URIForFile &uri, // TableGenTextFile: Definitions and References //===----------------------------------------------------------------------===// -void TableGenTextFile::getLocationsOf(const lsp::URIForFile &uri, - const lsp::Position &defPos, - std::vector &locations) { +void TableGenTextFile::getLocationsOf( + const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &defPos, + std::vector &locations) { SMLoc posLoc = defPos.getAsSMLoc(sourceMgr); const TableGenIndexSymbol *symbol = index.lookup(posLoc); if (!symbol) @@ -492,8 +503,8 @@ void TableGenTextFile::getLocationsOf(const lsp::URIForFile &uri, } void TableGenTextFile::findReferencesOf( - const lsp::URIForFile &uri, const lsp::Position &pos, - std::vector &references) { + const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &pos, + std::vector &references) { SMLoc posLoc = pos.getAsSMLoc(sourceMgr); const TableGenIndexSymbol *symbol = index.lookup(posLoc); if (!symbol) @@ -508,8 +519,9 @@ void TableGenTextFile::findReferencesOf( // TableGenTextFile: Document Links //===--------------------------------------------------------------------===// -void TableGenTextFile::getDocumentLinks(const lsp::URIForFile &uri, - std::vector &links) { +void TableGenTextFile::getDocumentLinks( + const llvm::lsp::URIForFile &uri, + std::vector &links) { for (const lsp::SourceMgrInclude &include : parsedIncludes) links.emplace_back(include.range, include.uri); } @@ -518,9 +530,9 @@ void TableGenTextFile::getDocumentLinks(const lsp::URIForFile &uri, // TableGenTextFile: Hover //===----------------------------------------------------------------------===// -std::optional -TableGenTextFile::findHover(const lsp::URIForFile &uri, - const lsp::Position &hoverPos) { +std::optional +TableGenTextFile::findHover(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &hoverPos) { // Check for a reference to an include. for (const lsp::SourceMgrInclude &include : parsedIncludes) if (include.range.contains(hoverPos)) @@ -546,9 +558,10 @@ TableGenTextFile::findHover(const lsp::URIForFile &uri, return buildHoverForField(recordVal->record, value, hoverRange); } -lsp::Hover TableGenTextFile::buildHoverForRecord(const Record *record, - const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); +llvm::lsp::Hover +TableGenTextFile::buildHoverForRecord(const Record *record, + const SMRange &hoverRange) { + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); @@ -590,9 +603,9 @@ lsp::Hover TableGenTextFile::buildHoverForRecord(const Record *record, return hover; } -lsp::Hover TableGenTextFile::buildHoverForTemplateArg( +llvm::lsp::Hover TableGenTextFile::buildHoverForTemplateArg( const Record *record, const RecordVal *value, const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); StringRef name = value->getName().rsplit(':').second; @@ -604,10 +617,9 @@ lsp::Hover TableGenTextFile::buildHoverForTemplateArg( return hover; } -lsp::Hover TableGenTextFile::buildHoverForField(const Record *record, - const RecordVal *value, - const SMRange &hoverRange) { - lsp::Hover hover(lsp::Range(sourceMgr, hoverRange)); +llvm::lsp::Hover TableGenTextFile::buildHoverForField( + const Record *record, const RecordVal *value, const SMRange &hoverRange) { + llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); hoverOS << "**field** `" << value->getName() << "`\n***\nType: `"; @@ -722,7 +734,7 @@ void lsp::TableGenServer::getDocumentLinks( return fileIt->second->getDocumentLinks(uri, documentLinks); } -std::optional +std::optional lsp::TableGenServer::findHover(const URIForFile &uri, const Position &hoverPos) { auto fileIt = impl->files.find(uri.file()); From 0b9b5496da7267267abb398ee3396c138d6ebbb6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 15:56:42 +0000 Subject: [PATCH 11/13] Add LLVMSupportLSP as dependency --- mlir/lib/Tools/lsp-server-support/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/mlir/lib/Tools/lsp-server-support/CMakeLists.txt b/mlir/lib/Tools/lsp-server-support/CMakeLists.txt index a76c7f3de6809..408daff38bf70 100644 --- a/mlir/lib/Tools/lsp-server-support/CMakeLists.txt +++ b/mlir/lib/Tools/lsp-server-support/CMakeLists.txt @@ -7,4 +7,5 @@ add_mlir_library(MLIRLspServerSupportLib LINK_LIBS PUBLIC MLIRSupport + LLVMSupportLSP ) From d823007661db9314de29e920034c0c3af6c36372 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Wed, 27 Aug 2025 16:10:55 +0000 Subject: [PATCH 12/13] Make clang format happy --- .../Tools/mlir-pdll-lsp-server/PDLLServer.cpp | 243 ++++++++++-------- 1 file changed, 140 insertions(+), 103 deletions(-) diff --git a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp index f040f41d2996c..60b9567ff7804 100644 --- a/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp +++ b/mlir/lib/Tools/mlir-pdll-lsp-server/PDLLServer.cpp @@ -38,17 +38,19 @@ using namespace mlir::pdll; /// Returns a language server uri for the given source location. `mainFileURI` /// corresponds to the uri for the main file of the source manager. -static llvm::lsp::URIForFile getURIFromLoc(llvm::SourceMgr &mgr, SMRange loc, - const llvm::lsp::URIForFile &mainFileURI) { +static llvm::lsp::URIForFile +getURIFromLoc(llvm::SourceMgr &mgr, SMRange loc, + const llvm::lsp::URIForFile &mainFileURI) { int bufferId = mgr.FindBufferContainingLoc(loc.Start); if (bufferId == 0 || bufferId == static_cast(mgr.getMainFileID())) return mainFileURI; - llvm::Expected fileForLoc = llvm::lsp::URIForFile::fromFile( - mgr.getBufferInfo(bufferId).Buffer->getBufferIdentifier()); + llvm::Expected fileForLoc = + llvm::lsp::URIForFile::fromFile( + mgr.getBufferInfo(bufferId).Buffer->getBufferIdentifier()); if (fileForLoc) return *fileForLoc; llvm::lsp::Logger::error("Failed to create URI for include file: {0}", - llvm::toString(fileForLoc.takeError())); + llvm::toString(fileForLoc.takeError())); return mainFileURI; } @@ -59,9 +61,11 @@ static bool isMainFileLoc(llvm::SourceMgr &mgr, SMRange loc) { } /// Returns a language server location from the given source range. -static llvm::lsp::Location getLocationFromLoc(llvm::SourceMgr &mgr, SMRange range, - const llvm::lsp::URIForFile &uri) { - return llvm::lsp::Location(getURIFromLoc(mgr, range, uri), llvm::lsp::Range(mgr, range)); +static llvm::lsp::Location +getLocationFromLoc(llvm::SourceMgr &mgr, SMRange range, + const llvm::lsp::URIForFile &uri) { + return llvm::lsp::Location(getURIFromLoc(mgr, range, uri), + llvm::lsp::Range(mgr, range)); } /// Convert the given MLIR diagnostic to the LSP form. @@ -76,7 +80,8 @@ getLspDiagnoticFromDiag(llvm::SourceMgr &sourceMgr, const ast::Diagnostic &diag, lspDiag.category = "Parse Error"; // Try to grab a file location for this diagnostic. - llvm::lsp::Location loc = getLocationFromLoc(sourceMgr, diag.getLocation(), uri); + llvm::lsp::Location loc = + getLocationFromLoc(sourceMgr, diag.getLocation(), uri); lspDiag.range = loc.range; // Skip diagnostics that weren't emitted within the main file. @@ -269,9 +274,11 @@ struct PDLDocument { // Definitions and References //===--------------------------------------------------------------------===// - void getLocationsOf(const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &defPos, + void getLocationsOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &defPos, std::vector &locations); - void findReferencesOf(const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &pos, + void findReferencesOf(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &pos, std::vector &references); //===--------------------------------------------------------------------===// @@ -285,22 +292,24 @@ struct PDLDocument { // Hover //===--------------------------------------------------------------------===// - std::optional findHover(const llvm::lsp::URIForFile &uri, - const llvm::lsp::Position &hoverPos); + std::optional + findHover(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &hoverPos); std::optional findHover(const ast::Decl *decl, - const SMRange &hoverRange); + const SMRange &hoverRange); llvm::lsp::Hover buildHoverForOpName(const ods::Operation *op, - const SMRange &hoverRange); + const SMRange &hoverRange); llvm::lsp::Hover buildHoverForVariable(const ast::VariableDecl *varDecl, - const SMRange &hoverRange); - llvm::lsp::Hover buildHoverForPattern(const ast::PatternDecl *decl, - const SMRange &hoverRange); - llvm::lsp::Hover buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, const SMRange &hoverRange); + llvm::lsp::Hover buildHoverForPattern(const ast::PatternDecl *decl, + const SMRange &hoverRange); + llvm::lsp::Hover + buildHoverForCoreConstraint(const ast::CoreConstraintDecl *decl, + const SMRange &hoverRange); template - llvm::lsp::Hover buildHoverForUserConstraintOrRewrite(StringRef typeName, - const T *decl, - const SMRange &hoverRange); + llvm::lsp::Hover + buildHoverForUserConstraintOrRewrite(StringRef typeName, const T *decl, + const SMRange &hoverRange); //===--------------------------------------------------------------------===// // Document Symbols @@ -312,26 +321,29 @@ struct PDLDocument { // Code Completion //===--------------------------------------------------------------------===// - llvm::lsp::CompletionList getCodeCompletion(const llvm::lsp::URIForFile &uri, - const llvm::lsp::Position &completePos); + llvm::lsp::CompletionList + getCodeCompletion(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &completePos); //===--------------------------------------------------------------------===// // Signature Help //===--------------------------------------------------------------------===// llvm::lsp::SignatureHelp getSignatureHelp(const llvm::lsp::URIForFile &uri, - const llvm::lsp::Position &helpPos); + const llvm::lsp::Position &helpPos); //===--------------------------------------------------------------------===// // Inlay Hints //===--------------------------------------------------------------------===// - void getInlayHints(const llvm::lsp::URIForFile &uri, const llvm::lsp::Range &range, + void getInlayHints(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Range &range, std::vector &inlayHints); void getInlayHintsFor(const ast::VariableDecl *decl, const llvm::lsp::URIForFile &uri, std::vector &inlayHints); - void getInlayHintsFor(const ast::CallExpr *expr, const llvm::lsp::URIForFile &uri, + void getInlayHintsFor(const ast::CallExpr *expr, + const llvm::lsp::URIForFile &uri, std::vector &inlayHints); void getInlayHintsFor(const ast::OperationExpr *expr, const llvm::lsp::URIForFile &uri, @@ -378,7 +390,8 @@ PDLDocument::PDLDocument(const llvm::lsp::URIForFile &uri, StringRef contents, : astContext(odsContext) { auto memBuffer = llvm::MemoryBuffer::getMemBufferCopy(contents, uri.file()); if (!memBuffer) { - llvm::lsp::Logger::error("Failed to create memory buffer for file", uri.file()); + llvm::lsp::Logger::error("Failed to create memory buffer for file", + uri.file()); return; } @@ -423,9 +436,9 @@ void PDLDocument::getLocationsOf(const llvm::lsp::URIForFile &uri, locations.push_back(getLocationFromLoc(sourceMgr, symbol->getDefLoc(), uri)); } -void PDLDocument::findReferencesOf(const llvm::lsp::URIForFile &uri, - const llvm::lsp::Position &pos, - std::vector &references) { +void PDLDocument::findReferencesOf( + const llvm::lsp::URIForFile &uri, const llvm::lsp::Position &pos, + std::vector &references) { SMLoc posLoc = pos.getAsSMLoc(sourceMgr); const PDLIndexSymbol *symbol = index.lookup(posLoc); if (!symbol) @@ -440,8 +453,9 @@ void PDLDocument::findReferencesOf(const llvm::lsp::URIForFile &uri, // PDLDocument: Document Links //===--------------------------------------------------------------------===// -void PDLDocument::getDocumentLinks(const llvm::lsp::URIForFile &uri, - std::vector &links) { +void PDLDocument::getDocumentLinks( + const llvm::lsp::URIForFile &uri, + std::vector &links) { for (const lsp::SourceMgrInclude &include : parsedIncludes) links.emplace_back(include.range, include.uri); } @@ -474,8 +488,8 @@ PDLDocument::findHover(const llvm::lsp::URIForFile &uri, return findHover(decl, hoverRange); } -std::optional PDLDocument::findHover(const ast::Decl *decl, - const SMRange &hoverRange) { +std::optional +PDLDocument::findHover(const ast::Decl *decl, const SMRange &hoverRange) { // Add hover for variables. if (const auto *varDecl = dyn_cast(decl)) return buildHoverForVariable(varDecl, hoverRange); @@ -500,7 +514,7 @@ std::optional PDLDocument::findHover(const ast::Decl *decl, } llvm::lsp::Hover PDLDocument::buildHoverForOpName(const ods::Operation *op, - const SMRange &hoverRange) { + const SMRange &hoverRange) { llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); @@ -511,8 +525,9 @@ llvm::lsp::Hover PDLDocument::buildHoverForOpName(const ods::Operation *op, return hover; } -llvm::lsp::Hover PDLDocument::buildHoverForVariable(const ast::VariableDecl *varDecl, - const SMRange &hoverRange) { +llvm::lsp::Hover +PDLDocument::buildHoverForVariable(const ast::VariableDecl *varDecl, + const SMRange &hoverRange) { llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); @@ -523,7 +538,7 @@ llvm::lsp::Hover PDLDocument::buildHoverForVariable(const ast::VariableDecl *var } llvm::lsp::Hover PDLDocument::buildHoverForPattern(const ast::PatternDecl *decl, - const SMRange &hoverRange) { + const SMRange &hoverRange) { llvm::lsp::Hover hover(llvm::lsp::Range(sourceMgr, hoverRange)); { llvm::raw_string_ostream hoverOS(hover.contents.value); @@ -631,25 +646,28 @@ void PDLDocument::findDocumentSymbols( SMRange nameLoc = name ? name->getLoc() : patternDecl->getLoc(); SMRange bodyLoc(nameLoc.Start, patternDecl->getBody()->getLoc().End); - symbols.emplace_back( - name ? name->getName() : "", llvm::lsp::SymbolKind::Class, - llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); + symbols.emplace_back(name ? name->getName() : "", + llvm::lsp::SymbolKind::Class, + llvm::lsp::Range(sourceMgr, bodyLoc), + llvm::lsp::Range(sourceMgr, nameLoc)); } else if (const auto *cDecl = dyn_cast(decl)) { // TODO: Add source information for the code block body. SMRange nameLoc = cDecl->getName().getLoc(); SMRange bodyLoc = nameLoc; - symbols.emplace_back( - cDecl->getName().getName(), llvm::lsp::SymbolKind::Function, - llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); + symbols.emplace_back(cDecl->getName().getName(), + llvm::lsp::SymbolKind::Function, + llvm::lsp::Range(sourceMgr, bodyLoc), + llvm::lsp::Range(sourceMgr, nameLoc)); } else if (const auto *cDecl = dyn_cast(decl)) { // TODO: Add source information for the code block body. SMRange nameLoc = cDecl->getName().getLoc(); SMRange bodyLoc = nameLoc; - symbols.emplace_back( - cDecl->getName().getName(), llvm::lsp::SymbolKind::Function, - llvm::lsp::Range(sourceMgr, bodyLoc), llvm::lsp::Range(sourceMgr, nameLoc)); + symbols.emplace_back(cDecl->getName().getName(), + llvm::lsp::SymbolKind::Function, + llvm::lsp::Range(sourceMgr, bodyLoc), + llvm::lsp::Range(sourceMgr, nameLoc)); } } } @@ -841,8 +859,8 @@ class LSPCodeCompleteContext : public CodeCompleteContext { // Format the documentation for the constraint. if (std::optional doc = getDocumentationFor(sourceMgr, cst)) { - item.documentation = - llvm::lsp::MarkupContent{llvm::lsp::MarkupKind::Markdown, std::move(*doc)}; + item.documentation = llvm::lsp::MarkupContent{ + llvm::lsp::MarkupKind::Markdown, std::move(*doc)}; } completionList.items.emplace_back(item); @@ -1134,8 +1152,9 @@ class LSPSignatureHelpContext : public CodeCompleteContext { }; } // namespace -llvm::lsp::SignatureHelp PDLDocument::getSignatureHelp(const llvm::lsp::URIForFile &uri, - const llvm::lsp::Position &helpPos) { +llvm::lsp::SignatureHelp +PDLDocument::getSignatureHelp(const llvm::lsp::URIForFile &uri, + const llvm::lsp::Position &helpPos) { SMLoc posLoc = helpPos.getAsSMLoc(sourceMgr); if (!posLoc.isValid()) return llvm::lsp::SignatureHelp(); @@ -1198,9 +1217,9 @@ void PDLDocument::getInlayHints(const llvm::lsp::URIForFile &uri, }); } -void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, - const llvm::lsp::URIForFile &uri, - std::vector &inlayHints) { +void PDLDocument::getInlayHintsFor( + const ast::VariableDecl *decl, const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Check to see if the variable has a constraint list, if it does we don't // provide initializer hints. if (!decl->getConstraints().empty()) @@ -1216,7 +1235,7 @@ void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, } llvm::lsp::InlayHint hint(llvm::lsp::InlayHintKind::Type, - llvm::lsp::Position(sourceMgr, decl->getLoc().End)); + llvm::lsp::Position(sourceMgr, decl->getLoc().End)); { llvm::raw_string_ostream labelOS(hint.label); labelOS << ": " << decl->getType(); @@ -1225,9 +1244,9 @@ void PDLDocument::getInlayHintsFor(const ast::VariableDecl *decl, inlayHints.emplace_back(std::move(hint)); } -void PDLDocument::getInlayHintsFor(const ast::CallExpr *expr, - const llvm::lsp::URIForFile &uri, - std::vector &inlayHints) { +void PDLDocument::getInlayHintsFor( + const ast::CallExpr *expr, const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Try to extract the callable of this call. const auto *callableRef = dyn_cast(expr->getCallableExpr()); const auto *callable = @@ -1242,9 +1261,9 @@ void PDLDocument::getInlayHintsFor(const ast::CallExpr *expr, std::get<1>(it)->getName().getName()); } -void PDLDocument::getInlayHintsFor(const ast::OperationExpr *expr, - const llvm::lsp::URIForFile &uri, - std::vector &inlayHints) { +void PDLDocument::getInlayHintsFor( + const ast::OperationExpr *expr, const llvm::lsp::URIForFile &uri, + std::vector &inlayHints) { // Check for ODS information. ast::OperationType opType = dyn_cast(expr->getType()); const auto *odsOp = opType ? opType.getODSOperation() : nullptr; @@ -1290,13 +1309,15 @@ void PDLDocument::getInlayHintsFor(const ast::OperationExpr *expr, "results"); } -void PDLDocument::addParameterHintFor(std::vector &inlayHints, - const ast::Expr *expr, StringRef label) { +void PDLDocument::addParameterHintFor( + std::vector &inlayHints, const ast::Expr *expr, + StringRef label) { if (!shouldAddHintFor(expr, label)) return; - llvm::lsp::InlayHint hint(llvm::lsp::InlayHintKind::Parameter, - llvm::lsp::Position(sourceMgr, expr->getLoc().Start)); + llvm::lsp::InlayHint hint( + llvm::lsp::InlayHintKind::Parameter, + llvm::lsp::Position(sourceMgr, expr->getLoc().Start)); hint.label = (label + ":").str(); hint.paddingRight = true; inlayHints.emplace_back(std::move(hint)); @@ -1357,7 +1378,9 @@ struct PDLTextFileChunk { } /// Adjust the line number of the given position to anchor at the beginning of /// the file, instead of the beginning of this chunk. - void adjustLocForChunkOffset(llvm::lsp::Position &pos) { pos.line += lineOffset; } + void adjustLocForChunkOffset(llvm::lsp::Position &pos) { + pos.line += lineOffset; + } /// The line offset of this chunk from the beginning of the file. uint64_t lineOffset; @@ -1383,27 +1406,30 @@ class PDLTextFile { /// Update the file to the new version using the provided set of content /// changes. Returns failure if the update was unsuccessful. - LogicalResult update(const llvm::lsp::URIForFile &uri, int64_t newVersion, - ArrayRef changes, - std::vector &diagnostics); + LogicalResult + update(const llvm::lsp::URIForFile &uri, int64_t newVersion, + ArrayRef changes, + std::vector &diagnostics); //===--------------------------------------------------------------------===// // LSP Queries //===--------------------------------------------------------------------===// - void getLocationsOf(const llvm::lsp::URIForFile &uri, llvm::lsp::Position defPos, + void getLocationsOf(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position defPos, std::vector &locations); - void findReferencesOf(const llvm::lsp::URIForFile &uri, llvm::lsp::Position pos, + void findReferencesOf(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position pos, std::vector &references); void getDocumentLinks(const llvm::lsp::URIForFile &uri, std::vector &links); std::optional findHover(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position hoverPos); + llvm::lsp::Position hoverPos); void findDocumentSymbols(std::vector &symbols); llvm::lsp::CompletionList getCodeCompletion(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position completePos); + llvm::lsp::Position completePos); llvm::lsp::SignatureHelp getSignatureHelp(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position helpPos); + llvm::lsp::Position helpPos); void getInlayHints(const llvm::lsp::URIForFile &uri, llvm::lsp::Range range, std::vector &inlayHints); lsp::PDLLViewOutputResult getPDLLViewOutput(lsp::PDLLViewOutputKind kind); @@ -1442,8 +1468,8 @@ class PDLTextFile { }; } // namespace -PDLTextFile::PDLTextFile(const llvm::lsp::URIForFile &uri, StringRef fileContents, - int64_t version, +PDLTextFile::PDLTextFile(const llvm::lsp::URIForFile &uri, + StringRef fileContents, int64_t version, const std::vector &extraDirs, std::vector &diagnostics) : contents(fileContents.str()), extraIncludeDirs(extraDirs) { @@ -1454,7 +1480,8 @@ LogicalResult PDLTextFile::update(const llvm::lsp::URIForFile &uri, int64_t newVersion, ArrayRef changes, std::vector &diagnostics) { - if (failed(llvm::lsp::TextDocumentContentChangeEvent::applyTo(changes, contents))) { + if (failed(llvm::lsp::TextDocumentContentChangeEvent::applyTo(changes, + contents))) { llvm::lsp::Logger::error("Failed to update contents of {0}", uri.file()); return failure(); } @@ -1478,9 +1505,9 @@ void PDLTextFile::getLocationsOf(const llvm::lsp::URIForFile &uri, chunk.adjustLocForChunkOffset(loc.range); } -void PDLTextFile::findReferencesOf(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position pos, - std::vector &references) { +void PDLTextFile::findReferencesOf( + const llvm::lsp::URIForFile &uri, llvm::lsp::Position pos, + std::vector &references) { PDLTextFileChunk &chunk = getChunkFor(pos); chunk.document.findReferencesOf(uri, pos, references); @@ -1492,8 +1519,9 @@ void PDLTextFile::findReferencesOf(const llvm::lsp::URIForFile &uri, chunk.adjustLocForChunkOffset(loc.range); } -void PDLTextFile::getDocumentLinks(const llvm::lsp::URIForFile &uri, - std::vector &links) { +void PDLTextFile::getDocumentLinks( + const llvm::lsp::URIForFile &uri, + std::vector &links) { chunks.front()->document.getDocumentLinks(uri, links); for (const auto &it : llvm::drop_begin(chunks)) { size_t currentNumLinks = links.size(); @@ -1506,10 +1534,12 @@ void PDLTextFile::getDocumentLinks(const llvm::lsp::URIForFile &uri, } } -std::optional PDLTextFile::findHover(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position hoverPos) { +std::optional +PDLTextFile::findHover(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position hoverPos) { PDLTextFileChunk &chunk = getChunkFor(hoverPos); - std::optional hoverInfo = chunk.document.findHover(uri, hoverPos); + std::optional hoverInfo = + chunk.document.findHover(uri, hoverPos); // Adjust any locations within this file for the offset of this chunk. if (chunk.lineOffset != 0 && hoverInfo && hoverInfo->range) @@ -1528,11 +1558,11 @@ void PDLTextFile::findDocumentSymbols( PDLTextFileChunk &chunk = *chunks[i]; llvm::lsp::Position startPos(chunk.lineOffset); llvm::lsp::Position endPos((i == e - 1) ? totalNumLines - 1 - : chunks[i + 1]->lineOffset); - llvm::lsp::DocumentSymbol symbol("", - llvm::lsp::SymbolKind::Namespace, - /*range=*/llvm::lsp::Range(startPos, endPos), - /*selectionRange=*/llvm::lsp::Range(startPos)); + : chunks[i + 1]->lineOffset); + llvm::lsp::DocumentSymbol symbol( + "", llvm::lsp::SymbolKind::Namespace, + /*range=*/llvm::lsp::Range(startPos, endPos), + /*selectionRange=*/llvm::lsp::Range(startPos)); chunk.document.findDocumentSymbols(symbol.children); // Fixup the locations of document symbols within this chunk. @@ -1556,8 +1586,9 @@ void PDLTextFile::findDocumentSymbols( } } -llvm::lsp::CompletionList PDLTextFile::getCodeCompletion(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position completePos) { +llvm::lsp::CompletionList +PDLTextFile::getCodeCompletion(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position completePos) { PDLTextFileChunk &chunk = getChunkFor(completePos); llvm::lsp::CompletionList completionList = chunk.document.getCodeCompletion(uri, completePos); @@ -1572,12 +1603,14 @@ llvm::lsp::CompletionList PDLTextFile::getCodeCompletion(const llvm::lsp::URIFor return completionList; } -llvm::lsp::SignatureHelp PDLTextFile::getSignatureHelp(const llvm::lsp::URIForFile &uri, - llvm::lsp::Position helpPos) { +llvm::lsp::SignatureHelp +PDLTextFile::getSignatureHelp(const llvm::lsp::URIForFile &uri, + llvm::lsp::Position helpPos) { return getChunkFor(helpPos).document.getSignatureHelp(uri, helpPos); } -void PDLTextFile::getInlayHints(const llvm::lsp::URIForFile &uri, llvm::lsp::Range range, +void PDLTextFile::getInlayHints(const llvm::lsp::URIForFile &uri, + llvm::lsp::Range range, std::vector &inlayHints) { auto startIt = getChunkItFor(range.start); auto endIt = getChunkItFor(range.end); @@ -1605,7 +1638,8 @@ void PDLTextFile::getInlayHints(const llvm::lsp::URIForFile &uri, llvm::lsp::Ran // Otherwise, the range is split between multiple chunks. The first chunk // has the correct range start, but covers the total document. - getHintsForChunk(startIt, llvm::lsp::Range(range.start, getNumLines(startIt))); + getHintsForChunk(startIt, + llvm::lsp::Range(range.start, getNumLines(startIt))); // Every chunk in between uses the full document. for (++startIt; startIt != endIt; ++startIt) @@ -1632,7 +1666,8 @@ PDLTextFile::getPDLLViewOutput(lsp::PDLLViewOutputKind kind) { return result; } -void PDLTextFile::initialize(const llvm::lsp::URIForFile &uri, int64_t newVersion, +void PDLTextFile::initialize(const llvm::lsp::URIForFile &uri, + int64_t newVersion, std::vector &diagnostics) { version = newVersion; chunks.clear(); @@ -1668,7 +1703,8 @@ void PDLTextFile::initialize(const llvm::lsp::URIForFile &uri, int64_t newVersio totalNumLines = lineOffset; } -PDLTextFile::ChunkIterator PDLTextFile::getChunkItFor(llvm::lsp::Position &pos) { +PDLTextFile::ChunkIterator +PDLTextFile::getChunkItFor(llvm::lsp::Position &pos) { if (chunks.size() == 1) return chunks.begin(); @@ -1769,8 +1805,8 @@ void lsp::PDLLServer::getDocumentLinks( return fileIt->second->getDocumentLinks(uri, documentLinks); } -std::optional lsp::PDLLServer::findHover(const URIForFile &uri, - const Position &hoverPos) { +std::optional +lsp::PDLLServer::findHover(const URIForFile &uri, const Position &hoverPos) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) return fileIt->second->findHover(uri, hoverPos); @@ -1793,8 +1829,9 @@ lsp::PDLLServer::getCodeCompletion(const URIForFile &uri, return CompletionList(); } -llvm::lsp::SignatureHelp lsp::PDLLServer::getSignatureHelp(const URIForFile &uri, - const Position &helpPos) { +llvm::lsp::SignatureHelp +lsp::PDLLServer::getSignatureHelp(const URIForFile &uri, + const Position &helpPos) { auto fileIt = impl->files.find(uri.file()); if (fileIt != impl->files.end()) return fileIt->second->getSignatureHelp(uri, helpPos); From c8d05f5613ac6daa06049933e4f0a5e96ea62453 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Albert=20Havli=C4=8Dek?= Date: Thu, 28 Aug 2025 06:45:01 +0000 Subject: [PATCH 13/13] Remove MLIR from header --- llvm/include/llvm/Support/LSP/Logging.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/llvm/include/llvm/Support/LSP/Logging.h b/llvm/include/llvm/Support/LSP/Logging.h index d1ecf113a5123..fe65899b1d4ce 100644 --- a/llvm/include/llvm/Support/LSP/Logging.h +++ b/llvm/include/llvm/Support/LSP/Logging.h @@ -1,4 +1,4 @@ -//===- Logging.h - MLIR LSP Server Logging ----------------------*- C++ -*-===// +//===- Logging.h - LSP Server Logging ----------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information.