diff options
author | Tobias Hunger <tobias.hunger@qt.io> | 2017-03-27 17:12:52 +0200 |
---|---|---|
committer | Tobias Hunger <tobias.hunger@qt.io> | 2017-03-29 07:54:01 +0000 |
commit | 75538aa06046b071cac3e5cc3933f98562220e9c (patch) | |
tree | 1741f3cad081179f7cf5c3c2276ba2ea394e4a2e | |
parent | d0ee83768ca25b1a9e09313b1259b64f33c07ec2 (diff) | |
download | qt-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.cpp | 41 |
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); |