diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index a86b043bba5..39e4bccf4cd 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -280,7 +280,7 @@ Client::State Client::state() const return m_state; } -bool Client::openDocument(Core::IDocument *document) +bool Client::openDocument(TextEditor::TextDocument *document) { using namespace TextEditor; if (!isSupportedDocument(document)) @@ -291,9 +291,9 @@ bool Client::openDocument(Core::IDocument *document) if (!registered.value()) return false; const TextDocumentRegistrationOptions option( - m_dynamicCapabilities.option(method).toObject()); + m_dynamicCapabilities.option(method).toObject()); if (option.isValid(nullptr) - && !option.filterApplies(filePath, Utils::mimeTypeForName(document->mimeType()))) { + && !option.filterApplies(filePath, Utils::mimeTypeForName(document->mimeType()))) { return false; } } else if (Utils::optional _sync @@ -305,39 +305,35 @@ bool Client::openDocument(Core::IDocument *document) } auto uri = DocumentUri::fromFileName(filePath); showDiagnostics(uri); - auto textDocument = qobject_cast(document); + + connect(document, + &TextDocument::contentsChangedWithPosition, + this, + [this, document](int position, int charsRemoved, int charsAdded) { + documentContentsChanged(document, position, charsRemoved, charsAdded); + }); + + auto *oldCompletionProvider = qobject_cast( + document->completionAssistProvider()); + // only replace the completion assist provider if it is the default one or null + if (oldCompletionProvider || !document->completionAssistProvider()) + document->setCompletionAssistProvider(m_clientProviders.completionAssistProvider); + m_resetAssistProvider[document] = {oldCompletionProvider, + document->functionHintAssistProvider(), + document->quickFixAssistProvider()}; + document->setFunctionHintAssistProvider(m_clientProviders.functionHintProvider); + document->setQuickFixAssistProvider(m_clientProviders.quickFixAssistProvider); + connect(document, &QObject::destroyed, this, [this, document] { + m_resetAssistProvider.remove(document); + }); + const QString &text = document->plainText(); + m_openedDocument.insert(document->filePath(), text); + TextDocumentItem item; item.setLanguageId(TextDocumentItem::mimeTypeToLanguageId(document->mimeType())); item.setUri(uri); - item.setText(QString::fromUtf8(document->contents())); - item.setVersion(textDocument ? textDocument->document()->revision() : 0); - - if (textDocument) { - connect(textDocument, - &TextDocument::contentsChangedWithPosition, - this, - [this, textDocument](int position, int charsRemoved, int charsAdded) { - documentContentsChanged(textDocument, position, charsRemoved, charsAdded); - }); - - auto *oldCompletionProvider = qobject_cast( - textDocument->completionAssistProvider()); - // only replace the completion assist provider if it is the default one or null - if (oldCompletionProvider || !textDocument->completionAssistProvider()) - textDocument->setCompletionAssistProvider(m_clientProviders.completionAssistProvider); - m_resetAssistProvider[textDocument] = {oldCompletionProvider, - textDocument->functionHintAssistProvider(), - textDocument->quickFixAssistProvider()}; - textDocument->setFunctionHintAssistProvider(m_clientProviders.functionHintProvider); - textDocument->setQuickFixAssistProvider(m_clientProviders.quickFixAssistProvider); - connect(textDocument, &QObject::destroyed, this, [this, textDocument]{ - m_resetAssistProvider.remove(textDocument); - }); - m_openedDocument.insert(document->filePath(), textDocument->plainText()); - } else { - m_openedDocument.insert(document->filePath(), QString()); - } - + item.setText(text); + item.setVersion(document->document()->revision()); sendContent(DidOpenTextDocumentNotification(DidOpenTextDocumentParams(item))); return true; @@ -367,15 +363,14 @@ void Client::cancelRequest(const MessageId &id) sendContent(CancelRequest(CancelParameter(id))); } -void Client::closeDocument(Core::IDocument *document) +void Client::closeDocument(TextEditor::TextDocument *document) { m_openedDocument.remove(document->filePath()); const DocumentUri &uri = DocumentUri::fromFileName(document->filePath()); const DidCloseTextDocumentParams params(TextDocumentIdentifier{uri}); m_highlights[uri].clear(); sendContent(uri, DidCloseTextDocumentNotification(params)); - if (auto textDocument = qobject_cast(document)) - resetAssistProviders(textDocument); + resetAssistProviders(document); } bool Client::documentOpen(const Core::IDocument *document) const @@ -383,7 +378,7 @@ bool Client::documentOpen(const Core::IDocument *document) const return m_openedDocument.contains(document->filePath()); } -void Client::documentContentsSaved(Core::IDocument *document) +void Client::documentContentsSaved(TextEditor::TextDocument *document) { if (!m_openedDocument.contains(document->filePath())) return; @@ -413,7 +408,7 @@ void Client::documentContentsSaved(Core::IDocument *document) DidSaveTextDocumentParams params( TextDocumentIdentifier(DocumentUri::fromFileName(document->filePath()))); if (includeText) - params.setText(QString::fromUtf8(document->contents())); + params.setText(document->plainText()); sendContent(DidSaveTextDocumentNotification(params)); } @@ -744,7 +739,7 @@ void Client::setSupportedLanguage(const LanguageFilter &filter) m_languagFilter = filter; } -bool Client::isSupportedDocument(const Core::IDocument *document) const +bool Client::isSupportedDocument(const TextEditor::TextDocument *document) const { QTC_ASSERT(document, return false); return m_languagFilter.isSupported(document); @@ -836,13 +831,11 @@ void Client::showDiagnostics(Core::IDocument *doc) showDiagnostics(DocumentUri::fromFileName(doc->filePath())); } -void Client::hideDiagnostics(Core::IDocument *doc) +void Client::hideDiagnostics(TextEditor::TextDocument *doc) { - if (auto *textDocument = qobject_cast(doc)) { - DocumentUri uri = DocumentUri::fromFileName(doc->filePath()); - for (TextMark *mark : m_diagnostics.value(uri)) - textDocument->removeMark(mark); - } + DocumentUri uri = DocumentUri::fromFileName(doc->filePath()); + for (TextMark *mark : m_diagnostics.value(uri)) + doc->removeMark(mark); } const ServerCapabilities &Client::capabilities() const diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index fc7980ae1b9..460c6a9017d 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -95,10 +95,10 @@ public: bool reachable() const { return m_state == Initialized; } // document synchronization - bool openDocument(Core::IDocument *document); - void closeDocument(Core::IDocument *document); + bool openDocument(TextEditor::TextDocument *document); + void closeDocument(TextEditor::TextDocument *document); bool documentOpen(const Core::IDocument *document) const; - void documentContentsSaved(Core::IDocument *document); + void documentContentsSaved(TextEditor::TextDocument *document); void documentWillSave(Core::IDocument *document); void documentContentsChanged(TextEditor::TextDocument *document, int position, @@ -129,7 +129,7 @@ public: void cancelRequest(const LanguageServerProtocol::MessageId &id); void setSupportedLanguage(const LanguageFilter &filter); - bool isSupportedDocument(const Core::IDocument *document) const; + bool isSupportedDocument(const TextEditor::TextDocument *document) const; bool isSupportedFile(const Utils::FilePath &filePath, const QString &mimeType) const; bool isSupportedUri(const LanguageServerProtocol::DocumentUri &uri) const; @@ -155,7 +155,7 @@ public: { log(responseError.toString(), flag); } void showDiagnostics(Core::IDocument *doc); - void hideDiagnostics(Core::IDocument *doc); + void hideDiagnostics(TextEditor::TextDocument *doc); const LanguageServerProtocol::ServerCapabilities &capabilities() const; const DynamicCapabilities &dynamicCapabilities() const; diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 9f902bcae4b..d393fe799a5 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -201,7 +201,7 @@ LanguageClientManager *LanguageClientManager::instance() return managerInstance; } -QList LanguageClientManager::clientsSupportingDocument(const Core::IDocument *doc) +QList LanguageClientManager::clientsSupportingDocument(const TextEditor::TextDocument *doc) { QTC_ASSERT(managerInstance, return {}); QTC_ASSERT(doc, return {};); @@ -222,7 +222,7 @@ void LanguageClientManager::applySettings() &BaseSettings::needsRestart); for (BaseSettings *setting : restarts) { - QList documents; + QList documents; for (Client *client : clientForSetting(setting)) { documents << managerInstance->m_clientForDocument.keys(client); shutdownClient(client); @@ -232,7 +232,7 @@ void LanguageClientManager::applySettings() switch (setting->m_startBehavior) { case BaseSettings::AlwaysOn: { Client *client = startClient(setting); - for (Core::IDocument *document : documents) + for (TextEditor::TextDocument *document : documents) managerInstance->m_clientForDocument[document] = client; break; } @@ -242,7 +242,7 @@ void LanguageClientManager::applySettings() return filter.isSupported(doc); })) { Client *client = startClient(setting); - for (Core::IDocument *document : documents) + for (TextEditor::TextDocument *document : documents) managerInstance->m_clientForDocument[document] = client; } break; @@ -295,13 +295,13 @@ const BaseSettings *LanguageClientManager::settingForClient(Client *client) return nullptr; } -Client *LanguageClientManager::clientForDocument(Core::IDocument *document) +Client *LanguageClientManager::clientForDocument(TextEditor::TextDocument *document) { QTC_ASSERT(managerInstance, return nullptr); return document == nullptr ? nullptr : managerInstance->m_clientForDocument[document].data(); } -bool LanguageClientManager::reOpenDocumentWithClient(Core::IDocument *document, Client *client) +bool LanguageClientManager::reOpenDocumentWithClient(TextEditor::TextDocument *document, Client *client) { Utils::ExecuteOnDestruction outlineUpdater(&TextEditor::IOutlineWidgetFactory::updateOutline); if (Client *currentClient = clientForDocument(document)) { @@ -358,7 +358,7 @@ void LanguageClientManager::clientFinished(Client *client) } else { if (unexpectedFinish && !m_shuttingDown) client->log(tr("Unexpectedly finished."), Core::MessageManager::Flash); - for (Core::IDocument *document : m_clientForDocument.keys(client)) + for (TextEditor::TextDocument *document : m_clientForDocument.keys(client)) m_clientForDocument.remove(document); deleteClient(client); if (m_shuttingDown && m_clients.isEmpty()) @@ -394,7 +394,7 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor) }); }); updateEditorToolBar(editor); - if (Core::IDocument *document = editor->document()) { + if (TextEditor::TextDocument *document = textEditor->textDocument()) { if (Client *client = m_clientForDocument[document]) widget->addHoverHandler(client->hoverHandler()); } @@ -404,6 +404,10 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor) void LanguageClientManager::documentOpened(Core::IDocument *document) { + auto textDocument = qobject_cast(document); + if (!textDocument) + return; + // check whether we have to start servers for this document bool opened = false; for (BaseSettings *setting : LanguageClientSettings::currentPageSettings()) { @@ -434,7 +438,7 @@ void LanguageClientManager::documentOpened(Core::IDocument *document) continue; for (auto client : clients) { - if (openDocumentWithClient(document, client)) { + if (openDocumentWithClient(textDocument, client)) { opened = true; continue; } @@ -443,7 +447,8 @@ void LanguageClientManager::documentOpened(Core::IDocument *document) } } -bool LanguageClientManager::openDocumentWithClient(Core::IDocument *document, Client *client) +bool LanguageClientManager::openDocumentWithClient(TextEditor::TextDocument *document, + Client *client) { if (!client || client->state() == Client::Error) return false; @@ -455,21 +460,27 @@ bool LanguageClientManager::openDocumentWithClient(Core::IDocument *document, Cl void LanguageClientManager::documentClosed(Core::IDocument *document) { - for (Client *client : reachableClients()) - client->closeDocument(document); - m_clientForDocument.remove(document); + if (auto textDocument = qobject_cast(document)) { + for (Client *client : reachableClients()) + client->closeDocument(textDocument); + m_clientForDocument.remove(textDocument); + } } void LanguageClientManager::documentContentsSaved(Core::IDocument *document) { - for (Client *interface : reachableClients()) - interface->documentContentsSaved(document); + if (auto textDocument = qobject_cast(document)) { + for (Client *interface : reachableClients()) + interface->documentContentsSaved(textDocument); + } } void LanguageClientManager::documentWillSave(Core::IDocument *document) { - for (Client *interface : reachableClients()) - interface->documentWillSave(document); + if (auto textDocument = qobject_cast(document)) { + for (Client *interface : reachableClients()) + interface->documentWillSave(textDocument); + } } void LanguageClientManager::findLinkAt(const Utils::FilePath &filePath, diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index c8efa97f6c0..f12e2f9d487 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -70,14 +70,14 @@ public: static LanguageClientManager *instance(); - static QList clientsSupportingDocument(const Core::IDocument *doc); + static QList clientsSupportingDocument(const TextEditor::TextDocument *doc); static void applySettings(); static QList currentSettings(); static QVector clientForSetting(const BaseSettings *setting); static const BaseSettings *settingForClient(Client *setting); - static Client *clientForDocument(Core::IDocument *document); - static bool reOpenDocumentWithClient(Core::IDocument *document, Client *client); + static Client *clientForDocument(TextEditor::TextDocument *document); + static bool reOpenDocumentWithClient(TextEditor::TextDocument *document, Client *client); signals: void shutdownFinished(); @@ -87,7 +87,7 @@ private: void editorOpened(Core::IEditor *editor); void documentOpened(Core::IDocument *document); - bool openDocumentWithClient(Core::IDocument *document, Client *client); + bool openDocumentWithClient(TextEditor::TextDocument *document, Client *client); void documentClosed(Core::IDocument *document); void documentContentsSaved(Core::IDocument *document); void documentWillSave(Core::IDocument *document); @@ -108,7 +108,7 @@ private: QVector m_clients; QList m_currentSettings; // owned QMap> m_clientsForSetting; - QHash> m_clientForDocument; + QHash> m_clientForDocument; QHash> m_exclusiveRequests; DocumentLocatorFilter m_currentDocumentLocatorFilter; WorkspaceLocatorFilter m_workspaceLocatorFilter; diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp index 97ead56060f..c3c707a036a 100644 --- a/src/plugins/languageclient/languageclientutils.cpp +++ b/src/plugins/languageclient/languageclientutils.cpp @@ -201,8 +201,8 @@ void updateEditorToolBar(Core::IEditor *editor) if (!widget) return; - Core::IDocument *document = editor->document(); - Client *client = LanguageClientManager::clientForDocument(document); + TextDocument *document = textEditor->textDocument(); + Client *client = LanguageClientManager::clientForDocument(textEditor->textDocument()); static QMap actions; diff --git a/src/plugins/languageclient/locatorfilter.cpp b/src/plugins/languageclient/locatorfilter.cpp index de01cafcf63..28e750829be 100644 --- a/src/plugins/languageclient/locatorfilter.cpp +++ b/src/plugins/languageclient/locatorfilter.cpp @@ -56,10 +56,10 @@ DocumentLocatorFilter::DocumentLocatorFilter() void DocumentLocatorFilter::updateCurrentClient() { - Core::IDocument *document = Core::EditorManager::currentDocument(); resetSymbols(); disconnect(m_resetSymbolsConnection); + TextEditor::TextDocument *document = TextEditor::TextDocument::currentTextDocument(); if (Client *client = LanguageClientManager::clientForDocument(document)) { if (m_symbolCache != client->documentSymbolCache()) { disconnect(m_updateSymbolsConnection);