diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 5b0fbfa304f..9d2356a9d4d 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -511,11 +511,13 @@ void Client::initialize() if (d->m_project) params.setRootUri(hostPathToServerUri(d->m_project->projectDirectory())); + auto projectFilter = [this](Project *project) { return canOpenProject(project); }; + auto toWorkSpaceFolder = [this](Project *pro) { + return WorkSpaceFolder(hostPathToServerUri(pro->projectDirectory()), pro->displayName()); + }; const QList workspaces - = Utils::transform(ProjectManager::projects(), [this](Project *pro) { - return WorkSpaceFolder(hostPathToServerUri(pro->projectDirectory()), - pro->displayName()); - }); + = Utils::transform(Utils::filtered(ProjectManager::projects(), projectFilter), + toWorkSpaceFolder); if (workspaces.isEmpty()) params.setWorkSpaceFolders(nullptr); else @@ -1353,6 +1355,7 @@ ProjectExplorer::Project *Client::project() const void Client::setCurrentProject(ProjectExplorer::Project *project) { + QTC_ASSERT(canOpenProject(project), return); if (d->m_project == project) return; if (d->m_project) @@ -1369,7 +1372,7 @@ void Client::setCurrentProject(ProjectExplorer::Project *project) void Client::projectOpened(ProjectExplorer::Project *project) { - if (!d->sendWorkspceFolderChanges()) + if (!d->sendWorkspceFolderChanges() || !canOpenProject(project)) return; WorkspaceFoldersChangeEvent event; event.setAdded({WorkSpaceFolder(hostPathToServerUri(project->projectDirectory()), @@ -1382,7 +1385,7 @@ void Client::projectOpened(ProjectExplorer::Project *project) void Client::projectClosed(ProjectExplorer::Project *project) { - if (d->sendWorkspceFolderChanges()) { + if (d->sendWorkspceFolderChanges() && canOpenProject(project)) { WorkspaceFoldersChangeEvent event; event.setRemoved({WorkSpaceFolder(hostPathToServerUri(project->projectDirectory()), project->displayName())}); @@ -1402,6 +1405,12 @@ void Client::projectClosed(ProjectExplorer::Project *project) } } +bool Client::canOpenProject(ProjectExplorer::Project *project) +{ + Q_UNUSED(project); + return true; +} + void Client::updateConfiguration(const QJsonValue &configuration) { d->m_configuration = configuration; diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 27f48abc415..2ddd155a9f1 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -132,6 +132,7 @@ public: ProjectExplorer::Project *project() const; virtual void projectOpened(ProjectExplorer::Project *project); virtual void projectClosed(ProjectExplorer::Project *project); + virtual bool canOpenProject(ProjectExplorer::Project *project); void updateConfiguration(const QJsonValue &configuration); // commands