forked from qt-creator/qt-creator
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 <christian.kandeler@qt.io>
This commit is contained in:
@@ -273,9 +273,11 @@ public:
|
||||
~OpenedDocument()
|
||||
{
|
||||
QObject::disconnect(contentsChangedConnection);
|
||||
QObject::disconnect(filePathChangedConnection);
|
||||
delete document;
|
||||
}
|
||||
QMetaObject::Connection contentsChangedConnection;
|
||||
QMetaObject::Connection filePathChangedConnection;
|
||||
QTextDocument *document = nullptr;
|
||||
};
|
||||
QMap<TextEditor::TextDocument *, OpenedDocument> 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<FilePath> &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)
|
||||
|
@@ -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<Utils::FilePath> &overwriteFilePath = {});
|
||||
void activateDocument(TextEditor::TextDocument *document);
|
||||
void activateEditor(Core::IEditor *editor);
|
||||
void deactivateDocument(TextEditor::TextDocument *document);
|
||||
|
Reference in New Issue
Block a user