diff --git a/src/plugins/cmakeprojectmanager/builddirmanager.cpp b/src/plugins/cmakeprojectmanager/builddirmanager.cpp index 65ddce01ead..b92581410b4 100644 --- a/src/plugins/cmakeprojectmanager/builddirmanager.cpp +++ b/src/plugins/cmakeprojectmanager/builddirmanager.cpp @@ -148,6 +148,8 @@ void BuildDirManager::parseOnceReaderReady(bool force) m_scanFuture = fi->future(); m_futureWatcher.setFuture(m_scanFuture); + m_cmakeCache.clear(); + Core::ProgressManager::addTask(fi->future(), "Scan CMake project tree", "CMake.Scan.Tree"); Utils::runAsync([this, fi]() { BuildDirManager::asyncScanForFiles(fi); }); @@ -411,7 +413,7 @@ CMakeConfig BuildDirManager::parsedConfiguration() const if (!m_reader) return m_cmakeCache; if (m_cmakeCache.isEmpty()) - m_cmakeCache = m_reader->parsedConfiguration(); + m_cmakeCache = m_reader->takeParsedConfiguration(); return m_cmakeCache; } @@ -421,7 +423,7 @@ void BuildDirManager::checkConfiguration() return; Kit *k = m_buildConfiguration->target()->kit(); - const CMakeConfig cache = m_reader->parsedConfiguration(); + const CMakeConfig cache = parsedConfiguration(); if (cache.isEmpty()) return; // No cache file yet. diff --git a/src/plugins/cmakeprojectmanager/builddirreader.h b/src/plugins/cmakeprojectmanager/builddirreader.h index d23df0020ef..8aca7dd99cc 100644 --- a/src/plugins/cmakeprojectmanager/builddirreader.h +++ b/src/plugins/cmakeprojectmanager/builddirreader.h @@ -100,7 +100,7 @@ public: virtual bool isParsing() const = 0; virtual bool hasData() const = 0; - virtual CMakeConfig parsedConfiguration() const = 0; + virtual CMakeConfig takeParsedConfiguration() = 0; virtual QList buildTargets() const = 0; virtual void generateProjectTree(CMakeListsNode *root, const QList &allFiles) = 0; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index da33bd340aa..65ca6d95750 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -146,7 +146,7 @@ void CMakeBuildConfiguration::ctor() connect(m_buildDirManager.get(), &BuildDirManager::errorOccured, this, &CMakeBuildConfiguration::setError); connect(m_buildDirManager.get(), &BuildDirManager::configurationStarted, - this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); + this, &CMakeBuildConfiguration::parsingStarted); connect(this, &CMakeBuildConfiguration::environmentChanged, m_buildDirManager.get(), &BuildDirManager::forceReparse); @@ -259,10 +259,7 @@ QList CMakeBuildConfiguration::completeCMakeConfiguration if (!m_buildDirManager || m_buildDirManager->isParsing()) return QList(); - if (m_completeConfigurationCache.isEmpty()) - m_completeConfigurationCache = m_buildDirManager->parsedConfiguration(); - - return Utils::transform(m_completeConfigurationCache, + return Utils::transform(m_buildDirManager->parsedConfiguration(), [this](const CMakeConfigItem &i) { ConfigModel::DataItem j; j.key = QString::fromUtf8(i.key); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 04a4f096816..3c8723e3c0f 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -118,8 +118,6 @@ private: QString m_error; QString m_warning; - mutable QList m_completeConfigurationCache; - std::unique_ptr m_buildDirManager; friend class CMakeBuildSettingsWidget; diff --git a/src/plugins/cmakeprojectmanager/servermodereader.cpp b/src/plugins/cmakeprojectmanager/servermodereader.cpp index cf3c765febf..30f13b89938 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.cpp +++ b/src/plugins/cmakeprojectmanager/servermodereader.cpp @@ -213,9 +213,11 @@ QList ServerModeReader::buildTargets() const return result; } -CMakeConfig ServerModeReader::parsedConfiguration() const +CMakeConfig ServerModeReader::takeParsedConfiguration() { - return m_cmakeCache; + CMakeConfig config = m_cmakeCache; + m_cmakeCache.clear(); + return config; } FolderNode *setupCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, diff --git a/src/plugins/cmakeprojectmanager/servermodereader.h b/src/plugins/cmakeprojectmanager/servermodereader.h index f0692bb83a4..4b5936039b5 100644 --- a/src/plugins/cmakeprojectmanager/servermodereader.h +++ b/src/plugins/cmakeprojectmanager/servermodereader.h @@ -63,7 +63,7 @@ public: bool hasData() const final; QList buildTargets() const final; - CMakeConfig parsedConfiguration() const final; + CMakeConfig takeParsedConfiguration() final; void generateProjectTree(CMakeListsNode *root, const QList &allFiles) final; QSet updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final; diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.cpp b/src/plugins/cmakeprojectmanager/tealeafreader.cpp index 68e0c3ec70e..c730db73621 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.cpp +++ b/src/plugins/cmakeprojectmanager/tealeafreader.cpp @@ -163,7 +163,6 @@ void TeaLeafReader::resetData() qDeleteAll(m_watchedFiles); m_watchedFiles.clear(); - m_cmakeCache.clear(); m_projectName.clear(); m_buildTargets.clear(); qDeleteAll(m_files); @@ -221,7 +220,7 @@ QList TeaLeafReader::buildTargets() const return m_buildTargets; } -CMakeConfig TeaLeafReader::parsedConfiguration() const +CMakeConfig TeaLeafReader::takeParsedConfiguration() { CMakeConfig result; FileName cacheFile = m_parameters.buildDirectory; @@ -229,11 +228,11 @@ CMakeConfig TeaLeafReader::parsedConfiguration() const if (!cacheFile.exists()) return result; QString errorMessage; - m_cmakeCache = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage); + result = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage); if (!errorMessage.isEmpty()) emit errorOccured(errorMessage); const FileName sourceOfBuildDir - = FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", m_cmakeCache)); + = FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", result)); const FileName canonicalSourceOfBuildDir = FileUtils::canonicalPath(sourceOfBuildDir); const FileName canonicalSourceDirectory = FileUtils::canonicalPath(m_parameters.sourceDirectory); if (canonicalSourceOfBuildDir != canonicalSourceDirectory) { // Uses case-insensitive compare where appropriate diff --git a/src/plugins/cmakeprojectmanager/tealeafreader.h b/src/plugins/cmakeprojectmanager/tealeafreader.h index 7451de7ed9b..5c09e577995 100644 --- a/src/plugins/cmakeprojectmanager/tealeafreader.h +++ b/src/plugins/cmakeprojectmanager/tealeafreader.h @@ -55,7 +55,7 @@ public: bool hasData() const final; QList buildTargets() const final; - CMakeConfig parsedConfiguration() const final; + CMakeConfig takeParsedConfiguration() final; void generateProjectTree(CMakeListsNode *root, const QList &allFiles) final; QSet updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final; @@ -82,7 +82,6 @@ private: bool m_hasData = false; - mutable CMakeConfig m_cmakeCache; QSet m_cmakeFiles; QString m_projectName; QList m_buildTargets;