summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2017-03-27 17:12:52 +0200
committerTobias Hunger <tobias.hunger@qt.io>2017-03-29 07:54:01 +0000
commit75538aa06046b071cac3e5cc3933f98562220e9c (patch)
tree1741f3cad081179f7cf5c3c2276ba2ea394e4a2e
parentd0ee83768ca25b1a9e09313b1259b64f33c07ec2 (diff)
downloadqt-creator-75538aa06046b071cac3e5cc3933f98562220e9c.tar.gz
CMake: Speed up extra compiler processing a bit
Makes extra compiler selection 30% faster on my test project. Change-Id: If78084ce4a5a93140598dd19e8448295ca122863 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakeproject.cpp41
1 files changed, 26 insertions, 15 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
index cf9d0f0ca4..85ddff7615 100644
--- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp
@@ -531,24 +531,35 @@ void CMakeProject::createGeneratedCodeModelSupport()
{
qDeleteAll(m_extraCompilers);
m_extraCompilers.clear();
- QList<ExtraCompilerFactory *> factories =
+ const QList<ExtraCompilerFactory *> factories =
ExtraCompilerFactory::extraCompilerFactories();
+ const QSet<QString> fileExtensions
+ = Utils::transform<QSet>(factories, [](const ExtraCompilerFactory *f) { return f->sourceTag(); });
+
// Find all files generated by any of the extra compilers, in a rather crude way.
- foreach (const QString &file, files(SourceFiles)) {
- foreach (ExtraCompilerFactory *factory, factories) {
- if (file.endsWith('.' + factory->sourceTag())) {
- QStringList generated = filesGeneratedFrom(file);
- if (!generated.isEmpty()) {
- const FileNameList fileNames = transform(generated,
- [](const QString &s) {
- return FileName::fromString(s);
- });
- m_extraCompilers.append(factory->create(this, FileName::fromString(file),
- fileNames));
- }
- }
- }
+ const QStringList fileList = files(SourceFiles, [&fileExtensions](const FileNode *fn) {
+ const QString fp = fn->filePath().toString();
+ const int pos = fp.lastIndexOf('.');
+ return pos >= 0 && fileExtensions.contains(fp.mid(pos + 1));
+ });
+
+ // Generate the necessary information:
+ for (const QString &file : fileList) {
+ ExtraCompilerFactory *factory = Utils::findOrDefault(factories, [&file](const ExtraCompilerFactory *f) {
+ return file.endsWith('.' + f->sourceTag());
+ });
+ QTC_ASSERT(factory, continue);
+
+ QStringList generated = filesGeneratedFrom(file);
+ if (generated.isEmpty())
+ continue;
+
+ const FileNameList fileNames
+ = transform(generated,
+ [](const QString &s) { return FileName::fromString(s); });
+ m_extraCompilers.append(factory->create(this, FileName::fromString(file),
+ fileNames));
}
CppTools::GeneratedCodeModelSupport::update(m_extraCompilers);