[clang-tools-extra] r339454 - [clangd] extend the publishDiagnostics response to send back fixits to the
Alex Lorenz via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 10 10:25:07 PDT 2018
Author: arphaman
Date: Fri Aug 10 10:25:07 2018
New Revision: 339454
URL: http://llvm.org/viewvc/llvm-project?rev=339454&view=rev
Log:
[clangd] extend the publishDiagnostics response to send back fixits to the
client if the client supports this extension
This commit extends the 'textDocument/publishDiagnostics' notification sent from
Clangd to the client. When it's enabled, Clangd sends out the fixits associated
with the appropriate diagnostic in the body of the 'publishDiagnostics'
notification. The client can enable this extension by setting 'clangdFixSupport'
to true in the textDocument capabilities during initialization.
Differential Revision: https://reviews.llvm.org/D50415
Modified:
clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
clang-tools-extra/trunk/clangd/ClangdLSPServer.h
clang-tools-extra/trunk/clangd/Diagnostics.h
clang-tools-extra/trunk/clangd/Protocol.cpp
clang-tools-extra/trunk/clangd/Protocol.h
Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp?rev=339454&r1=339453&r2=339454&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp (original)
+++ clang-tools-extra/trunk/clangd/ClangdLSPServer.cpp Fri Aug 10 10:25:07 2018
@@ -82,6 +82,8 @@ void ClangdLSPServer::onInitialize(Initi
CCOpts.EnableSnippets =
Params.capabilities.textDocument.completion.completionItem.snippetSupport;
+ DiagOpts.EmbedFixesInDiagnostics =
+ Params.capabilities.textDocument.publishDiagnostics.clangdFixSupport;
if (Params.capabilities.workspace && Params.capabilities.workspace->symbol &&
Params.capabilities.workspace->symbol->symbolKind) {
@@ -486,11 +488,25 @@ void ClangdLSPServer::onDiagnosticsReady
DiagnosticToReplacementMap LocalFixIts; // Temporary storage
for (auto &Diag : Diagnostics) {
toLSPDiags(Diag, [&](clangd::Diagnostic Diag, llvm::ArrayRef<Fix> Fixes) {
- DiagnosticsJSON.push_back(json::Object{
+ json::Object LSPDiag({
{"range", Diag.range},
{"severity", Diag.severity},
{"message", Diag.message},
});
+ // LSP extension: embed the fixes in the diagnostic.
+ if (DiagOpts.EmbedFixesInDiagnostics && !Fixes.empty()) {
+ json::Array ClangdFixes;
+ for (const auto &Fix : Fixes) {
+ WorkspaceEdit WE;
+ URIForFile URI{File};
+ WE.changes = {{URI.uri(), std::vector<TextEdit>(Fix.Edits.begin(),
+ Fix.Edits.end())}};
+ ClangdFixes.push_back(
+ json::Object{{"edit", toJSON(WE)}, {"title", Fix.Message}});
+ }
+ LSPDiag["clangd_fixes"] = std::move(ClangdFixes);
+ }
+ DiagnosticsJSON.push_back(std::move(LSPDiag));
auto &FixItsForDiagnostic = LocalFixIts[Diag];
std::copy(Fixes.begin(), Fixes.end(),
Modified: clang-tools-extra/trunk/clangd/ClangdLSPServer.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdLSPServer.h?rev=339454&r1=339453&r2=339454&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/ClangdLSPServer.h (original)
+++ clang-tools-extra/trunk/clangd/ClangdLSPServer.h Fri Aug 10 10:25:07 2018
@@ -155,6 +155,8 @@ private:
RealFileSystemProvider FSProvider;
/// Options used for code completion
clangd::CodeCompleteOptions CCOpts;
+ /// Options used for diagnostics.
+ ClangdDiagnosticOptions DiagOpts;
/// The supported kinds of the client.
SymbolKindBitset SupportedSymbolKinds;
Modified: clang-tools-extra/trunk/clangd/Diagnostics.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Diagnostics.h?rev=339454&r1=339453&r2=339454&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Diagnostics.h (original)
+++ clang-tools-extra/trunk/clangd/Diagnostics.h Fri Aug 10 10:25:07 2018
@@ -23,6 +23,12 @@
namespace clang {
namespace clangd {
+struct ClangdDiagnosticOptions {
+ /// If true, Clangd uses an LSP extension to embed the fixes with the
+ /// diagnostics that are sent to the client.
+ bool EmbedFixesInDiagnostics = false;
+};
+
/// Contains basic information about a diagnostic.
struct DiagBase {
std::string Message;
Modified: clang-tools-extra/trunk/clangd/Protocol.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.cpp?rev=339454&r1=339453&r2=339454&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Protocol.cpp (original)
+++ clang-tools-extra/trunk/clangd/Protocol.cpp Fri Aug 10 10:25:07 2018
@@ -178,6 +178,15 @@ bool fromJSON(const json::Value &Params,
return true;
}
+bool fromJSON(const llvm::json::Value &Params,
+ PublishDiagnosticsClientCapabilities &R) {
+ json::ObjectMapper O(Params);
+ if (!O)
+ return false;
+ O.map("clangdFixSupport", R.clangdFixSupport);
+ return true;
+}
+
bool fromJSON(const json::Value &E, SymbolKind &Out) {
if (auto T = E.getAsInteger()) {
if (*T < static_cast<int>(SymbolKind::File) ||
@@ -240,6 +249,7 @@ bool fromJSON(const json::Value &Params,
if (!O)
return false;
O.map("completion", R.completion);
+ O.map("publishDiagnostics", R.publishDiagnostics);
return true;
}
Modified: clang-tools-extra/trunk/clangd/Protocol.h
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Protocol.h?rev=339454&r1=339453&r2=339454&view=diff
==============================================================================
--- clang-tools-extra/trunk/clangd/Protocol.h (original)
+++ clang-tools-extra/trunk/clangd/Protocol.h Fri Aug 10 10:25:07 2018
@@ -247,6 +247,18 @@ struct CompletionClientCapabilities {
};
bool fromJSON(const llvm::json::Value &, CompletionClientCapabilities &);
+struct PublishDiagnosticsClientCapabilities {
+ // Whether the client accepts diagnostics with related information.
+ // NOTE: not used by clangd at the moment.
+ // bool relatedInformation;
+
+ /// Whether the client accepts diagnostics with fixes attached using the
+ /// "clangd_fixes" extension.
+ bool clangdFixSupport = false;
+};
+bool fromJSON(const llvm::json::Value &,
+ PublishDiagnosticsClientCapabilities &);
+
/// A symbol kind.
enum class SymbolKind {
File = 1,
@@ -313,6 +325,9 @@ bool fromJSON(const llvm::json::Value &,
struct TextDocumentClientCapabilities {
/// Capabilities specific to the `textDocument/completion`
CompletionClientCapabilities completion;
+
+ /// Capabilities specific to the 'textDocument/publishDiagnostics'
+ PublishDiagnosticsClientCapabilities publishDiagnostics;
};
bool fromJSON(const llvm::json::Value &, TextDocumentClientCapabilities &);
More information about the cfe-commits
mailing list