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)
|
void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeActionRequest::Response &response)
|
||||||
{
|
{
|
||||||
m_currentRequest.reset();
|
m_currentRequest.reset();
|
||||||
@@ -101,17 +117,7 @@ void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(const CodeA
|
|||||||
|
|
||||||
GenericProposal *LanguageClientQuickFixAssistProcessor::handleCodeActionResult(const CodeActionResult &result)
|
GenericProposal *LanguageClientQuickFixAssistProcessor::handleCodeActionResult(const CodeActionResult &result)
|
||||||
{
|
{
|
||||||
if (auto list = std::get_if<QList<std::variant<Command, CodeAction>>>(&result)) {
|
return GenericProposal::createProposal(interface(), resultToOperations(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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client)
|
LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client)
|
||||||
|
@@ -67,6 +67,8 @@ public:
|
|||||||
void cancel() override;
|
void cancel() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
TextEditor::QuickFixOperations resultToOperations(
|
||||||
|
const LanguageServerProtocol::CodeActionResult &result);
|
||||||
void setOnlyKinds(const QList<LanguageServerProtocol::CodeActionKind> &only);
|
void setOnlyKinds(const QList<LanguageServerProtocol::CodeActionKind> &only);
|
||||||
Client *client() { return m_client; }
|
Client *client() { return m_client; }
|
||||||
|
|
||||||
|
@@ -6,12 +6,16 @@
|
|||||||
#include "qmljseditorconstants.h"
|
#include "qmljseditorconstants.h"
|
||||||
#include "qmljseditortr.h"
|
#include "qmljseditortr.h"
|
||||||
#include "qmljseditorsettings.h"
|
#include "qmljseditorsettings.h"
|
||||||
|
#include "qmljsquickfix.h"
|
||||||
|
|
||||||
#include <languageclient/languageclientinterface.h>
|
#include <languageclient/languageclientinterface.h>
|
||||||
#include <languageclient/languageclientmanager.h>
|
#include <languageclient/languageclientmanager.h>
|
||||||
|
#include <languageclient/languageclientquickfix.h>
|
||||||
|
|
||||||
#include <projectexplorer/buildmanager.h>
|
#include <projectexplorer/buildmanager.h>
|
||||||
|
|
||||||
|
#include <texteditor/codeassist/genericproposal.h>
|
||||||
|
#include <texteditor/codeassist/iassistprovider.h>
|
||||||
#include <texteditor/textdocument.h>
|
#include <texteditor/textdocument.h>
|
||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
#include <texteditor/texteditorconstants.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)
|
QmllsClient::QmllsClient(StdIOClientInterface *interface)
|
||||||
: Client(interface)
|
: Client(interface)
|
||||||
{
|
{
|
||||||
@@ -178,6 +217,7 @@ QmllsClient::QmllsClient(StdIOClientInterface *interface)
|
|||||||
}
|
}
|
||||||
return std::nullopt;
|
return std::nullopt;
|
||||||
});
|
});
|
||||||
|
setQuickFixAssistProvider(new QmllsQuickFixAssistProvider(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
QmllsClient::~QmllsClient()
|
QmllsClient::~QmllsClient()
|
||||||
|
Reference in New Issue
Block a user