[Mlir-commits] [mlir] 878c141 - [mlir-lsp] Add DiagnosticTag from LSP spec (#91396)
llvmlistbot at llvm.org
llvmlistbot at llvm.org
Wed May 8 12:07:40 PDT 2024
Author: Lily Brown
Date: 2024-05-08T15:07:37-04:00
New Revision: 878c141adcd3a1ea47c4cc8429af5c8522678536
URL: https://github.com/llvm/llvm-project/commit/878c141adcd3a1ea47c4cc8429af5c8522678536
DIFF: https://github.com/llvm/llvm-project/commit/878c141adcd3a1ea47c4cc8429af5c8522678536.diff
LOG: [mlir-lsp] Add DiagnosticTag from LSP spec (#91396)
Adds the [DiagnosticTag][diagtag] LSP construct to the LSP support
headers. I also added a unit test file to validate that the `tags` array
is omitted entirely if it's empty.
The LSP spec requires that `Diagnostic::tags` be an array; in order to
conform to that I used `std::vector`, as `SmallVector` doesn't have JSON
decoding support (you can encode it to JSON, but not decode it from
JSON).
[diagtag]:
https://microsoft.github.io/language-server-protocol/specifications/lsp/3.18/specification/#diagnosticTag
Added:
mlir/unittests/Tools/lsp-server-support/Protocol.cpp
Modified:
mlir/include/mlir/Tools/lsp-server-support/Protocol.h
mlir/lib/Tools/lsp-server-support/Protocol.cpp
mlir/unittests/Tools/lsp-server-support/CMakeLists.txt
Removed:
################################################################################
diff --git a/mlir/include/mlir/Tools/lsp-server-support/Protocol.h b/mlir/include/mlir/Tools/lsp-server-support/Protocol.h
index 839d82bb02b87..1d22b8a667749 100644
--- a/mlir/include/mlir/Tools/lsp-server-support/Protocol.h
+++ b/mlir/include/mlir/Tools/lsp-server-support/Protocol.h
@@ -677,6 +677,16 @@ enum class DiagnosticSeverity {
Hint = 4
};
+enum class DiagnosticTag {
+ Unnecessary = 1,
+ Deprecated = 2,
+};
+
+/// Add support for JSON serialization.
+llvm::json::Value toJSON(DiagnosticTag tag);
+bool fromJSON(const llvm::json::Value &value, DiagnosticTag &result,
+ llvm::json::Path path);
+
struct Diagnostic {
/// The source range where the message applies.
Range range;
@@ -696,6 +706,9 @@ struct Diagnostic {
/// a scope collide all definitions can be marked via this property.
std::optional<std::vector<DiagnosticRelatedInformation>> relatedInformation;
+ /// Additional metadata about the diagnostic.
+ std::vector<DiagnosticTag> tags;
+
/// The diagnostic's category. Can be omitted.
/// An LSP extension that's used to send the name of the category over to the
/// client. The category typically describes the compilation stage during
diff --git a/mlir/lib/Tools/lsp-server-support/Protocol.cpp b/mlir/lib/Tools/lsp-server-support/Protocol.cpp
index e110fdd97a38f..188f5253c95c6 100644
--- a/mlir/lib/Tools/lsp-server-support/Protocol.cpp
+++ b/mlir/lib/Tools/lsp-server-support/Protocol.cpp
@@ -646,6 +646,20 @@ llvm::json::Value mlir::lsp::toJSON(const DiagnosticRelatedInformation &info) {
// Diagnostic
//===----------------------------------------------------------------------===//
+llvm::json::Value mlir::lsp::toJSON(DiagnosticTag tag) {
+ return static_cast<int>(tag);
+}
+
+bool mlir::lsp::fromJSON(const llvm::json::Value &value, DiagnosticTag &result,
+ llvm::json::Path path) {
+ if (std::optional<int64_t> i = value.getAsInteger()) {
+ result = (DiagnosticTag)*i;
+ return true;
+ }
+
+ return false;
+}
+
llvm::json::Value mlir::lsp::toJSON(const Diagnostic &diag) {
llvm::json::Object result{
{"range", diag.range},
@@ -658,6 +672,8 @@ llvm::json::Value mlir::lsp::toJSON(const Diagnostic &diag) {
result["source"] = diag.source;
if (diag.relatedInformation)
result["relatedInformation"] = *diag.relatedInformation;
+ if (!diag.tags.empty())
+ result["tags"] = diag.tags;
return std::move(result);
}
@@ -675,7 +691,8 @@ bool mlir::lsp::fromJSON(const llvm::json::Value &value, Diagnostic &result,
mapOptOrNull(value, "category", result.category, path) &&
mapOptOrNull(value, "source", result.source, path) &&
mapOptOrNull(value, "relatedInformation", result.relatedInformation,
- path);
+ path) &&
+ mapOptOrNull(value, "tags", result.tags, path);
}
//===----------------------------------------------------------------------===//
diff --git a/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt b/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt
index 3aa8b9c4bc773..f777873ff7c65 100644
--- a/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt
+++ b/mlir/unittests/Tools/lsp-server-support/CMakeLists.txt
@@ -1,4 +1,5 @@
add_mlir_unittest(MLIRLspServerSupportTests
+ Protocol.cpp
Transport.cpp
)
target_link_libraries(MLIRLspServerSupportTests
diff --git a/mlir/unittests/Tools/lsp-server-support/Protocol.cpp b/mlir/unittests/Tools/lsp-server-support/Protocol.cpp
new file mode 100644
index 0000000000000..04d7b2fbb440f
--- /dev/null
+++ b/mlir/unittests/Tools/lsp-server-support/Protocol.cpp
@@ -0,0 +1,51 @@
+//===- Protocol.cpp - LSP JSON protocol unit tests ------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "mlir/Tools/lsp-server-support/Protocol.h"
+
+#include "gtest/gtest.h"
+
+using namespace mlir;
+using namespace mlir::lsp;
+using namespace testing;
+
+namespace {
+
+TEST(ProtocolTest, DiagnosticTagPresent) {
+ Diagnostic diagnostic;
+ diagnostic.tags.push_back(DiagnosticTag::Unnecessary);
+
+ llvm::json::Value json = toJSON(diagnostic);
+ const llvm::json::Object *o = json.getAsObject();
+ const llvm::json::Array *v = o->get("tags")->getAsArray();
+ EXPECT_EQ(*v, llvm::json::Array{1});
+
+ Diagnostic parsed;
+ llvm::json::Path::Root root = llvm::json::Path::Root();
+ bool success = fromJSON(json, parsed, llvm::json::Path(root));
+ EXPECT_TRUE(success);
+ ASSERT_EQ(parsed.tags.size(), (size_t)1);
+ EXPECT_EQ(parsed.tags.at(0), DiagnosticTag::Unnecessary);
+}
+
+TEST(ProtocolTest, DiagnosticTagNotPresent) {
+ Diagnostic diagnostic;
+
+ llvm::json::Value json = toJSON(diagnostic);
+ const llvm::json::Object *o = json.getAsObject();
+ const llvm::json::Value *v = o->get("tags");
+ EXPECT_EQ(v, nullptr);
+
+ Diagnostic parsed;
+ llvm::json::Path::Root root = llvm::json::Path::Root();
+ bool success = fromJSON(json, parsed, llvm::json::Path(root));
+ EXPECT_TRUE(success);
+ EXPECT_TRUE(parsed.tags.empty());
+}
+
+} // namespace
More information about the Mlir-commits
mailing list