aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/languageclient
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2020-05-12 09:20:01 +0200
committerDavid Schulz <david.schulz@qt.io>2020-05-14 09:51:26 +0000
commit8f5109b6eee4d61207474916404621fb6a675811 (patch)
tree1a967ebfcf7af9b9929e5846a655e7c9376c2194 /src/plugins/languageclient
parentf3407bb0ca5ca06a2b64e993c9d270774facfebc (diff)
LSP: Robustify open documents
Use Client::openDocument if you just want to open a document and activate it if it is not already used in another client. Use LanguageClientManager::openDocumentWithClient if you want to make sure a document is opened _and_ activated for a specific client. Change-Id: I6b790f15e17335ce2dc8981a04d2cd571b22b66b Reviewed-by: Christian Stenger <christian.stenger@qt.io>
Diffstat (limited to 'src/plugins/languageclient')
-rw-r--r--src/plugins/languageclient/client.cpp10
-rw-r--r--src/plugins/languageclient/languageclientmanager.cpp39
-rw-r--r--src/plugins/languageclient/languageclientmanager.h9
-rw-r--r--src/plugins/languageclient/languageclientutils.cpp2
4 files changed, 29 insertions, 31 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp
index 5fad0bac46..4fbebdbc87 100644
--- a/src/plugins/languageclient/client.cpp
+++ b/src/plugins/languageclient/client.cpp
@@ -329,8 +329,11 @@ void Client::openDocument(TextEditor::TextDocument *document)
item.setVersion(document->document()->revision());
sendContent(DidOpenTextDocumentNotification(DidOpenTextDocumentParams(item)));
- if (LanguageClientManager::clientForDocument(document) == this)
+ const Client *currentClient = LanguageClientManager::clientForDocument(document);
+ if (currentClient == this) // this is the active client for the document so directly activate it
activateDocument(document);
+ else if (currentClient == nullptr) // there is no client for this document so assign it to this server
+ LanguageClientManager::openDocumentWithClient(document, this);
}
void Client::sendContent(const IContent &content)
@@ -887,11 +890,8 @@ void Client::projectFileListChanged()
{
for (Core::IDocument *doc : Core::DocumentModel::openedDocuments()) {
if (m_project->isKnownFile(doc->filePath())) {
- if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(doc)) {
+ if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(doc))
openDocument(textDocument);
- if (!LanguageClientManager::clientForDocument(textDocument))
- LanguageClientManager::reOpenDocumentWithClient(textDocument, this);
- }
}
}
}
diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp
index 7e42c5c070..d074005695 100644
--- a/src/plugins/languageclient/languageclientmanager.cpp
+++ b/src/plugins/languageclient/languageclientmanager.cpp
@@ -245,11 +245,8 @@ void LanguageClientManager::applySettings()
}
if (!documents.isEmpty()) {
Client *client = startClient(setting);
- for (TextEditor::TextDocument *document : documents) {
- if (managerInstance->m_clientForDocument.value(document).isNull())
- managerInstance->m_clientForDocument[document] = client;
+ for (TextEditor::TextDocument *document : documents)
client->openDocument(document);
- }
}
break;
}
@@ -332,13 +329,21 @@ Client *LanguageClientManager::clientForUri(const DocumentUri &uri)
return clientForFilePath(uri.toFilePath());
}
-void LanguageClientManager::reOpenDocumentWithClient(TextEditor::TextDocument *document, Client *client)
+void LanguageClientManager::openDocumentWithClient(TextEditor::TextDocument *document, Client *client)
{
- Utils::ExecuteOnDestruction outlineUpdater(&TextEditor::IOutlineWidgetFactory::updateOutline);
- if (Client *currentClient = clientForDocument(document))
+ Client *currentClient = clientForDocument(document);
+ if (client == currentClient)
+ return;
+ if (currentClient)
currentClient->deactivateDocument(document);
managerInstance->m_clientForDocument[document] = client;
- client->activateDocument(document);
+ if (client) {
+ if (!client->documentOpen(document))
+ client->openDocument(document);
+ else
+ client->activateDocument(document);
+ }
+ TextEditor::IOutlineWidgetFactory::updateOutline();
}
void LanguageClientManager::logBaseMessage(const LspLogMessage::MessageSender sender,
@@ -458,22 +463,12 @@ void LanguageClientManager::documentOpened(Core::IDocument *document)
} else if (setting->m_startBehavior == BaseSettings::RequiresFile && clients.isEmpty()) {
clients << startClient(setting);
}
- for (auto client : clients) {
- if (!m_clientForDocument.contains(textDocument))
- m_clientForDocument[textDocument] = client;
- openDocumentWithClient(textDocument, client);
- }
+ for (auto client : clients)
+ client->openDocument(textDocument);
}
}
}
-void LanguageClientManager::openDocumentWithClient(TextEditor::TextDocument *document,
- Client *client)
-{
- if (client && client->state() != Client::Error)
- client->openDocument(document);
-}
-
void LanguageClientManager::documentClosed(Core::IDocument *document)
{
if (auto textDocument = qobject_cast<TextEditor::TextDocument *>(document)) {
@@ -629,9 +624,7 @@ void LanguageClientManager::updateProject(ProjectExplorer::Project *project)
newClient = startClient(setting, project);
if (!newClient)
break;
- openDocumentWithClient(textDoc, newClient);
- if (m_clientForDocument.value(textDoc) == nullptr)
- m_clientForDocument[textDoc] = newClient;
+ newClient->openDocument(textDoc);
}
}
}
diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h
index 0af23e6b0e..2a1c42e62d 100644
--- a/src/plugins/languageclient/languageclientmanager.h
+++ b/src/plugins/languageclient/languageclientmanager.h
@@ -83,7 +83,13 @@ public:
static Client *clientForDocument(TextEditor::TextDocument *document);
static Client *clientForFilePath(const Utils::FilePath &filePath);
static Client *clientForUri(const LanguageServerProtocol::DocumentUri &uri);
- static void reOpenDocumentWithClient(TextEditor::TextDocument *document, Client *client);
+
+ ///
+ /// \brief openDocumentWithClient
+ /// makes sure the document is opened and activated with the client and
+ /// deactivates the document for a potential previous active client
+ ///
+ static void openDocumentWithClient(TextEditor::TextDocument *document, Client *client);
static void logBaseMessage(const LspLogMessage::MessageSender sender,
const QString &clientName,
@@ -98,7 +104,6 @@ private:
void editorOpened(Core::IEditor *editor);
void documentOpened(Core::IDocument *document);
- void openDocumentWithClient(TextEditor::TextDocument *document, Client *client);
void documentClosed(Core::IDocument *document);
void documentContentsSaved(Core::IDocument *document);
void documentWillSave(Core::IDocument *document);
diff --git a/src/plugins/languageclient/languageclientutils.cpp b/src/plugins/languageclient/languageclientutils.cpp
index 72bb015757..d6f6c1676b 100644
--- a/src/plugins/languageclient/languageclientutils.cpp
+++ b/src/plugins/languageclient/languageclientutils.cpp
@@ -231,7 +231,7 @@ void updateEditorToolBar(Core::IEditor *editor)
auto reopen = [action, client = QPointer<Client>(client), document]() {
if (!client)
return;
- LanguageClientManager::reOpenDocumentWithClient(document, client);
+ LanguageClientManager::openDocumentWithClient(document, client);
action->setChecked(true);
};
action->setCheckable(true);