summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clangd/Diagnostics.cpp
diff options
context:
space:
mode:
authorSam McCall <sam.mccall@gmail.com>2018-10-24 07:59:38 +0000
committerSam McCall <sam.mccall@gmail.com>2018-10-24 07:59:38 +0000
commit16e7070e3e7640f0f081a84ec72b2a8d81f2a668 (patch)
treebfb763d0f6a6872c9a26ba20ebccf3164a755145 /clang-tools-extra/clangd/Diagnostics.cpp
parent1f54500af04bcdc2a4cd41b154778abf691ed300 (diff)
downloadbcm5719-llvm-16e7070e3e7640f0f081a84ec72b2a8d81f2a668.tar.gz
bcm5719-llvm-16e7070e3e7640f0f081a84ec72b2a8d81f2a668.zip
[clangd] Embed fixes as CodeAction, instead of clangd_fixes. Clean up serialization.
Summary: CodeAction provides us with a standard way of representing fixes inline, so use it, replacing our existing ad-hoc extension. After this, it's easy to serialize diagnostics using the structured toJSON/Protocol.h mechanism rather than assembling JSON ad-hoc. Reviewers: hokein, arphaman Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, kadircet, cfe-commits Differential Revision: https://reviews.llvm.org/D53391 llvm-svn: 345119
Diffstat (limited to 'clang-tools-extra/clangd/Diagnostics.cpp')
-rw-r--r--clang-tools-extra/clangd/Diagnostics.cpp24
1 files changed, 21 insertions, 3 deletions
diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp
index 5a81dbcbefd..e47abc3f88e 100644
--- a/clang-tools-extra/clangd/Diagnostics.cpp
+++ b/clang-tools-extra/clangd/Diagnostics.cpp
@@ -227,19 +227,37 @@ raw_ostream &operator<<(raw_ostream &OS, const Diag &D) {
return OS;
}
-void toLSPDiags(const Diag &D,
- function_ref<void(clangd::Diagnostic, ArrayRef<Fix>)> OutFn) {
+CodeAction toCodeAction(const Fix &F, const URIForFile &File) {
+ CodeAction Action;
+ Action.title = F.Message;
+ Action.kind = CodeAction::QUICKFIX_KIND;
+ Action.edit.emplace();
+ Action.edit->changes.emplace();
+ (*Action.edit->changes)[File.uri()] = {F.Edits.begin(), F.Edits.end()};
+ return Action;
+}
+
+void toLSPDiags(
+ const Diag &D, const URIForFile &File, const ClangdDiagnosticOptions &Opts,
+ function_ref<void(clangd::Diagnostic, ArrayRef<Fix>)> OutFn) {
auto FillBasicFields = [](const DiagBase &D) -> clangd::Diagnostic {
clangd::Diagnostic Res;
Res.range = D.Range;
Res.severity = getSeverity(D.Severity);
- Res.category = D.Category;
return Res;
};
{
clangd::Diagnostic Main = FillBasicFields(D);
Main.message = mainMessage(D);
+ if (Opts.EmbedFixesInDiagnostics) {
+ Main.codeActions.emplace();
+ for (const auto &Fix : D.Fixes)
+ Main.codeActions->push_back(toCodeAction(Fix, File));
+ }
+ if (Opts.SendDiagnosticCategory && !D.Category.empty())
+ Main.category = D.Category;
+
OutFn(std::move(Main), D.Fixes);
}
OpenPOWER on IntegriCloud