[PATCH] D88489: [clangd] Mark code action as "preferred" if it's the sole quickfix action
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Sep 29 07:29:06 PDT 2020
sammccall created this revision.
sammccall added a reviewer: usaxena95.
Herald added subscribers: cfe-commits, kadircet, arphaman.
Herald added a project: clang.
sammccall requested review of this revision.
Herald added subscribers: MaskRay, ilya-biryukov.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D88489
Files:
clang-tools-extra/clangd/ClangdLSPServer.cpp
clang-tools-extra/clangd/Diagnostics.cpp
clang-tools-extra/clangd/Protocol.cpp
clang-tools-extra/clangd/Protocol.h
clang-tools-extra/clangd/test/fixits-embed-in-diagnostic.test
Index: clang-tools-extra/clangd/test/fixits-embed-in-diagnostic.test
===================================================================
--- clang-tools-extra/clangd/test/fixits-embed-in-diagnostic.test
+++ clang-tools-extra/clangd/test/fixits-embed-in-diagnostic.test
@@ -28,6 +28,7 @@
# CHECK-NEXT: ]
# CHECK-NEXT: }
# CHECK-NEXT: },
+# CHECK-NEXT: "isPreferred": true,
# CHECK-NEXT: "kind": "quickfix",
# CHECK-NEXT: "title": "change 'union' to 'struct'"
# CHECK-NEXT: }
Index: clang-tools-extra/clangd/Protocol.h
===================================================================
--- clang-tools-extra/clangd/Protocol.h
+++ clang-tools-extra/clangd/Protocol.h
@@ -952,6 +952,13 @@
/// The diagnostics that this code action resolves.
llvm::Optional<std::vector<Diagnostic>> diagnostics;
+ /// Marks this as a preferred action. Preferred actions are used by the
+ /// `auto fix` command and can be targeted by keybindings.
+ /// A quick fix should be marked preferred if it properly addresses the
+ /// underlying error. A refactoring should be marked preferred if it is the
+ /// most reasonable choice of actions to take.
+ bool isPreferred = false;
+
/// The workspace edit this code action performs.
llvm::Optional<WorkspaceEdit> edit;
Index: clang-tools-extra/clangd/Protocol.cpp
===================================================================
--- clang-tools-extra/clangd/Protocol.cpp
+++ clang-tools-extra/clangd/Protocol.cpp
@@ -740,6 +740,8 @@
CodeAction["kind"] = *CA.kind;
if (CA.diagnostics)
CodeAction["diagnostics"] = llvm::json::Array(*CA.diagnostics);
+ if (CA.isPreferred)
+ CodeAction["isPreferred"] = true;
if (CA.edit)
CodeAction["edit"] = *CA.edit;
if (CA.command)
Index: clang-tools-extra/clangd/Diagnostics.cpp
===================================================================
--- clang-tools-extra/clangd/Diagnostics.cpp
+++ clang-tools-extra/clangd/Diagnostics.cpp
@@ -411,6 +411,8 @@
Main.codeActions.emplace();
for (const auto &Fix : D.Fixes)
Main.codeActions->push_back(toCodeAction(Fix, File));
+ if (Main.codeActions->size() == 1)
+ Main.codeActions->front().isPreferred = true;
}
if (Opts.SendDiagnosticCategory && !D.Category.empty())
Main.category = D.Category;
Index: clang-tools-extra/clangd/ClangdLSPServer.cpp
===================================================================
--- clang-tools-extra/clangd/ClangdLSPServer.cpp
+++ clang-tools-extra/clangd/ClangdLSPServer.cpp
@@ -1009,6 +1009,20 @@
for (const auto &T : *Tweaks)
Actions.push_back(toCodeAction(T, File, Selection));
+ // If there's exactly one quick-fix, call it "preferred".
+ // We never consider refactorings etc as preferred.
+ CodeAction *OnlyFix = nullptr;
+ for (auto &Action : Actions) {
+ if (Action.kind && *Action.kind == CodeAction::QUICKFIX_KIND) {
+ if (OnlyFix) {
+ OnlyFix->isPreferred = false;
+ break;
+ }
+ Action.isPreferred = true;
+ OnlyFix = &Action;
+ }
+ }
+
if (SupportsCodeAction)
return Reply(llvm::json::Array(Actions));
std::vector<Command> Commands;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D88489.294979.patch
Type: text/x-patch
Size: 3340 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20200929/f2a915b0/attachment-0001.bin>
More information about the cfe-commits
mailing list