aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/qbsprojectmanager
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2020-02-04 12:27:58 +0100
committerChristian Kandeler <christian.kandeler@qt.io>2020-02-06 15:53:46 +0000
commitcd9571b4f76798f2f40966d13c86bf204c040e68 (patch)
tree4e12f30d8c0956fe7ad323978f9809f9fed0bd2d /src/plugins/qbsprojectmanager
parentfd8187cb8687af35d8cf58d97a4d83a30da39e8c (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.cpp43
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()