diff options
Diffstat (limited to 'src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h')
-rw-r--r-- | src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h | 134 |
1 files changed, 72 insertions, 62 deletions
diff --git a/src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h b/src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h index 980d065fdb..f3b365d8d5 100644 --- a/src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h +++ b/src/tools/clangpchmanagerbackend/source/collectbuilddependencypreprocessorcallbacks.h @@ -109,36 +109,46 @@ public: clang::SrcMgr::CharacteristicKind fileType) override { clang::FileID currentFileId = m_sourceManager->getFileID(hashLocation); - if (file && currentFileId != m_mainFileId) { - addSourceDependency(file, hashLocation); - auto fileUID = file->getUID(); - auto sourceFileUID = m_sourceManager - ->getFileEntryForID(m_sourceManager->getFileID(hashLocation)) - ->getUID(); - auto notAlreadyIncluded = isNotAlreadyIncluded(fileUID); - if (notAlreadyIncluded.first) { - m_alreadyIncludedFileUIDs.insert(notAlreadyIncluded.second, fileUID); - FilePath filePath = filePathFromFile(file); - if (!filePath.empty()) { - FilePathId includeId = m_filePathCache.filePathId(filePath); - - time_t lastModified = file->getModificationTime(); - - SourceType sourceType = SourceType::UserInclude; - if (isSystem(fileType)) { - if (isInSystemHeader(hashLocation)) - sourceType = SourceType::SystemInclude; - else - sourceType = SourceType::TopSystemInclude; - } else if (isNotInExcludedIncludeUID(fileUID)) { - if (isInExcludedIncludeUID(sourceFileUID)) - sourceType = SourceType::TopProjectInclude; - else - sourceType = SourceType::ProjectInclude; + if (file) { + if (currentFileId != m_mainFileId) { + addSourceDependency(file, hashLocation); + auto fileUID = file->getUID(); + auto sourceFileUID = + m_sourceManager + ->getFileEntryForID( + m_sourceManager->getFileID(hashLocation)) + ->getUID(); + auto notAlreadyIncluded = isNotAlreadyIncluded(fileUID); + if (notAlreadyIncluded.first) { + m_alreadyIncludedFileUIDs.insert(notAlreadyIncluded.second, + fileUID); + FilePath filePath = filePathFromFile(file); + if (!filePath.empty()) { + FilePathId includeId = + m_filePathCache.filePathId(filePath); + + time_t lastModified = file->getModificationTime(); + + SourceType sourceType = SourceType::UserInclude; + if (isSystem(fileType)) { + if (isInSystemHeader(hashLocation)) + sourceType = SourceType::SystemInclude; + else + sourceType = SourceType::TopSystemInclude; + } else if (isNotInExcludedIncludeUID(fileUID)) { + if (isInExcludedIncludeUID(sourceFileUID)) + sourceType = SourceType::TopProjectInclude; + else + sourceType = SourceType::ProjectInclude; + } + + addSource({includeId, sourceType, lastModified}); } - - addInclude({includeId, sourceType, lastModified}); } + } else { + addSource({m_filePathCache.filePathId(filePathFromFile(file)), + SourceType::Source, + file->getModificationTime()}); } } else { auto sourceFileId = filePathId(hashLocation); @@ -194,10 +204,10 @@ public: void appendContainsMissingIncludes(const FilePathIds &dependentSourceFilesWithMissingIncludes) { - auto split = m_containsMissingIncludes - .insert(m_containsMissingIncludes.end(), - dependentSourceFilesWithMissingIncludes.begin(), - dependentSourceFilesWithMissingIncludes.end()); + auto split = m_containsMissingIncludes.insert( + m_containsMissingIncludes.end(), + dependentSourceFilesWithMissingIncludes.begin(), + dependentSourceFilesWithMissingIncludes.end()); std::inplace_merge(m_containsMissingIncludes.begin(), split, m_containsMissingIncludes.end()); @@ -207,11 +217,13 @@ public: { FilePathIds filteredDependentSourceFilesWithMissingIncludes; filteredDependentSourceFilesWithMissingIncludes.reserve(dependentSourceFilesWithMissingIncludes.size()); - std::set_difference(dependentSourceFilesWithMissingIncludes.begin(), - dependentSourceFilesWithMissingIncludes.end(), - m_containsMissingIncludes.begin(), - m_containsMissingIncludes.end(), - std::back_inserter(filteredDependentSourceFilesWithMissingIncludes)); + std::set_difference( + dependentSourceFilesWithMissingIncludes.begin(), + dependentSourceFilesWithMissingIncludes.end(), + m_containsMissingIncludes.begin(), + m_containsMissingIncludes.end(), + std::back_inserter( + filteredDependentSourceFilesWithMissingIncludes)); dependentSourceFilesWithMissingIncludes = filteredDependentSourceFilesWithMissingIncludes; } @@ -255,8 +267,7 @@ public: sourceDependencies); } - void removeSourceWithMissingIncludesFromIncludes() - { + void removeSourceWithMissingIncludesFromSources() { class Compare { public: @@ -270,17 +281,16 @@ public: } }; - auto &includes = m_buildDependency.includes; - SourceEntries newIncludes; - newIncludes.reserve(includes.size()); - std::set_difference(includes.begin(), - includes.end(), - m_containsMissingIncludes.begin(), - m_containsMissingIncludes.end(), - std::back_inserter(newIncludes), - Compare{}); - - m_buildDependency.includes = newIncludes; + SourceEntryReferences sourcesWithMissingIncludes; + sourcesWithMissingIncludes.reserve(m_containsMissingIncludes.size()); + std::set_intersection(m_buildDependency.sources.begin(), + m_buildDependency.sources.end(), + m_containsMissingIncludes.begin(), + m_containsMissingIncludes.end(), + std::back_inserter(sourcesWithMissingIncludes), + Compare{}); + for (SourceEntryReference entry : sourcesWithMissingIncludes) + entry.get().hasMissingIncludes = HasMissingIncludes::Yes; } SourceDependencies sourceDependenciesSortedByDependendFilePathId() const @@ -296,12 +306,12 @@ public: void filterOutIncludesWithMissingIncludes() { - sortAndMakeUnique(m_containsMissingIncludes);; + sortAndMakeUnique(m_containsMissingIncludes); collectSourceWithMissingIncludes(m_containsMissingIncludes, sourceDependenciesSortedByDependendFilePathId()); - removeSourceWithMissingIncludesFromIncludes(); + removeSourceWithMissingIncludesFromSources(); } void ensureDirectory(const QString &directory, const QString &fileName) @@ -339,16 +349,16 @@ public: return FilePath::fromNativeFilePath(absolutePath(file->getName())); } - void addInclude(SourceEntry sourceEntry) - { - auto &includes = m_buildDependency.includes; - auto found = std::lower_bound(includes.begin(), - includes.end(), - sourceEntry, - [](auto first, auto second) { return first < second; }); - - if (found == includes.end() || *found != sourceEntry) - includes.emplace(found, sourceEntry); + void addSource(SourceEntry sourceEntry) { + auto &sources = m_buildDependency.sources; + auto found = std::lower_bound( + sources.begin(), + sources.end(), + sourceEntry, + [](auto first, auto second) { return first < second; }); + + if (found == sources.end() || *found != sourceEntry) + sources.emplace(found, sourceEntry); } private: |