[PATCH] D98505: [clangd] Propagate data in diagnostics
Kadir Cetinkaya via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 29 14:25:22 PDT 2021
kadircet updated this revision to Diff 333982.
kadircet marked 2 inline comments as done.
kadircet added a comment.
- Address comments
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D98505/new/
https://reviews.llvm.org/D98505
Files:
clang-tools-extra/clangd/Diagnostics.cpp
clang-tools-extra/clangd/Diagnostics.h
clang-tools-extra/clangd/Protocol.cpp
clang-tools-extra/clangd/Protocol.h
clang-tools-extra/clangd/refactor/Tweak.h
Index: clang-tools-extra/clangd/refactor/Tweak.h
===================================================================
--- clang-tools-extra/clangd/refactor/Tweak.h
+++ clang-tools-extra/clangd/refactor/Tweak.h
@@ -26,6 +26,7 @@
#include "index/Index.h"
#include "support/Path.h"
#include "clang/Tooling/Core/Replacement.h"
+#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/StringMap.h"
#include "llvm/ADT/StringRef.h"
Index: clang-tools-extra/clangd/Protocol.h
===================================================================
--- clang-tools-extra/clangd/Protocol.h
+++ clang-tools-extra/clangd/Protocol.h
@@ -844,6 +844,13 @@
/// Only with capability textDocument.publishDiagnostics.codeActionsInline.
/// (These actions can also be obtained using textDocument/codeAction).
llvm::Optional<std::vector<CodeAction>> codeActions;
+
+ /// A data entry field that is preserved between a
+ /// `textDocument/publishDiagnostics` notification
+ /// and`textDocument/codeAction` request.
+ /// Mutating users should associate their data with a unique key they can use
+ /// to retrieve later on.
+ llvm::json::Object data;
};
llvm::json::Value toJSON(const Diagnostic &);
Index: clang-tools-extra/clangd/Protocol.cpp
===================================================================
--- clang-tools-extra/clangd/Protocol.cpp
+++ clang-tools-extra/clangd/Protocol.cpp
@@ -599,6 +599,8 @@
Diag["source"] = D.source;
if (D.relatedInformation)
Diag["relatedInformation"] = *D.relatedInformation;
+ if (!D.data.empty())
+ Diag["data"] = llvm::json::Object(D.data);
// FIXME: workaround for older gcc/clang
return std::move(Diag);
}
@@ -606,7 +608,11 @@
bool fromJSON(const llvm::json::Value &Params, Diagnostic &R,
llvm::json::Path P) {
llvm::json::ObjectMapper O(Params, P);
- return O && O.map("range", R.range) && O.map("message", R.message) &&
+ if (!O)
+ return false;
+ if (auto *Data = Params.getAsObject()->getObject("data"))
+ R.data = *Data;
+ return O.map("range", R.range) && O.map("message", R.message) &&
mapOptOrNull(Params, "severity", R.severity, P) &&
mapOptOrNull(Params, "category", R.category, P) &&
mapOptOrNull(Params, "code", R.code, P) &&
Index: clang-tools-extra/clangd/Diagnostics.h
===================================================================
--- clang-tools-extra/clangd/Diagnostics.h
+++ clang-tools-extra/clangd/Diagnostics.h
@@ -21,10 +21,12 @@
#include "llvm/ADT/Optional.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/StringSet.h"
+#include "llvm/Support/JSON.h"
#include "llvm/Support/SourceMgr.h"
#include <cassert>
#include <memory>
#include <string>
+#include <vector>
namespace clang {
namespace tidy {
@@ -69,6 +71,10 @@
// diags from the main file.
bool InsideMainFile = false;
unsigned ID; // e.g. member of clang::diag, or clang-tidy assigned ID.
+ // Feature modules can make use of this field to propagate data from a
+ // diagnostic to a CodeAction request. Each module should only append to the
+ // list.
+ llvm::json::Object OpaqueData;
};
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const DiagBase &D);
Index: clang-tools-extra/clangd/Diagnostics.cpp
===================================================================
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -476,6 +476,10 @@
Res.message = noteMessage(D, Note, Opts);
OutFn(std::move(Res), llvm::ArrayRef<Fix>());
}
+
+ // FIXME: Get rid of the copies here by taking in a mutable clangd::Diag.
+ for (auto &Entry : D.OpaqueData)
+ Main.data.insert({Entry.first, Entry.second});
}
int getSeverity(DiagnosticsEngine::Level L) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D98505.333982.patch
Type: text/x-patch
Size: 3790 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210329/697381f5/attachment-0001.bin>
More information about the cfe-commits
mailing list