From 9938fffe067d5077ee95e9485b3caa805c0488ca Mon Sep 17 00:00:00 2001 From: David Schulz Date: Mon, 23 Jan 2023 11:27:38 +0100 Subject: [PATCH] LanguageClient: close and reopen renamed documents That is the way accoarding to https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textDocument_didRename Change-Id: Ibed1873ac85eb2e9074481537a34f959a55a6f71 Reviewed-by: Christian Kandeler --- src/plugins/languageclient/client.cpp | 18 ++++++++++++++++-- src/plugins/languageclient/client.h | 3 ++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 29f94eef7d7..0efaacd3500 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -273,9 +273,11 @@ public: ~OpenedDocument() { QObject::disconnect(contentsChangedConnection); + QObject::disconnect(filePathChangedConnection); delete document; } QMetaObject::Connection contentsChangedConnection; + QMetaObject::Connection filePathChangedConnection; QTextDocument *document = nullptr; }; QMap m_openedDocument; @@ -623,6 +625,17 @@ void Client::openDocument(TextEditor::TextDocument *document) [this, document](int position, int charsRemoved, int charsAdded) { documentContentsChanged(document, position, charsRemoved, charsAdded); }); + d->m_openedDocument[document].filePathChangedConnection + = connect(document, + &TextDocument::filePathChanged, + this, + [this, document](const FilePath &oldPath, const FilePath &newPath) { + if (oldPath == newPath) + return; + closeDocument(document, oldPath); + if (isSupportedDocument(document)) + openDocument(document); + }); if (!d->m_documentVersions.contains(filePath)) d->m_documentVersions[filePath] = 0; d->sendOpenNotification(filePath, document->mimeType(), document->plainText(), @@ -661,7 +674,8 @@ void Client::cancelRequest(const MessageId &id) sendMessage(CancelRequest(CancelParameter(id)), SendDocUpdates::Ignore); } -void Client::closeDocument(TextEditor::TextDocument *document) +void Client::closeDocument(TextEditor::TextDocument *document, + const std::optional &overwriteFilePath) { deactivateDocument(document); d->m_postponedDocuments.remove(document); @@ -669,7 +683,7 @@ void Client::closeDocument(TextEditor::TextDocument *document) if (d->m_openedDocument.remove(document) != 0) { handleDocumentClosed(document); if (d->m_state == Initialized) - d->sendCloseNotification(document->filePath()); + d->sendCloseNotification(overwriteFilePath.value_or(document->filePath())); } if (d->m_state != Initialized) diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 9d36ecc9f79..525739d7a63 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -110,7 +110,8 @@ public: bool isSupportedFile(const Utils::FilePath &filePath, const QString &mimeType) const; bool isSupportedUri(const LanguageServerProtocol::DocumentUri &uri) const; virtual void openDocument(TextEditor::TextDocument *document); - void closeDocument(TextEditor::TextDocument *document); + void closeDocument(TextEditor::TextDocument *document, + const std::optional &overwriteFilePath = {}); void activateDocument(TextEditor::TextDocument *document); void activateEditor(Core::IEditor *editor); void deactivateDocument(TextEditor::TextDocument *document);