diff --git a/src/plugins/cpptools/cppprojectupdater.cpp b/src/plugins/cpptools/cppprojectupdater.cpp index f89f8e9fc80..4d95c5800e3 100644 --- a/src/plugins/cpptools/cppprojectupdater.cpp +++ b/src/plugins/cpptools/cppprojectupdater.cpp @@ -61,7 +61,10 @@ void CppProjectUpdater::update(const ProjectExplorer::ProjectUpdateInfo &project // Run the project info generator in a worker thread and continue if that one is finished. const QFuture future = Utils::runAsync([=]() { - Internal::ProjectInfoGenerator generator(m_futureInterface, projectUpdateInfo); + ProjectUpdateInfo fullProjectUpdateInfo = projectUpdateInfo; + if (fullProjectUpdateInfo.rppGenerator) + fullProjectUpdateInfo.rawProjectParts = fullProjectUpdateInfo.rppGenerator(); + Internal::ProjectInfoGenerator generator(m_futureInterface, fullProjectUpdateInfo); return generator.generate(); }); m_generateFutureWatcher.setFuture(future); diff --git a/src/plugins/projectexplorer/rawprojectpart.cpp b/src/plugins/projectexplorer/rawprojectpart.cpp index 86cd5dce141..7e029c1cede 100644 --- a/src/plugins/projectexplorer/rawprojectpart.cpp +++ b/src/plugins/projectexplorer/rawprojectpart.cpp @@ -192,9 +192,11 @@ ToolChainInfo::ToolChainInfo(const ToolChain *toolChain, ProjectUpdateInfo::ProjectUpdateInfo(Project *project, const KitInfo &kitInfo, const Utils::Environment &env, - const RawProjectParts &rawProjectParts) + const RawProjectParts &rawProjectParts, + const RppGenerator &rppGenerator) : project(project) , rawProjectParts(rawProjectParts) + , rppGenerator(rppGenerator) , cToolChain(kitInfo.cToolChain) , cxxToolChain(kitInfo.cxxToolChain) , cToolChainInfo(ToolChainInfo(cToolChain, kitInfo.sysRootPath, env)) diff --git a/src/plugins/projectexplorer/rawprojectpart.h b/src/plugins/projectexplorer/rawprojectpart.h index 76653c07a8b..95f18a75834 100644 --- a/src/plugins/projectexplorer/rawprojectpart.h +++ b/src/plugins/projectexplorer/rawprojectpart.h @@ -163,16 +163,20 @@ public: class PROJECTEXPLORER_EXPORT ProjectUpdateInfo { public: + using RppGenerator = std::function; + ProjectUpdateInfo() = default; ProjectUpdateInfo(Project *project, const KitInfo &kitInfo, const Utils::Environment &env, - const RawProjectParts &rawProjectParts); + const RawProjectParts &rawProjectParts, + const RppGenerator &rppGenerator = {}); bool isValid() const; public: QPointer project; RawProjectParts rawProjectParts; + RppGenerator rppGenerator; const ToolChain *cToolChain = nullptr; const ToolChain *cxxToolChain = nullptr; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index e26ebba32b1..dba851338e0 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -810,16 +810,13 @@ static void getExpandedCompilerFlags(QStringList &cFlags, QStringList &cxxFlags, } } -void QbsBuildSystem::updateCppCodeModel() +static RawProjectParts generateProjectParts( + const QJsonObject &projectData, + const std::shared_ptr &cToolChain, + const std::shared_ptr &cxxToolChain, + QtVersion qtVersion + ) { - OpTimer optimer("updateCppCodeModel"); - const QJsonObject projectData = session()->projectData(); - if (projectData.isEmpty()) - return; - - const QtSupport::CppKitInfo kitInfo(kit()); - QTC_ASSERT(kitInfo.isValid(), return); - RawProjectParts rpps; forAllProducts(projectData, [&](const QJsonObject &prd) { const QString productName = prd.value("full-display-name").toString(); @@ -843,7 +840,7 @@ void QbsBuildSystem::updateCppCodeModel() const Utils::QtVersion qtVersionForPart = prd.value("module-properties").toObject().value("Qt.core.version").isUndefined() ? Utils::QtVersion::None - : kitInfo.projectPartQtVersion; + : qtVersion; const QJsonArray groups = prd.value("groups").toArray(); for (const QJsonValue &g : groups) { @@ -860,8 +857,8 @@ void QbsBuildSystem::updateCppCodeModel() QStringList cFlags; QStringList cxxFlags; getExpandedCompilerFlags(cFlags, cxxFlags, props); - rpp.setFlagsForC({kitInfo.cToolChain, cFlags}); - rpp.setFlagsForCxx({kitInfo.cxxToolChain, cxxFlags}); + rpp.setFlagsForC({cToolChain.get(), cFlags}); + rpp.setFlagsForCxx({cxxToolChain.get(), cxxFlags}); rpp.setMacros(transform(arrayToStringList(props.value("cpp.defines")), [](const QString &s) { return Macro::fromKeyValue(s); })); @@ -946,8 +943,28 @@ void QbsBuildSystem::updateCppCodeModel() rpps.append(rpp); } }); + return rpps; +} - m_cppCodeModelUpdater->update({project(), kitInfo, activeParseEnvironment(), rpps}); +void QbsBuildSystem::updateCppCodeModel() +{ + OpTimer optimer("updateCppCodeModel"); + const QJsonObject projectData = session()->projectData(); + if (projectData.isEmpty()) + return; + + const QtSupport::CppKitInfo kitInfo(kit()); + QTC_ASSERT(kitInfo.isValid(), return); + const auto cToolchain = std::shared_ptr(kitInfo.cToolChain + ? kitInfo.cToolChain->clone() : nullptr); + const auto cxxToolchain = std::shared_ptr(kitInfo.cxxToolChain + ? kitInfo.cxxToolChain->clone() : nullptr); + + m_cppCodeModelUpdater->update({project(), kitInfo, activeParseEnvironment(), {}, + [projectData, kitInfo, cToolchain, cxxToolchain] { + return generateProjectParts(projectData, cToolchain, cxxToolchain, + kitInfo.projectPartQtVersion); + }}); } void QbsBuildSystem::updateExtraCompilers()