diff --git a/src/lib/data/indexer/IndexerCommandList.cpp b/src/lib/data/indexer/IndexerCommandList.cpp index 45b64166..ba2e11df 100644 --- a/src/lib/data/indexer/IndexerCommandList.cpp +++ b/src/lib/data/indexer/IndexerCommandList.cpp @@ -4,11 +4,21 @@ #include #include "utility/file/FileSystem.h" +#include "utility/logging/logging.h" void IndexerCommandList::addCommand(std::shared_ptr command) { std::lock_guard lock(m_commandsMutex); - m_commands.push_back(command); + + std::string commandHash = command->getSourceFilePath().str() + std::to_string(command->getByteSize(1)); + if (m_commandIndex.insert(commandHash).second == true) // Don't add duplicate indexer commands + { + m_commands.push_back(command); + } + else + { + LOG_WARNING_STREAM(<< "Duplicate indexer command was ignored: " << commandHash); + } } size_t IndexerCommandList::size() const diff --git a/src/lib/data/indexer/IndexerCommandList.h b/src/lib/data/indexer/IndexerCommandList.h index 745959bf..b4016b7f 100644 --- a/src/lib/data/indexer/IndexerCommandList.h +++ b/src/lib/data/indexer/IndexerCommandList.h @@ -23,6 +23,8 @@ public: private: std::deque> m_commands; std::mutex m_commandsMutex; + + std::set m_commandIndex; }; #endif // INDEXER_COMMAND_LIST_H diff --git a/src/lib/project/Project.cpp b/src/lib/project/Project.cpp index b151b87f..328bc80b 100644 --- a/src/lib/project/Project.cpp +++ b/src/lib/project/Project.cpp @@ -420,11 +420,10 @@ void Project::buildIndex( )); } - std::set filesToIndexTemp = filesToIndex; std::shared_ptr indexerCommandList = std::make_shared(); for (const std::shared_ptr& sourceGroup : m_sourceGroups) { - for (const std::shared_ptr& command : sourceGroup->getIndexerCommands(&filesToIndexTemp, fullRefresh)) + for (const std::shared_ptr& command : sourceGroup->getIndexerCommands(filesToIndex, fullRefresh)) { indexerCommandList->addCommand(command); } diff --git a/src/lib/project/SourceGroup.h b/src/lib/project/SourceGroup.h index 70b52070..0dddae52 100644 --- a/src/lib/project/SourceGroup.h +++ b/src/lib/project/SourceGroup.h @@ -30,7 +30,7 @@ public: std::set getSourceFilePathsToIndex() const; virtual std::vector> getIndexerCommands( - std::set* filesToIndex, bool fullRefresh) = 0; + const std::set& filesToIndex, bool fullRefresh) = 0; protected: std::set getIndexedPaths(); diff --git a/src/lib_cxx/project/SourceGroupCxxCdb.cpp b/src/lib_cxx/project/SourceGroupCxxCdb.cpp index d48501a1..66126c96 100644 --- a/src/lib_cxx/project/SourceGroupCxxCdb.cpp +++ b/src/lib_cxx/project/SourceGroupCxxCdb.cpp @@ -48,7 +48,7 @@ bool SourceGroupCxxCdb::prepareRefresh() } std::vector> SourceGroupCxxCdb::getIndexerCommands( - std::set* filesToIndex, bool fullRefresh) + const std::set& filesToIndex, bool fullRefresh) { std::shared_ptr appSettings = ApplicationSettings::getInstance(); @@ -100,7 +100,7 @@ std::vector> SourceGroupCxxCdb::getIndexerComman sourcePath = FilePath(command.Directory + '/' + command.Filename).canonical(); } - if (filesToIndex->find(sourcePath) != filesToIndex->end() && + if (filesToIndex.find(sourcePath) != filesToIndex.end() && sourceFilePathsToIndex.find(sourcePath) != sourceFilePathsToIndex.end()) { std::vector currentCompilerFlags = compilerFlags; @@ -116,8 +116,6 @@ std::vector> SourceGroupCxxCdb::getIndexerComman frameworkSearchPaths, m_settings->getShouldApplyAnonymousTypedefTransformation() )); - - filesToIndex->erase(sourcePath); } } } diff --git a/src/lib_cxx/project/SourceGroupCxxCdb.h b/src/lib_cxx/project/SourceGroupCxxCdb.h index 0b6250a6..d0b91920 100644 --- a/src/lib_cxx/project/SourceGroupCxxCdb.h +++ b/src/lib_cxx/project/SourceGroupCxxCdb.h @@ -18,7 +18,7 @@ public: virtual bool prepareRefresh(); virtual std::vector> getIndexerCommands( - std::set* filesToIndex, bool fullRefresh); + const std::set& filesToIndex, bool fullRefresh); private: virtual std::shared_ptr getSourceGroupSettingsCxx(); diff --git a/src/lib_cxx/project/SourceGroupCxxEmpty.cpp b/src/lib_cxx/project/SourceGroupCxxEmpty.cpp index be435c69..62916742 100644 --- a/src/lib_cxx/project/SourceGroupCxxEmpty.cpp +++ b/src/lib_cxx/project/SourceGroupCxxEmpty.cpp @@ -19,7 +19,7 @@ SourceGroupType SourceGroupCxxEmpty::getType() const } std::vector> SourceGroupCxxEmpty::getIndexerCommands( - std::set* filesToIndex, bool fullRefresh) + const std::set& filesToIndex, bool fullRefresh) { std::shared_ptr appSettings = ApplicationSettings::getInstance(); @@ -59,7 +59,7 @@ std::vector> SourceGroupCxxEmpty::getIndexerComm std::vector> indexerCommands; for (const FilePath& sourcePath: sourceFilePathsToIndex) { - if (filesToIndex->find(sourcePath) != filesToIndex->end()) + if (filesToIndex.find(sourcePath) != filesToIndex.end()) { indexerCommands.push_back(std::make_shared( sourcePath, @@ -71,8 +71,6 @@ std::vector> SourceGroupCxxEmpty::getIndexerComm compilerFlags, m_settings->getShouldApplyAnonymousTypedefTransformation() )); - - filesToIndex->erase(sourcePath); } } diff --git a/src/lib_cxx/project/SourceGroupCxxEmpty.h b/src/lib_cxx/project/SourceGroupCxxEmpty.h index e844103d..a05bb12a 100644 --- a/src/lib_cxx/project/SourceGroupCxxEmpty.h +++ b/src/lib_cxx/project/SourceGroupCxxEmpty.h @@ -16,7 +16,7 @@ public: virtual SourceGroupType getType() const; virtual std::vector> getIndexerCommands( - std::set* filesToIndex, bool fullRefresh); + const std::set& filesToIndex, bool fullRefresh); private: virtual std::shared_ptr getSourceGroupSettingsCxx(); diff --git a/src/lib_java/project/SourceGroupJava.cpp b/src/lib_java/project/SourceGroupJava.cpp index c765472f..463093d8 100644 --- a/src/lib_java/project/SourceGroupJava.cpp +++ b/src/lib_java/project/SourceGroupJava.cpp @@ -31,7 +31,7 @@ bool SourceGroupJava::prepareIndexing() } std::vector> SourceGroupJava::getIndexerCommands( - std::set* filesToIndex, bool fullRefresh) + const std::set& filesToIndex, bool fullRefresh) { const std::string languageStandard = getSourceGroupSettingsJava()->getStandard(); @@ -44,12 +44,10 @@ std::vector> SourceGroupJava::getIndexerCommands std::vector> indexerCommands; for (const FilePath& sourcePath: sourceFilePathsToIndex) { - if (filesToIndex->find(sourcePath) != filesToIndex->end()) + if (filesToIndex.find(sourcePath) != filesToIndex.end()) { indexerCommands.push_back( std::make_shared(sourcePath, indexedPaths, excludedPaths, languageStandard, classPath)); - - filesToIndex->erase(sourcePath); } } diff --git a/src/lib_java/project/SourceGroupJava.h b/src/lib_java/project/SourceGroupJava.h index 59887442..0758c25f 100644 --- a/src/lib_java/project/SourceGroupJava.h +++ b/src/lib_java/project/SourceGroupJava.h @@ -18,7 +18,7 @@ public: virtual bool prepareIndexing(); virtual std::vector> getIndexerCommands( - std::set* filesToIndex, bool fullRefresh); + const std::set& filesToIndex, bool fullRefresh); protected: virtual std::vector doGetClassPath();