From 45ad669a88a425dcf2b64b565461fb7dc4abb872 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 2 Dec 2016 17:32:31 +0100 Subject: [PATCH] CMake: Return empty tree on errors in server-mode This triggers the fallback mechanism which will make sure the CMakeLists.txt file will be displayed. This used to fail since one empty folder was left over in the project. Task-number: QTCREATORBUG-17383 Change-Id: I867fd9039bc5df805ff5174ec49084bbcf688824 Reviewed-by: Tim Jenssen --- .../cmakebuildconfiguration.cpp | 26 ++++++++++++------- .../cmakeprojectmanager/cmakeproject.cpp | 13 +++++----- .../cmakeprojectmanager/cmakeproject.h | 2 +- .../cmakeprojectmanager/servermodereader.cpp | 12 +++++++-- 4 files changed, 33 insertions(+), 20 deletions(-) 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,