diff options
author | Sam McCall <sam.mccall@gmail.com> | 2018-10-24 07:59:38 +0000 |
---|---|---|
committer | Sam McCall <sam.mccall@gmail.com> | 2018-10-24 07:59:38 +0000 |
commit | 16e7070e3e7640f0f081a84ec72b2a8d81f2a668 (patch) | |
tree | bfb763d0f6a6872c9a26ba20ebccf3164a755145 /clang-tools-extra/clangd/Diagnostics.cpp | |
parent | 1f54500af04bcdc2a4cd41b154778abf691ed300 (diff) | |
download | bcm5719-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.cpp | 24 |
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); } |