diff options
-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); |