forked from qt-creator/qt-creator
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:
@@ -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)
|
||||
|
@@ -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; }
|
||||
|
||||
|
@@ -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()
|
||||
|
Reference in New Issue
Block a user