diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 016cbfaaa1..162de0a817 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -148,8 +148,8 @@ public: bool saveRawList(const QStringList &rawList, const QString &fileName); void parse(RefreshOptions options); - QStringList processEntries(const QStringList &paths, - QHash *map = nullptr) const; + QPair processEntries(const QStringList &paths, + QHash *map = nullptr) const; Utils::FilePath findCommonSourceRoot(); void refreshCppCodeModel(); @@ -166,6 +166,7 @@ private: QString m_cflagsFileName; QStringList m_rawFileList; QStringList m_files; + QStringList m_pchList; QHash m_rawListEntries; QStringList m_rawProjectIncludePaths; ProjectExplorer::HeaderPaths m_projectIncludePaths; @@ -175,8 +176,16 @@ private: CppEditor::CppProjectUpdaterInterface *m_cppCodeModelUpdater = nullptr; Utils::FileSystemWatcher m_deployFileWatcher; + + // Dirty tag to know if it's a pch before getting file info. + // NOTE: + // Would it be better to add a FileType::PreCompiledHeader instead? + // It would need a lot to refactor since fileNodes relies on m_files + // For now, this works for generic projects. + static const QString PCH_SUFFIX_TAG; }; +const QString GenericBuildSystem::PCH_SUFFIX_TAG = " pch"; //////////////////////////////////////////////////////////////////////////////////// // @@ -426,7 +435,9 @@ void GenericBuildSystem::parse(RefreshOptions options) if (options & Files) { m_rawListEntries.clear(); m_rawFileList = readLines(m_filesFileName); - m_files = processEntries(m_rawFileList, &m_rawListEntries); + QPair pair = processEntries(m_rawFileList, &m_rawListEntries); + m_files = pair.first; + m_pchList = pair.second; } if (options & Configuration) { @@ -517,8 +528,8 @@ void GenericBuildSystem::refresh(RefreshOptions options) * The \a map variable is an optional argument that will map the returned * absolute paths back to their original \a entries. */ -QStringList GenericBuildSystem::processEntries(const QStringList &paths, - QHash *map) const +QPair GenericBuildSystem::processEntries(const QStringList &paths, + QHash *map) const { const BuildConfiguration *const buildConfig = target()->activeBuildConfiguration(); @@ -535,6 +546,7 @@ QStringList GenericBuildSystem::processEntries(const QStringList &paths, QFileInfo fileInfo; QStringList absolutePaths; + QStringList pchList; for (const QString &path : paths) { QString trimmedPath = path.trimmed(); if (trimmedPath.isEmpty()) @@ -545,16 +557,25 @@ QStringList GenericBuildSystem::processEntries(const QStringList &paths, trimmedPath = Utils::FilePath::fromUserInput(trimmedPath).toString(); + bool pchTag = false; + if (trimmedPath.endsWith(PCH_SUFFIX_TAG)) + { + trimmedPath.remove(PCH_SUFFIX_TAG); + pchTag = true; + } + fileInfo.setFile(projectDir, trimmedPath); if (fileInfo.exists()) { const QString absPath = fileInfo.absoluteFilePath(); absolutePaths.append(absPath); + if (pchTag) + pchList.append(absPath); if (map) map->insert(absPath, trimmedPath); } } absolutePaths.removeDuplicates(); - return absolutePaths; + return {absolutePaths, pchList}; } void GenericBuildSystem::refreshCppCodeModel() @@ -576,6 +597,9 @@ void GenericBuildSystem::refreshCppCodeModel() rpp.setFlagsForC({nullptr, m_cflags, projectDirectory().toString()}); rpp.setFiles(m_files); + if (m_pchList.count() > 0) + rpp.setPreCompiledHeaders(m_pchList); + m_cppCodeModelUpdater->update({project(), kitInfo, activeParseEnvironment(), {rpp}}); }