diff --git a/src/plugins/languageclient/languageclientquickfix.cpp b/src/plugins/languageclient/languageclientquickfix.cpp index 1f882608771..e14c66d138a 100644 --- a/src/plugins/languageclient/languageclientquickfix.cpp +++ b/src/plugins/languageclient/languageclientquickfix.cpp @@ -87,6 +87,22 @@ void LanguageClientQuickFixAssistProcessor::cancel() } } +QuickFixOperations LanguageClientQuickFixAssistProcessor::resultToOperations(const LanguageServerProtocol::CodeActionResult &result) +{ + auto list = std::get_if>>(&result); + if (!list) + return {}; + + QuickFixOperations ops; + for (const std::variant &item : *list) { + if (auto action = std::get_if(&item)) + ops << new CodeActionQuickFixOperation(*action, m_client); + else if (auto command = std::get_if(&item)) + ops << new CommandQuickFixOperation(*command, m_client); + } + return ops; +} + void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeActionRequest::Response &response) { m_currentRequest.reset(); @@ -101,17 +117,7 @@ void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeA GenericProposal *LanguageClientQuickFixAssistProcessor::handleCodeActionResult(const CodeActionResult &result) { - if (auto list = std::get_if>>(&result)) { - QuickFixOperations ops; - for (const std::variant &item : *list) { - if (auto action = std::get_if(&item)) - ops << new CodeActionQuickFixOperation(*action, m_client); - else if (auto command = std::get_if(&item)) - ops << new CommandQuickFixOperation(*command, m_client); - } - return GenericProposal::createProposal(interface(), ops); - } - return nullptr; + return GenericProposal::createProposal(interface(), resultToOperations(result)); } LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client) diff --git a/src/plugins/languageclient/languageclientquickfix.h b/src/plugins/languageclient/languageclientquickfix.h index d83a236170b..5fe85034b1a 100644 --- a/src/plugins/languageclient/languageclientquickfix.h +++ b/src/plugins/languageclient/languageclientquickfix.h @@ -67,6 +67,8 @@ public: void cancel() override; protected: + TextEditor::QuickFixOperations resultToOperations( + const LanguageServerProtocol::CodeActionResult &result); void setOnlyKinds(const QList &only); Client *client() { return m_client; } diff --git a/src/plugins/qmljseditor/qmllsclient.cpp b/src/plugins/qmljseditor/qmllsclient.cpp index 6bb253f2932..1fdc30a124a 100644 --- a/src/plugins/qmljseditor/qmllsclient.cpp +++ b/src/plugins/qmljseditor/qmllsclient.cpp @@ -6,12 +6,16 @@ #include "qmljseditorconstants.h" #include "qmljseditortr.h" #include "qmljseditorsettings.h" +#include "qmljsquickfix.h" #include #include +#include #include +#include +#include #include #include #include @@ -107,6 +111,41 @@ void QmllsClient::updateQmllsSemanticHighlightingCapability() } } +class QmllsQuickFixAssistProcessor : public LanguageClientQuickFixAssistProcessor +{ +public: + using LanguageClientQuickFixAssistProcessor::LanguageClientQuickFixAssistProcessor; +private: + TextEditor::GenericProposal *perform() override + { + // Step 1: Collect qmlls code actions asynchronously + LanguageClientQuickFixAssistProcessor::perform(); + + // Step 2: Collect built-in quickfixes synchronously + m_builtinOps = findQmlJSQuickFixes(interface()); + + return nullptr; + } + + TextEditor::GenericProposal *handleCodeActionResult(const LanguageServerProtocol::CodeActionResult &result) override + { + return TextEditor::GenericProposal::createProposal( + interface(), resultToOperations(result) + m_builtinOps); + } + + QuickFixOperations m_builtinOps; +}; + +class QmllsQuickFixAssistProvider : public LanguageClientQuickFixProvider +{ +public: + using LanguageClientQuickFixProvider::LanguageClientQuickFixProvider; + TextEditor::IAssistProcessor *createProcessor(const TextEditor::AssistInterface *) const override + { + return new QmllsQuickFixAssistProcessor(client()); + } +}; + QmllsClient::QmllsClient(StdIOClientInterface *interface) : Client(interface) { @@ -178,6 +217,7 @@ QmllsClient::QmllsClient(StdIOClientInterface *interface) } return std::nullopt; }); + setQuickFixAssistProvider(new QmllsQuickFixAssistProvider(this)); } QmllsClient::~QmllsClient()