qmlls client: append builtin quickfixes to qmlls quickfixes

Fixes: QTCREATORBUG-31977
Change-Id: I6bb59a1606c87203a1c8f4e0cd410560b4ecc835
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
David Schulz
2024-11-21 06:30:58 +01:00
parent 083db7c5cf
commit 2aba646a5c
3 changed files with 59 additions and 11 deletions

View File

@@ -87,6 +87,22 @@ void LanguageClientQuickFixAssistProcessor::cancel()
}
}
QuickFixOperations LanguageClientQuickFixAssistProcessor::resultToOperations(const LanguageServerProtocol::CodeActionResult &result)
{
auto list = std::get_if<QList<std::variant<Command, CodeAction>>>(&result);
if (!list)
return {};
QuickFixOperations ops;
for (const std::variant<Command, CodeAction> &item : *list) {
if (auto action = std::get_if<CodeAction>(&item))
ops << new CodeActionQuickFixOperation(*action, m_client);
else if (auto command = std::get_if<Command>(&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<QList<std::variant<Command, CodeAction>>>(&result)) {
QuickFixOperations ops;
for (const std::variant<Command, CodeAction> &item : *list) {
if (auto action = std::get_if<CodeAction>(&item))
ops << new CodeActionQuickFixOperation(*action, m_client);
else if (auto command = std::get_if<Command>(&item))
ops << new CommandQuickFixOperation(*command, m_client);
}
return GenericProposal::createProposal(interface(), ops);
}
return nullptr;
return GenericProposal::createProposal(interface(), resultToOperations(result));
}
LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client)

View File

@@ -67,6 +67,8 @@ public:
void cancel() override;
protected:
TextEditor::QuickFixOperations resultToOperations(
const LanguageServerProtocol::CodeActionResult &result);
void setOnlyKinds(const QList<LanguageServerProtocol::CodeActionKind> &only);
Client *client() { return m_client; }

View File

@@ -6,12 +6,16 @@
#include "qmljseditorconstants.h"
#include "qmljseditortr.h"
#include "qmljseditorsettings.h"
#include "qmljsquickfix.h"
#include <languageclient/languageclientinterface.h>
#include <languageclient/languageclientmanager.h>
#include <languageclient/languageclientquickfix.h>
#include <projectexplorer/buildmanager.h>
#include <texteditor/codeassist/genericproposal.h>
#include <texteditor/codeassist/iassistprovider.h>
#include <texteditor/textdocument.h>
#include <texteditor/texteditor.h>
#include <texteditor/texteditorconstants.h>
@@ -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()