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) {
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) {
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits