diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2020-02-04 12:27:58 +0100 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2020-02-06 15:53:46 +0000 |
commit | cd9571b4f76798f2f40966d13c86bf204c040e68 (patch) | |
tree | 4e12f30d8c0956fe7ad323978f9809f9fed0bd2d /src/plugins/qbsprojectmanager | |
parent | fd8187cb8687af35d8cf58d97a4d83a30da39e8c (diff) |
CppTools: Optionally move raw project parts creation into thread
... by letting callers pass in a generator function.
This takes some load off the UI thread for larger projects.
For now only used by the QbsProjectManager, which can provide a thread-
safe generator function due to the project data existing in "value"
form.
Task-number: QTCREATORBUG-18533
Change-Id: I525dea36a4c4079bd1bd5a4fff844617547d56f1
Reviewed-by: hjk <hjk@qt.io>
Diffstat (limited to 'src/plugins/qbsprojectmanager')
-rw-r--r-- | src/plugins/qbsprojectmanager/qbsproject.cpp | 43 |
1 files changed, 30 insertions, 13 deletions
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<const ToolChain> &cToolChain, + const std::shared_ptr<const ToolChain> &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<QVector>(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<ToolChain>(kitInfo.cToolChain + ? kitInfo.cToolChain->clone() : nullptr); + const auto cxxToolchain = std::shared_ptr<ToolChain>(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() |