From 1fb4737d0d64019169ac69e8cf66b24acfbba5aa Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 7 Jul 2022 15:21:31 +0200 Subject: [PATCH] ClangCodeModel: Move quickfix functionality to dedicated set of files Change-Id: I7cc55afa7aa50ba584593457b6c1393794866c56 Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/CMakeLists.txt | 2 +- src/plugins/clangcodemodel/clangcodemodel.qbs | 4 +- src/plugins/clangcodemodel/clangdclient.cpp | 67 +------------------ ...ickfixfactory.cpp => clangdquickfixes.cpp} | 67 ++++++++++++++++++- ...gdquickfixfactory.h => clangdquickfixes.h} | 12 ++++ .../clangmodelmanagersupport.cpp | 2 +- 6 files changed, 82 insertions(+), 72 deletions(-) rename src/plugins/clangcodemodel/{clangdquickfixfactory.cpp => clangdquickfixes.cpp} (50%) rename src/plugins/clangcodemodel/{clangdquickfixfactory.h => clangdquickfixes.h} (82%) diff --git a/src/plugins/clangcodemodel/CMakeLists.txt b/src/plugins/clangcodemodel/CMakeLists.txt index 9205ba340bf..435299a20d5 100644 --- a/src/plugins/clangcodemodel/CMakeLists.txt +++ b/src/plugins/clangcodemodel/CMakeLists.txt @@ -19,7 +19,7 @@ add_qtc_plugin(ClangCodeModel clangdclient.cpp clangdclient.h clangdfollowsymbol.cpp clangdfollowsymbol.h clangdiagnostictooltipwidget.cpp clangdiagnostictooltipwidget.h - clangdquickfixfactory.cpp clangdquickfixfactory.h + clangdquickfixes.cpp clangdquickfixes.h clangdqpropertyhighlighter.cpp clangdqpropertyhighlighter.h clangdsemantichighlighting.cpp clangdsemantichighlighting.h clangdswitchdecldef.cpp clangdswitchdecldef.h diff --git a/src/plugins/clangcodemodel/clangcodemodel.qbs b/src/plugins/clangcodemodel/clangcodemodel.qbs index dc85b9d96d4..ae4ebeb487d 100644 --- a/src/plugins/clangcodemodel/clangcodemodel.qbs +++ b/src/plugins/clangcodemodel/clangcodemodel.qbs @@ -42,8 +42,8 @@ QtcPlugin { "clangdlocatorfilters.h", "clangdqpropertyhighlighter.cpp", "clangdqpropertyhighlighter.h", - "clangdquickfixfactory.cpp", - "clangdquickfixfactory.h", + "clangdquickfixes.cpp", + "clangdquickfixes.h", "clangdsemantichighlighting.cpp", "clangdsemantichighlighting.h", "clangdswitchdecldef.cpp", diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 6699242283e..e6681a49e3e 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -30,6 +30,7 @@ #include "clangdast.h" #include "clangdfollowsymbol.h" #include "clangdlocatorfilters.h" +#include "clangdquickfixes.h" #include "clangdswitchdecldef.h" #include "clangpreprocessorassistproposalitem.h" #include "clangtextmark.h" @@ -65,7 +66,6 @@ #include #include #include -#include #include #include #include @@ -775,71 +775,6 @@ private: ClangdClient * const m_client; }; -class ClangdQuickFixProcessor : public LanguageClientQuickFixAssistProcessor -{ -public: - ClangdQuickFixProcessor(LanguageClient::Client *client) - : LanguageClientQuickFixAssistProcessor(client) - { - } - -private: - IAssistProposal *perform(const AssistInterface *interface) override - { - m_interface = interface; - - // Step 1: Collect clangd code actions asynchronously - LanguageClientQuickFixAssistProcessor::perform(interface); - - // Step 2: Collect built-in quickfixes synchronously - m_builtinOps = CppEditor::quickFixOperations(interface); - - return nullptr; - } - - TextEditor::GenericProposal *handleCodeActionResult(const CodeActionResult &result) override - { - auto toOperation = - [=](const Utils::variant &item) -> QuickFixOperation * { - if (auto action = Utils::get_if(&item)) { - const Utils::optional> diagnostics = action->diagnostics(); - if (!diagnostics.has_value() || diagnostics->isEmpty()) - return new CodeActionQuickFixOperation(*action, client()); - } - if (auto command = Utils::get_if(&item)) - return new CommandQuickFixOperation(*command, client()); - return nullptr; - }; - - if (auto list = Utils::get_if>>(&result)) { - QuickFixOperations ops; - for (const Utils::variant &item : *list) { - if (QuickFixOperation *op = toOperation(item)) { - op->setDescription("clangd: " + op->description()); - ops << op; - } - } - return GenericProposal::createProposal(m_interface, ops + m_builtinOps); - } - return nullptr; - } - - QuickFixOperations m_builtinOps; - const AssistInterface *m_interface = nullptr; -}; - -class ClangdQuickFixProvider : public LanguageClientQuickFixProvider -{ -public: - ClangdQuickFixProvider(ClangdClient *client) : LanguageClientQuickFixProvider(client) {}; - -private: - IAssistProcessor *createProcessor(const TextEditor::AssistInterface *) const override - { - return new ClangdQuickFixProcessor(client()); - } -}; - static void addToCompilationDb(QJsonObject &cdb, const CppEditor::ProjectPart &projectPart, CppEditor::UsePrecompiledHeaders usePch, diff --git a/src/plugins/clangcodemodel/clangdquickfixfactory.cpp b/src/plugins/clangcodemodel/clangdquickfixes.cpp similarity index 50% rename from src/plugins/clangcodemodel/clangdquickfixfactory.cpp rename to src/plugins/clangcodemodel/clangdquickfixes.cpp index 5146df8bc5b..556835b34dd 100644 --- a/src/plugins/clangcodemodel/clangdquickfixfactory.cpp +++ b/src/plugins/clangcodemodel/clangdquickfixes.cpp @@ -23,14 +23,16 @@ ** ****************************************************************************/ -#include "clangdquickfixfactory.h" +#include "clangdquickfixes.h" #include "clangdclient.h" #include "clangmodelmanagersupport.h" -#include +#include +using namespace LanguageClient; using namespace LanguageServerProtocol; +using namespace TextEditor; namespace ClangCodeModel { namespace Internal { @@ -58,5 +60,66 @@ void ClangdQuickFixFactory::match(const CppEditor::Internal::CppQuickFixInterfac } } +class ClangdQuickFixProcessor : public LanguageClientQuickFixAssistProcessor +{ +public: + ClangdQuickFixProcessor(LanguageClient::Client *client) + : LanguageClientQuickFixAssistProcessor(client) + { + } + +private: + IAssistProposal *perform(const AssistInterface *interface) override + { + m_interface = interface; + + // Step 1: Collect clangd code actions asynchronously + LanguageClientQuickFixAssistProcessor::perform(interface); + + // Step 2: Collect built-in quickfixes synchronously + m_builtinOps = CppEditor::quickFixOperations(interface); + + return nullptr; + } + + TextEditor::GenericProposal *handleCodeActionResult(const CodeActionResult &result) override + { + auto toOperation = + [=](const Utils::variant &item) -> QuickFixOperation * { + if (auto action = Utils::get_if(&item)) { + const Utils::optional> diagnostics = action->diagnostics(); + if (!diagnostics.has_value() || diagnostics->isEmpty()) + return new CodeActionQuickFixOperation(*action, client()); + } + if (auto command = Utils::get_if(&item)) + return new CommandQuickFixOperation(*command, client()); + return nullptr; + }; + + if (auto list = Utils::get_if>>(&result)) { + QuickFixOperations ops; + for (const Utils::variant &item : *list) { + if (QuickFixOperation *op = toOperation(item)) { + op->setDescription("clangd: " + op->description()); + ops << op; + } + } + return GenericProposal::createProposal(m_interface, ops + m_builtinOps); + } + return nullptr; + } + + QuickFixOperations m_builtinOps; + const AssistInterface *m_interface = nullptr; +}; + +ClangdQuickFixProvider::ClangdQuickFixProvider(ClangdClient *client) + : LanguageClientQuickFixProvider(client) {} + +IAssistProcessor *ClangdQuickFixProvider::createProcessor(const AssistInterface *) const +{ + return new ClangdQuickFixProcessor(client()); +} + } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangdquickfixfactory.h b/src/plugins/clangcodemodel/clangdquickfixes.h similarity index 82% rename from src/plugins/clangcodemodel/clangdquickfixfactory.h rename to src/plugins/clangcodemodel/clangdquickfixes.h index 022b6033407..fc1ad1e36d1 100644 --- a/src/plugins/clangcodemodel/clangdquickfixfactory.h +++ b/src/plugins/clangcodemodel/clangdquickfixes.h @@ -26,9 +26,11 @@ #pragma once #include +#include namespace ClangCodeModel { namespace Internal { +class ClangdClient; class ClangdQuickFixFactory : public CppEditor::CppQuickFixFactory { @@ -39,5 +41,15 @@ public: QuickFixOperations &result) override; }; +class ClangdQuickFixProvider : public LanguageClient::LanguageClientQuickFixProvider +{ +public: + ClangdQuickFixProvider(ClangdClient *client); + +private: + TextEditor::IAssistProcessor *createProcessor( + const TextEditor::AssistInterface *) const override; +}; + } // namespace Internal } // namespace ClangCodeModel diff --git a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp index 361bf191929..be9fce2a7d5 100644 --- a/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp +++ b/src/plugins/clangcodemodel/clangmodelmanagersupport.cpp @@ -27,7 +27,7 @@ #include "clangconstants.h" #include "clangdclient.h" -#include "clangdquickfixfactory.h" +#include "clangdquickfixes.h" #include "clangeditordocumentprocessor.h" #include "clangdlocatorfilters.h" #include "clangutils.h"