summaryrefslogtreecommitdiff
path: root/src/plugins/languageclient
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/languageclient')
-rw-r--r--src/plugins/languageclient/client.cpp77
-rw-r--r--src/plugins/languageclient/client.h11
-rw-r--r--src/plugins/languageclient/languageclient.pro6
-rw-r--r--src/plugins/languageclient/languageclient.qbs6
-rw-r--r--src/plugins/languageclient/languageclientcompletionassist.cpp (renamed from src/plugins/languageclient/languageclientcodeassist.cpp)2
-rw-r--r--src/plugins/languageclient/languageclientcompletionassist.h (renamed from src/plugins/languageclient/languageclientcodeassist.h)2
-rw-r--r--src/plugins/languageclient/languageclientquickfix.cpp166
-rw-r--r--src/plugins/languageclient/languageclientquickfix.h45
-rw-r--r--src/plugins/languageclient/languageclientsettings.cpp46
-rw-r--r--src/plugins/languageclient/languageclientutils.cpp18
-rw-r--r--src/plugins/languageclient/languageclientutils.h1
11 files changed, 335 insertions, 45 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp
index d401f452ac..dde08c6794 100644
--- a/src/plugins/languageclient/client.cpp
+++ b/src/plugins/languageclient/client.cpp
@@ -69,6 +69,7 @@ class TextMark : public TextEditor::TextMark
public:
TextMark(const Utils::FileName &fileName, const Diagnostic &diag)
: TextEditor::TextMark(fileName, diag.range().start().line() + 1, "lspmark")
+ , m_diagnostic(diag)
{
using namespace Utils;
setLineAnnotation(diag.message());
@@ -81,11 +82,17 @@ public:
setIcon(isError ? Icons::CODEMODEL_ERROR.icon()
: Icons::CODEMODEL_WARNING.icon());
}
+
+ const Diagnostic &diagnostic() const { return m_diagnostic; }
+
+private:
+ const Diagnostic m_diagnostic;
};
Client::Client(BaseClientInterface *clientInterface)
: m_id(Core::Id::fromString(QUuid::createUuid().toString()))
, m_completionProvider(this)
+ , m_quickFixProvider(this)
, m_clientInterface(clientInterface)
{
m_contentHandler.insert(JsonRpcMessageHandler::jsonRpcMimeType(),
@@ -101,8 +108,10 @@ Client::~Client()
using namespace TextEditor;
// FIXME: instead of replacing the completion provider in the text document store the
// completion provider as a prioritised list in the text document
- for (TextDocument *document : m_resetCompletionProvider)
+ for (TextDocument *document : m_resetAssistProvider) {
document->setCompletionAssistProvider(nullptr);
+ document->setQuickFixAssistProvider(nullptr);
+ }
for (Core::IEditor * editor : Core::DocumentModel::editorsForOpenedDocuments()) {
if (auto textEditor = qobject_cast<BaseTextEditor *>(editor)) {
TextEditorWidget *widget = textEditor->editorWidget();
@@ -192,10 +201,12 @@ void Client::openDocument(Core::IDocument *document)
documentContentsChanged(document);
});
if (textDocument) {
- m_resetCompletionProvider << textDocument;
+ textDocument->completionAssistProvider();
+ m_resetAssistProvider << textDocument;
textDocument->setCompletionAssistProvider(&m_completionProvider);
+ textDocument->setQuickFixAssistProvider(&m_quickFixProvider);
connect(textDocument, &QObject::destroyed, this, [this, textDocument]{
- m_resetCompletionProvider.remove(textDocument);
+ m_resetAssistProvider.remove(textDocument);
});
if (BaseTextEditor *editor = BaseTextEditor::textEditorForDocument(textDocument)) {
if (QPointer<TextEditorWidget> widget = editor->editorWidget()) {
@@ -543,25 +554,10 @@ void Client::cursorPositionChanged(TextEditor::TextEditorWidget *widget)
void Client::requestCodeActions(const DocumentUri &uri, const QList<Diagnostic> &diagnostics)
{
const Utils::FileName fileName = uri.toFileName();
- TextEditor::TextDocument *doc = textDocumentForFileName(fileName);
+ TextEditor::TextDocument *doc = TextEditor::TextDocument::textDocumentForFileName(fileName);
if (!doc)
return;
- const QString method(CodeActionRequest::methodName);
- if (Utils::optional<bool> registered = m_dynamicCapabilities.isRegistered(method)) {
- if (!registered.value())
- return;
- const TextDocumentRegistrationOptions option(
- m_dynamicCapabilities.option(method).toObject());
- if (option.isValid(nullptr) && !option.filterApplies(fileName))
- return;
- } else {
- Utils::variant<bool, CodeActionOptions> provider
- = m_serverCapabilities.codeActionProvider().value_or(false);
- if (!(Utils::holds_alternative<CodeActionOptions>(provider) || Utils::get<bool>(provider)))
- return;
- }
-
CodeActionParams codeActionParams;
CodeActionParams::CodeActionContext context;
context.setDiagnostics(diagnostics);
@@ -577,6 +573,32 @@ void Client::requestCodeActions(const DocumentUri &uri, const QList<Diagnostic>
if (self)
self->handleCodeActionResponse(response, uri);
});
+ requestCodeActions(request);
+}
+
+void Client::requestCodeActions(const CodeActionRequest &request)
+{
+ if (!request.isValid(nullptr))
+ return;
+
+ const Utils::FileName fileName
+ = request.params().value_or(CodeActionParams()).textDocument().uri().toFileName();
+
+ const QString method(CodeActionRequest::methodName);
+ if (Utils::optional<bool> registered = m_dynamicCapabilities.isRegistered(method)) {
+ if (!registered.value())
+ return;
+ const TextDocumentRegistrationOptions option(
+ m_dynamicCapabilities.option(method).toObject());
+ if (option.isValid(nullptr) && !option.filterApplies(fileName))
+ return;
+ } else {
+ Utils::variant<bool, CodeActionOptions> provider
+ = m_serverCapabilities.codeActionProvider().value_or(false);
+ if (!(Utils::holds_alternative<CodeActionOptions>(provider) || Utils::get<bool>(provider)))
+ return;
+ }
+
sendContent(request);
}
@@ -682,6 +704,17 @@ bool Client::needsRestart(const BaseSettings *settings) const
|| m_languagFilter.filePattern != settings->m_languageFilter.filePattern;
}
+QList<Diagnostic> Client::diagnosticsAt(const DocumentUri &uri, const Range &range) const
+{
+ QList<Diagnostic> diagnostics;
+ for (const TextMark *mark : m_diagnostics[uri]) {
+ const Diagnostic diagnostic = mark->diagnostic();
+ if (diagnostic.range().overlaps(range))
+ diagnostics << diagnostic;
+ }
+ return diagnostics;
+}
+
bool Client::start()
{
return m_clientInterface->start();
@@ -778,7 +811,8 @@ void Client::showMessageBox(const ShowMessageRequestParams &message, const Messa
void Client::showDiagnostics(const DocumentUri &uri)
{
- if (TextEditor::TextDocument *doc = textDocumentForFileName(uri.toFileName())) {
+ if (TextEditor::TextDocument *doc
+ = TextEditor::TextDocument::textDocumentForFileName(uri.toFileName())) {
for (TextMark *mark : m_diagnostics.value(uri))
doc->addMark(mark);
}
@@ -786,7 +820,8 @@ void Client::showDiagnostics(const DocumentUri &uri)
void Client::removeDiagnostics(const DocumentUri &uri)
{
- TextEditor::TextDocument *doc = textDocumentForFileName(uri.toFileName());
+ TextEditor::TextDocument *doc
+ = TextEditor::TextDocument::textDocumentForFileName(uri.toFileName());
for (TextMark *mark : m_diagnostics.take(uri)) {
if (doc)
diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h
index 3d691f2bd2..2d92424f42 100644
--- a/src/plugins/languageclient/client.h
+++ b/src/plugins/languageclient/client.h
@@ -26,7 +26,8 @@
#pragma once
#include "dynamiccapabilities.h"
-#include "languageclientcodeassist.h"
+#include "languageclientcompletionassist.h"
+#include "languageclientquickfix.h"
#include "languageclientsettings.h"
#include <coreplugin/id.h>
@@ -104,6 +105,7 @@ public:
void requestCodeActions(const LanguageServerProtocol::DocumentUri &uri,
const QList<LanguageServerProtocol::Diagnostic> &diagnostics);
+ void requestCodeActions(const LanguageServerProtocol::CodeActionRequest &request);
void handleCodeActionResponse(const LanguageServerProtocol::CodeActionRequest::Response &response,
const LanguageServerProtocol::DocumentUri &uri);
void executeCommand(const LanguageServerProtocol::Command &command);
@@ -129,6 +131,10 @@ public:
bool needsRestart(const BaseSettings *) const;
+ QList<LanguageServerProtocol::Diagnostic> diagnosticsAt(
+ const LanguageServerProtocol::DocumentUri &uri,
+ const LanguageServerProtocol::Range &range) const;
+
bool start();
bool reset();
@@ -184,7 +190,8 @@ private:
LanguageServerProtocol::ServerCapabilities m_serverCapabilities;
DynamicCapabilities m_dynamicCapabilities;
LanguageClientCompletionAssistProvider m_completionProvider;
- QSet<TextEditor::TextDocument *> m_resetCompletionProvider;
+ LanguageClientQuickFixProvider m_quickFixProvider;
+ QSet<TextEditor::TextDocument *> m_resetAssistProvider;
QHash<LanguageServerProtocol::DocumentUri, LanguageServerProtocol::MessageId> m_highlightRequests;
int m_restartsLeft = 5;
QScopedPointer<BaseClientInterface> m_clientInterface;
diff --git a/src/plugins/languageclient/languageclient.pro b/src/plugins/languageclient/languageclient.pro
index 59c568a75b..dbae20e109 100644
--- a/src/plugins/languageclient/languageclient.pro
+++ b/src/plugins/languageclient/languageclient.pro
@@ -6,11 +6,12 @@ HEADERS += \
client.h \
dynamiccapabilities.h \
languageclient_global.h \
- languageclientcodeassist.h \
+ languageclientcompletionassist.h \
languageclientinterface.h \
languageclientmanager.h \
languageclientoutline.h \
languageclientplugin.h \
+ languageclientquickfix.h \
languageclientsettings.h \
languageclientutils.h
@@ -18,11 +19,12 @@ HEADERS += \
SOURCES += \
client.cpp \
dynamiccapabilities.cpp \
- languageclientcodeassist.cpp \
+ languageclientcompletionassist.cpp \
languageclientinterface.cpp \
languageclientmanager.cpp \
languageclientoutline.cpp \
languageclientplugin.cpp \
+ languageclientquickfix.cpp \
languageclientsettings.cpp \
languageclientutils.cpp
diff --git a/src/plugins/languageclient/languageclient.qbs b/src/plugins/languageclient/languageclient.qbs
index 0da6a58076..0c2752ef5e 100644
--- a/src/plugins/languageclient/languageclient.qbs
+++ b/src/plugins/languageclient/languageclient.qbs
@@ -20,16 +20,18 @@ QtcPlugin {
"dynamiccapabilities.h",
"languageclient.qrc",
"languageclient_global.h",
- "languageclientcodeassist.cpp",
- "languageclientcodeassist.h",
"languageclientinterface.cpp",
"languageclientinterface.h",
+ "languageclientcompletionassist.cpp",
+ "languageclientcompletionassist.h",
"languageclientmanager.cpp",
"languageclientmanager.h",
"languageclientoutline.cpp",
"languageclientoutline.h",
"languageclientplugin.cpp",
"languageclientplugin.h",
+ "languageclientquickfix.cpp",
+ "languageclientquickfix.h",
"languageclientsettings.cpp",
"languageclientsettings.h",
"languageclientutils.cpp",
diff --git a/src/plugins/languageclient/languageclientcodeassist.cpp b/src/plugins/languageclient/languageclientcompletionassist.cpp
index af0e9ce892..1d9a10f6e4 100644
--- a/src/plugins/languageclient/languageclientcodeassist.cpp
+++ b/src/plugins/languageclient/languageclientcompletionassist.cpp
@@ -23,7 +23,7 @@
**
****************************************************************************/
-#include "languageclientcodeassist.h"
+#include "languageclientcompletionassist.h"
#include "client.h"
#include "languageclientutils.h"
diff --git a/src/plugins/languageclient/languageclientcodeassist.h b/src/plugins/languageclient/languageclientcompletionassist.h
index 1410e67f82..f0ad95bc88 100644
--- a/src/plugins/languageclient/languageclientcodeassist.h
+++ b/src/plugins/languageclient/languageclientcompletionassist.h
@@ -48,7 +48,7 @@ public:
private:
QList<QString> m_triggerChars;
int m_activationCharSequenceLength = 0;
- Client *m_client;
+ Client *m_client = nullptr; // not owned
};
} // namespace LanguageClient
diff --git a/src/plugins/languageclient/languageclientquickfix.cpp b/src/plugins/languageclient/languageclientquickfix.cpp
new file mode 100644
index 0000000000..def01b17d8
--- /dev/null
+++ b/src/plugins/languageclient/languageclientquickfix.cpp
@@ -0,0 +1,166 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#include "languageclientquickfix.h"
+
+#include "client.h"
+#include "languageclientutils.h"
+
+#include <texteditor/codeassist/assistinterface.h>
+#include <texteditor/codeassist/genericproposal.h>
+#include <texteditor/codeassist/iassistprocessor.h>
+#include <texteditor/quickfix.h>
+
+
+using namespace LanguageServerProtocol;
+using namespace TextEditor;
+
+namespace LanguageClient {
+
+class CodeActionQuickFixOperation : public QuickFixOperation
+{
+public:
+ CodeActionQuickFixOperation(const CodeAction &action, Client *client)
+ : m_action(action)
+ , m_client(client)
+ { setDescription(action.title()); }
+
+ void perform() override
+ {
+ if (Utils::optional<WorkspaceEdit> edit = m_action.edit()) {
+ applyWorkspaceEdit(*edit);
+ } else if (Utils::optional<Command> command = m_action.command()) {
+ if (m_client)
+ m_client->executeCommand(*command);
+ }
+ }
+
+private:
+ CodeAction m_action;
+ QPointer<Client> m_client;
+};
+
+class CommandQuickFixOperation : public QuickFixOperation
+{
+public:
+ CommandQuickFixOperation(const Command &command, Client *client)
+ : m_command(command)
+ , m_client(client)
+ { setDescription(command.title()); }
+ void perform() override
+ {
+ if (m_client)
+ m_client->executeCommand(m_command);
+ }
+
+private:
+ Command m_command;
+ QPointer<Client> m_client;
+};
+
+class LanguageClientQuickFixAssistProcessor : public IAssistProcessor
+{
+public:
+ explicit LanguageClientQuickFixAssistProcessor(Client *client) : m_client(client) {}
+ bool running() override { return m_running; }
+ IAssistProposal *perform(const AssistInterface *interface) override;
+
+private:
+ void handleCodeActionResponse(const CodeActionRequest::Response &response);
+
+ QSharedPointer<const AssistInterface> m_assistInterface;
+ Client *m_client = nullptr; // not owned
+ bool m_running = false;
+};
+
+IAssistProposal *LanguageClientQuickFixAssistProcessor::perform(const AssistInterface *interface)
+{
+ m_assistInterface = QSharedPointer<const AssistInterface>(interface);
+
+ CodeActionParams params;
+ params.setContext({});
+ QTextCursor cursor(interface->textDocument());
+ cursor.setPosition(interface->position());
+ if (cursor.atBlockEnd() || cursor.atBlockStart())
+ cursor.select(QTextCursor::LineUnderCursor);
+ else
+ cursor.select(QTextCursor::WordUnderCursor);
+ if (!cursor.hasSelection())
+ cursor.select(QTextCursor::LineUnderCursor);
+ Range range(cursor);
+ params.setRange(range);
+ auto uri = DocumentUri::fromFileName(Utils::FileName::fromString(interface->fileName()));
+ params.setTextDocument(uri);
+ CodeActionParams::CodeActionContext context;
+ context.setDiagnostics(m_client->diagnosticsAt(uri, range));
+ params.setContext(context);
+
+ CodeActionRequest request(params);
+ request.setResponseCallback([this](const CodeActionRequest::Response &response){
+ handleCodeActionResponse(response);
+ });
+
+ m_client->requestCodeActions(request);
+ m_running = true;
+ return nullptr;
+}
+
+void LanguageClientQuickFixAssistProcessor::handleCodeActionResponse(
+ const CodeActionRequest::Response &response)
+{
+ m_running = false;
+ if (const Utils::optional<CodeActionRequest::Response::Error> &error = response.error())
+ m_client->log(*error);
+ QuickFixOperations ops;
+ if (const Utils::optional<CodeActionResult> &_result = response.result()) {
+ const CodeActionResult &result = _result.value();
+ if (auto list = Utils::get_if<QList<Utils::variant<Command, CodeAction>>>(&result)) {
+ for (const Utils::variant<Command, CodeAction> &item : *list) {
+ if (auto action = Utils::get_if<CodeAction>(&item))
+ ops << new CodeActionQuickFixOperation(*action, m_client);
+ else if (auto command = Utils::get_if<Command>(&item))
+ ops << new CommandQuickFixOperation(*command, m_client);
+ }
+ }
+ }
+ setAsyncProposalAvailable(GenericProposal::createProposal(m_assistInterface.data(), ops));
+}
+
+LanguageClientQuickFixProvider::LanguageClientQuickFixProvider(Client *client) : m_client(client)
+{
+ QTC_CHECK(client);
+}
+
+IAssistProvider::RunType LanguageClientQuickFixProvider::runType() const
+{
+ return Asynchronous;
+}
+
+IAssistProcessor *LanguageClientQuickFixProvider::createProcessor() const
+{
+ return new LanguageClientQuickFixAssistProcessor(m_client);
+}
+
+} // namespace LanguageClient
diff --git a/src/plugins/languageclient/languageclientquickfix.h b/src/plugins/languageclient/languageclientquickfix.h
new file mode 100644
index 0000000000..d9b322769f
--- /dev/null
+++ b/src/plugins/languageclient/languageclientquickfix.h
@@ -0,0 +1,45 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt Creator.
+**
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+****************************************************************************/
+
+#pragma once
+
+#include <texteditor/codeassist/iassistprovider.h>
+
+namespace LanguageClient {
+
+class Client;
+
+class LanguageClientQuickFixProvider : public TextEditor::IAssistProvider
+{
+public:
+ explicit LanguageClientQuickFixProvider(Client *client);
+ IAssistProvider::RunType runType() const override;
+ TextEditor::IAssistProcessor *createProcessor() const override;
+
+private:
+ Client *m_client = nullptr; // not owned
+};
+
+} // namespace LanguageClient
diff --git a/src/plugins/languageclient/languageclientsettings.cpp b/src/plugins/languageclient/languageclientsettings.cpp
index e101db412c..17ea39f80e 100644
--- a/src/plugins/languageclient/languageclientsettings.cpp
+++ b/src/plugins/languageclient/languageclientsettings.cpp
@@ -34,9 +34,8 @@
#include <utils/algorithm.h>
#include <utils/delegates.h>
#include <utils/fancylineedit.h>
-#include <utils/qtcprocess.h>
#include <utils/mimetypes/mimedatabase.h>
-#include <languageserverprotocol/lsptypes.h>
+#include <utils/jsontreeitem.h>
#include <QBoxLayout>
#include <QCheckBox>
@@ -150,7 +149,6 @@ LanguageClientSettingsPageWidget::LanguageClientSettingsPageWidget(LanguageClien
connect(addButton, &QPushButton::pressed, this, &LanguageClientSettingsPageWidget::addItem);
auto deleteButton = new QPushButton(LanguageClientSettingsPage::tr("&Delete"));
connect(deleteButton, &QPushButton::pressed, this, &LanguageClientSettingsPageWidget::deleteItem);
-
mainLayout->addLayout(layout);
setLayout(mainLayout);
layout->addWidget(m_view);
@@ -505,6 +503,24 @@ BaseClientInterface *StdIOSettings::createInterface() const
return new StdIOClientInterface(m_executable, m_arguments);
}
+static QWidget *createCapabilitiesView(
+ const LanguageServerProtocol::ServerCapabilities &capabilities)
+{
+ auto root = new Utils::JsonTreeItem("Capabilities", QJsonValue(capabilities));
+ if (root->canFetchMore())
+ root->fetchMore();
+
+ auto capabilitiesModel = new Utils::TreeModel<Utils::JsonTreeItem>(root);
+ capabilitiesModel->setHeader({BaseSettingsWidget::tr("Name"),
+ BaseSettingsWidget::tr("Value"),
+ BaseSettingsWidget::tr("Type")});
+ auto capabilitiesView = new QTreeView();
+ capabilitiesView->setModel(capabilitiesModel);
+ capabilitiesView->setAlternatingRowColors(true);
+ capabilitiesView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
+ return capabilitiesView;
+}
+
BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *parent)
: QWidget(parent)
, m_name(new QLineEdit(settings->m_name, this))
@@ -528,6 +544,30 @@ BaseSettingsWidget::BaseSettingsWidget(const BaseSettings *settings, QWidget *pa
connect(addMimeTypeButton, &QPushButton::pressed,
this, &BaseSettingsWidget::showAddMimeTypeDialog);
+ auto createInfoLabel = []() {
+ return new QLabel(tr("Available after server was initialized"));
+ };
+
+ mainLayout->addWidget(new QLabel(tr("Capabilities:")), ++row, 0, Qt::AlignTop);
+ if (Client *client = settings->m_client.data()) {
+ if (client->state() == Client::Initialized)
+ mainLayout->addWidget(createCapabilitiesView(client->capabilities()));
+ else
+ mainLayout->addWidget(createInfoLabel(), row, 1);
+ connect(client, &Client::finished, mainLayout, [mainLayout, row, createInfoLabel]() {
+ delete mainLayout->itemAtPosition(row, 1)->widget();
+ mainLayout->addWidget(createInfoLabel(), row, 1);
+ });
+ connect(client, &Client::initialized, mainLayout,
+ [mainLayout, row](
+ const LanguageServerProtocol::ServerCapabilities &capabilities) {
+ delete mainLayout->itemAtPosition(row, 1)->widget();
+ mainLayout->addWidget(createCapabilitiesView(capabilities), row, 1);
+ });
+ } else {
+ mainLayout->addWidget(createInfoLabel());
+ }
+
setLayout(mainLayout);
}
diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp
index 5f3f8e0672..f81be2427c 100644
--- a/src/plugins/languageclient/languageclientutils.cpp
+++ b/src/plugins/languageclient/languageclientutils.cpp
@@ -40,6 +40,7 @@
using namespace LanguageServerProtocol;
using namespace Utils;
+using namespace TextEditor;
namespace LanguageClient {
@@ -72,7 +73,7 @@ bool applyTextDocumentEdit(const TextDocumentEdit &edit)
if (edits.isEmpty())
return true;
const DocumentUri &uri = edit.id().uri();
- if (TextEditor::TextDocument* doc = textDocumentForFileName(uri.toFileName())) {
+ if (TextDocument* doc = TextDocument::textDocumentForFileName(uri.toFileName())) {
LanguageClientValue<int> version = edit.id().version();
if (!version.isNull() && version.value(0) < doc->document()->revision())
return false;
@@ -84,14 +85,14 @@ bool applyTextEdits(const DocumentUri &uri, const QList<TextEdit> &edits)
{
if (edits.isEmpty())
return true;
- TextEditor::RefactoringChanges changes;
- TextEditor::RefactoringFilePtr file;
+ RefactoringChanges changes;
+ RefactoringFilePtr file;
file = changes.file(uri.toFileName().toString());
file->setChangeSet(editsToChangeSet(edits, file->document()));
return file->apply();
}
-void applyTextEdit(TextEditor::TextDocumentManipulatorInterface &manipulator, const TextEdit &edit)
+void applyTextEdit(TextDocumentManipulatorInterface &manipulator, const TextEdit &edit)
{
using namespace Utils::Text;
const Range range = edit.range();
@@ -118,12 +119,6 @@ bool applyWorkspaceEdit(const WorkspaceEdit &edit)
return result;
}
-TextEditor::TextDocument *textDocumentForFileName(const FileName &fileName)
-{
- return qobject_cast<TextEditor::TextDocument *>(
- Core::DocumentModel::documentForFilePath(fileName.toString()));
-}
-
QTextCursor endOfLineCursor(const QTextCursor &cursor)
{
QTextCursor ret = cursor;
@@ -135,8 +130,7 @@ void updateCodeActionRefactoringMarker(Client *client,
const CodeAction &action,
const DocumentUri &uri)
{
- using namespace TextEditor;
- TextDocument* doc = textDocumentForFileName(uri.toFileName());
+ TextDocument* doc = TextDocument::textDocumentForFileName(uri.toFileName());
if (!doc)
return;
BaseTextEditor *editor = BaseTextEditor::textEditorForDocument(doc);
diff --git a/src/plugins/languageclient/languageclientutils.h b/src/plugins/languageclient/languageclientutils.h
index 2891c2d303..f07b6e18bf 100644
--- a/src/plugins/languageclient/languageclientutils.h
+++ b/src/plugins/languageclient/languageclientutils.h
@@ -45,7 +45,6 @@ bool applyTextEdits(const LanguageServerProtocol::DocumentUri &uri,
const QList<LanguageServerProtocol::TextEdit> &edits);
void applyTextEdit(TextEditor::TextDocumentManipulatorInterface &manipulator,
const LanguageServerProtocol::TextEdit &edit);
-TextEditor::TextDocument *textDocumentForFileName(const Utils::FileName &fileName);
void updateCodeActionRefactoringMarker(Client *client,
const LanguageServerProtocol::CodeAction &action,
const LanguageServerProtocol::DocumentUri &uri);