diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 65ca6d95750..a13b81859e8 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -142,19 +142,25 @@ void CMakeBuildConfiguration::ctor() displayName(), BuildConfiguration::Unknown)); connect(m_buildDirManager.get(), &BuildDirManager::dataAvailable, - this, &CMakeBuildConfiguration::dataAvailable); + this, [this, project]() { + project->updateProjectData(this); + emit dataAvailable(); + }); connect(m_buildDirManager.get(), &BuildDirManager::errorOccured, - this, &CMakeBuildConfiguration::setError); + this, [this, project](const QString &msg) { + project->updateProjectData(this); + setError(msg); + }); connect(m_buildDirManager.get(), &BuildDirManager::configurationStarted, - this, &CMakeBuildConfiguration::parsingStarted); + this, [this, project]() { + project->handleParsingStarted(); + emit parsingStarted(); + }); connect(this, &CMakeBuildConfiguration::environmentChanged, m_buildDirManager.get(), &BuildDirManager::forceReparse); connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, m_buildDirManager.get(), &BuildDirManager::forceReparse); - - connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); - connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::updateProjectData); } void CMakeBuildConfiguration::maybeForceReparse() @@ -378,10 +384,10 @@ CMakeConfig CMakeBuildConfiguration::cmakeConfiguration() const void CMakeBuildConfiguration::setError(const QString &message) { - if (m_error == message) - return; - m_error = message; - emit enabledChanged(); + if (m_error != message) { + emit enabledChanged(); + m_error = message; + } emit errorOccured(m_error); } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index ddf538983af..f9bc0013cc6 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -94,17 +94,16 @@ CMakeProject::~CMakeProject() qDeleteAll(m_extraCompilers); } -void CMakeProject::updateProjectData() +void CMakeProject::updateProjectData(CMakeBuildConfiguration *bc) { - auto cmakeBc = qobject_cast(sender()); - QTC_ASSERT(cmakeBc, return); + QTC_ASSERT(bc, return); Target *t = activeTarget(); - if (!t || t->activeBuildConfiguration() != cmakeBc) + if (!t || t->activeBuildConfiguration() != bc) return; Kit *k = t->kit(); - cmakeBc->generateProjectTree(static_cast(rootProjectNode())); + bc->generateProjectTree(static_cast(rootProjectNode())); updateApplicationAndDeploymentTargets(); updateTargetRunConfigurations(t); @@ -131,7 +130,7 @@ void CMakeProject::updateProjectData() ppBuilder.setQtVersion(activeQtVersion); - const QSet languages = cmakeBc->updateCodeModel(ppBuilder); + const QSet languages = bc->updateCodeModel(ppBuilder); for (const auto &lid : languages) setProjectLanguage(lid, true); @@ -144,7 +143,7 @@ void CMakeProject::updateProjectData() emit displayNameChanged(); emit fileListChanged(); - emit cmakeBc->emitBuildTypeChanged(); + emit bc->emitBuildTypeChanged(); emit parsingFinished(); } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 52b73edc14c..5fa7de4415c 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -113,7 +113,7 @@ private: void handleActiveTargetChanged(); void handleActiveBuildConfigurationChanged(); void handleParsingStarted(); - void updateProjectData(); + void updateProjectData(Internal::CMakeBuildConfiguration *cmakeBc); void updateQmlJSCodeModel(); void createGeneratedCodeModelSupport(); diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index ae5bf6d41c5..f860f28bef5 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -250,12 +250,20 @@ static ProjectNode *updateCMakeInputs(CMakeListsNode *root, QList &buildInputs, QList &rootInputs) { + const bool hasInputs = !sourceInputs.isEmpty() || !buildInputs.isEmpty() || !rootInputs.isEmpty(); ProjectNode *cmakeVFolder = root->projectNode(CMakeInputsNode::inputsPathFromCMakeListsPath(root->filePath())); if (!cmakeVFolder) { - cmakeVFolder = new CMakeInputsNode(root->filePath()); - root->addProjectNodes({ cmakeVFolder }); + if (hasInputs) { + cmakeVFolder = new CMakeInputsNode(root->filePath()); + root->addProjectNodes({ cmakeVFolder }); + } + } else { + if (!hasInputs) + root->removeProjectNodes({ cmakeVFolder }); } + if (!hasInputs) + return nullptr; QList foldersToDelete; foldersToDelete.append(setupCMakeVFolder(cmakeVFolder, sourceDir, 1000,