From 40bd5ceb5a51a3fbc7834c08fe39df04efa19b6a Mon Sep 17 00:00:00 2001 From: mlangkabel Date: Tue, 31 Jul 2018 14:17:14 +0200 Subject: [PATCH] logic: improved "prepare indexing" performance for cxx sourcegroups * improved performance of "prepare indexing" step for all cxx source groups except empty * unified code for filtering to contained file paths of source groups * cleaned up code of SourceGroupFactoryModules --- src/lib/project/SourceGroupFactoryModule.h | 2 +- src/lib_cxx/CMakeLists.txt | 2 + src/lib_cxx/project/SourceGroupCxxCdb.cpp | 43 ++------------- .../project/SourceGroupCxxCodeblocks.cpp | 45 ++------------- src/lib_cxx/project/SourceGroupCxxEmpty.cpp | 41 +++----------- .../project/SourceGroupCxxSonargraph.cpp | 23 ++------ .../project/SourceGroupFactoryModuleCxx.cpp | 6 +- .../project/SourceGroupFactoryModuleCxx.h | 5 +- src/lib_cxx/utility/IncludeProcessing.h | 2 +- src/lib_cxx/utility/utilitySourceGroupCxx.cpp | 55 +++++++++++++++++++ src/lib_cxx/utility/utilitySourceGroupCxx.h | 19 +++++++ .../project/SourceGroupFactoryModuleJava.cpp | 6 +- .../project/SourceGroupFactoryModuleJava.h | 5 +- 13 files changed, 108 insertions(+), 146 deletions(-) create mode 100644 src/lib_cxx/utility/utilitySourceGroupCxx.cpp create mode 100644 src/lib_cxx/utility/utilitySourceGroupCxx.h diff --git a/src/lib/project/SourceGroupFactoryModule.h b/src/lib/project/SourceGroupFactoryModule.h index 5a3a71aa..2f6ef5bb 100644 --- a/src/lib/project/SourceGroupFactoryModule.h +++ b/src/lib/project/SourceGroupFactoryModule.h @@ -13,7 +13,7 @@ class SourceGroupFactoryModule public: virtual ~SourceGroupFactoryModule(); virtual bool supports(SourceGroupType type) const = 0; - virtual std::shared_ptr createSourceGroup(std::shared_ptr settings) = 0; + virtual std::shared_ptr createSourceGroup(std::shared_ptr settings) const = 0; }; #endif // SOURCE_GROUP_FACTORY_MODULE_H diff --git a/src/lib_cxx/CMakeLists.txt b/src/lib_cxx/CMakeLists.txt index 0b4a5c2d..cd6f6c8e 100644 --- a/src/lib_cxx/CMakeLists.txt +++ b/src/lib_cxx/CMakeLists.txt @@ -107,6 +107,8 @@ add_files( utility/IncludeDirective.h utility/IncludeProcessing.cpp utility/IncludeProcessing.h + utility/utilitySourceGroupCxx.cpp + utility/utilitySourceGroupCxx.h LanguagePackageCxx.cpp LanguagePackageCxx.h diff --git a/src/lib_cxx/project/SourceGroupCxxCdb.cpp b/src/lib_cxx/project/SourceGroupCxxCdb.cpp index c232641d..1a94cc58 100644 --- a/src/lib_cxx/project/SourceGroupCxxCdb.cpp +++ b/src/lib_cxx/project/SourceGroupCxxCdb.cpp @@ -7,6 +7,7 @@ #include "settings/ApplicationSettings.h" #include "utility/messaging/type/MessageStatus.h" #include "utility/utility.h" +#include "utility/utilitySourceGroupCxx.h" #include "Application.h" SourceGroupCxxCdb::SourceGroupCxxCdb(std::shared_ptr settings) @@ -38,46 +39,12 @@ bool SourceGroupCxxCdb::prepareIndexing() std::set SourceGroupCxxCdb::filterToContainedFilePaths(const std::set& filePaths) const { - std::set containedFilePaths; - - const std::set indexedPaths = utility::concat( + return utility::filterToContainedFilePaths( + filePaths, getAllSourceFilePaths(), - utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()) + utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()), + m_settings->getExcludeFiltersExpandedAndAbsolute() ); - - const std::vector excludeFilters = m_settings->getExcludeFiltersExpandedAndAbsolute(); - - for (const FilePath& filePath : filePaths) - { - bool isInIndexedPaths = false; - for (const FilePath& indexedPath : indexedPaths) - { - if (indexedPath == filePath || indexedPath.contains(filePath)) - { - isInIndexedPaths = true; - break; - } - } - - if (isInIndexedPaths) - { - for (const FilePathFilter& excludeFilter : excludeFilters) - { - if (excludeFilter.isMatching(filePath)) - { - isInIndexedPaths = false; - break; - } - } - } - - if (isInIndexedPaths) - { - containedFilePaths.insert(filePath); - } - } - - return containedFilePaths; } std::set SourceGroupCxxCdb::getAllSourceFilePaths() const diff --git a/src/lib_cxx/project/SourceGroupCxxCodeblocks.cpp b/src/lib_cxx/project/SourceGroupCxxCodeblocks.cpp index aac61e7a..3476e332 100644 --- a/src/lib_cxx/project/SourceGroupCxxCodeblocks.cpp +++ b/src/lib_cxx/project/SourceGroupCxxCodeblocks.cpp @@ -6,6 +6,7 @@ #include "utility/messaging/type/MessageStatus.h" #include "utility/codeblocks/CodeblocksProject.h" #include "utility/utility.h" +#include "utility/utilitySourceGroupCxx.h" #include "Application.h" SourceGroupCxxCodeblocks::SourceGroupCxxCodeblocks(std::shared_ptr settings) @@ -37,46 +38,12 @@ bool SourceGroupCxxCodeblocks::prepareIndexing() std::set SourceGroupCxxCodeblocks::filterToContainedFilePaths(const std::set& filePaths) const { - std::set containedFilePaths; - - const std::set indexedPaths = utility::concat( - getAllSourceFilePaths(), - utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()) + return utility::filterToContainedFilePaths( + filePaths, + getAllSourceFilePaths(), + utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()), + m_settings->getExcludeFiltersExpandedAndAbsolute() ); - - const std::vector excludeFilters = m_settings->getExcludeFiltersExpandedAndAbsolute(); - - for (const FilePath& filePath : filePaths) - { - bool isInIndexedPaths = false; - for (const FilePath& indexedPath : indexedPaths) - { - if (indexedPath == filePath || indexedPath.contains(filePath)) - { - isInIndexedPaths = true; - break; - } - } - - if (isInIndexedPaths) - { - for (const FilePathFilter& excludeFilter : excludeFilters) - { - if (excludeFilter.isMatching(filePath)) - { - isInIndexedPaths = false; - break; - } - } - } - - if (isInIndexedPaths) - { - containedFilePaths.insert(filePath); - } - } - - return containedFilePaths; } std::set SourceGroupCxxCodeblocks::getAllSourceFilePaths() const diff --git a/src/lib_cxx/project/SourceGroupCxxEmpty.cpp b/src/lib_cxx/project/SourceGroupCxxEmpty.cpp index b24cef73..d0b68ea5 100644 --- a/src/lib_cxx/project/SourceGroupCxxEmpty.cpp +++ b/src/lib_cxx/project/SourceGroupCxxEmpty.cpp @@ -8,6 +8,7 @@ #include "settings/SourceGroupSettingsWithCStandard.h" #include "utility/file/FileManager.h" #include "utility/utility.h" +#include "utility/utilitySourceGroupCxx.h" SourceGroupCxxEmpty::SourceGroupCxxEmpty(std::shared_ptr settings) : m_settings(settings) @@ -16,8 +17,6 @@ SourceGroupCxxEmpty::SourceGroupCxxEmpty(std::shared_ptr std::set SourceGroupCxxEmpty::filterToContainedFilePaths(const std::set& filePaths) const { - std::set containedFilePaths; - std::vector indexedPaths; std::vector excludeFilters; if (std::shared_ptr settings = @@ -33,36 +32,12 @@ std::set SourceGroupCxxEmpty::filterToContainedFilePaths(const std::se excludeFilters = settings->getExcludeFiltersExpandedAndAbsolute(); } - for (const FilePath& filePath : filePaths) - { - bool isInIndexedPaths = false; - for (const FilePath& indexedPath : indexedPaths) - { - if (indexedPath == filePath || indexedPath.contains(filePath)) - { - isInIndexedPaths = true; - break; - } - } - - if (isInIndexedPaths) - { - for (const FilePathFilter& excludeFilter : excludeFilters) - { - if (excludeFilter.isMatching(filePath)) - { - isInIndexedPaths = false; - break; - } - } - } - - if (isInIndexedPaths) - { - containedFilePaths.insert(filePath); - } - } - return containedFilePaths; + return utility::filterToContainedFilePaths( + filePaths, + utility::toSet(indexedPaths), + std::set(), + excludeFilters + ); } std::set SourceGroupCxxEmpty::getAllSourceFilePaths() const @@ -86,7 +61,7 @@ std::set SourceGroupCxxEmpty::getAllSourceFilePaths() const settings->getSourceExtensions() ); } - + return fileManager.getAllSourceFilePaths(); } diff --git a/src/lib_cxx/project/SourceGroupCxxSonargraph.cpp b/src/lib_cxx/project/SourceGroupCxxSonargraph.cpp index 9b990bf4..f3294f82 100644 --- a/src/lib_cxx/project/SourceGroupCxxSonargraph.cpp +++ b/src/lib_cxx/project/SourceGroupCxxSonargraph.cpp @@ -6,6 +6,7 @@ #include "utility/messaging/type/MessageStatus.h" #include "utility/sonargraph/SonargraphProject.h" #include "utility/utility.h" +#include "utility/utilitySourceGroupCxx.h" #include "Application.h" SourceGroupCxxSonargraph::SourceGroupCxxSonargraph(std::shared_ptr settings) @@ -37,26 +38,12 @@ bool SourceGroupCxxSonargraph::prepareIndexing() std::set SourceGroupCxxSonargraph::filterToContainedFilePaths(const std::set& filePaths) const { - std::set containedFilePaths; - - const std::set indexedPaths = utility::concat( + return utility::filterToContainedFilePaths( + filePaths, getAllSourceFilePaths(), - utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()) + utility::toSet(m_settings->getIndexedHeaderPathsExpandedAndAbsolute()), + std::vector() ); - - for (const FilePath& filePath : filePaths) - { - for (const FilePath& indexedPath : indexedPaths) - { - if (indexedPath == filePath || indexedPath.contains(filePath)) - { - containedFilePaths.insert(filePath); - break; - } - } - } - - return containedFilePaths; } std::set SourceGroupCxxSonargraph::getAllSourceFilePaths() const diff --git a/src/lib_cxx/project/SourceGroupFactoryModuleCxx.cpp b/src/lib_cxx/project/SourceGroupFactoryModuleCxx.cpp index d3233c7d..7ca98cd4 100644 --- a/src/lib_cxx/project/SourceGroupFactoryModuleCxx.cpp +++ b/src/lib_cxx/project/SourceGroupFactoryModuleCxx.cpp @@ -10,10 +10,6 @@ #include "settings/SourceGroupSettingsCppEmpty.h" #include "settings/SourceGroupSettingsCxxSonargraph.h" -SourceGroupFactoryModuleCxx::~SourceGroupFactoryModuleCxx() -{ -} - bool SourceGroupFactoryModuleCxx::supports(SourceGroupType type) const { switch (type) @@ -30,7 +26,7 @@ bool SourceGroupFactoryModuleCxx::supports(SourceGroupType type) const return false; } -std::shared_ptr SourceGroupFactoryModuleCxx::createSourceGroup(std::shared_ptr settings) +std::shared_ptr SourceGroupFactoryModuleCxx::createSourceGroup(std::shared_ptr settings) const { std::shared_ptr sourceGroup; if (std::shared_ptr cxxSettings = std::dynamic_pointer_cast(settings)) diff --git a/src/lib_cxx/project/SourceGroupFactoryModuleCxx.h b/src/lib_cxx/project/SourceGroupFactoryModuleCxx.h index 87f8bff6..3e3671ae 100644 --- a/src/lib_cxx/project/SourceGroupFactoryModuleCxx.h +++ b/src/lib_cxx/project/SourceGroupFactoryModuleCxx.h @@ -6,9 +6,8 @@ class SourceGroupFactoryModuleCxx: public SourceGroupFactoryModule { public: - virtual ~SourceGroupFactoryModuleCxx(); - virtual bool supports(SourceGroupType type) const; - virtual std::shared_ptr createSourceGroup(std::shared_ptr settings); + bool supports(SourceGroupType type) const override; + std::shared_ptr createSourceGroup(std::shared_ptr settings) const override; }; #endif // SOURCE_GROUP_FACTORY_MODULE_CXX_H diff --git a/src/lib_cxx/utility/IncludeProcessing.h b/src/lib_cxx/utility/IncludeProcessing.h index 9bc1dff8..52906658 100644 --- a/src/lib_cxx/utility/IncludeProcessing.h +++ b/src/lib_cxx/utility/IncludeProcessing.h @@ -42,7 +42,7 @@ private: ); static FilePath resolveIncludeDirective( - const IncludeDirective& includeDirective, + const IncludeDirective& includeDirective, const std::set& headerSearchDirectories ); diff --git a/src/lib_cxx/utility/utilitySourceGroupCxx.cpp b/src/lib_cxx/utility/utilitySourceGroupCxx.cpp new file mode 100644 index 00000000..d21c8635 --- /dev/null +++ b/src/lib_cxx/utility/utilitySourceGroupCxx.cpp @@ -0,0 +1,55 @@ +#include "utility/utilitySourceGroupCxx.h" + +std::set utility::filterToContainedFilePaths( + const std::set filePaths, + const std::set& indexedSourcePaths, + const std::set& indexedHeaderPaths, + const std::vector excludeFilters) +{ + std::set containedFilePaths; + + for (const FilePath& filePath : filePaths) + { + bool isInIndexedPaths = false; + { + for (const FilePath& indexedHeaderPath : indexedHeaderPaths) + { + if (indexedHeaderPath == filePath || indexedHeaderPath.contains(filePath)) + { + isInIndexedPaths = true; + break; + } + } + } + if (!isInIndexedPaths) + { + for (const FilePath& indexedSourcePath : indexedSourcePaths) + { + if (indexedSourcePath == filePath) + { + isInIndexedPaths = true; + break; + } + } + } + + if (isInIndexedPaths) + { + for (const FilePathFilter& excludeFilter : excludeFilters) + { + if (excludeFilter.isMatching(filePath)) + { + isInIndexedPaths = false; + break; + } + } + } + + if (isInIndexedPaths) + { + containedFilePaths.insert(filePath); + } + } + + return containedFilePaths; +} diff --git a/src/lib_cxx/utility/utilitySourceGroupCxx.h b/src/lib_cxx/utility/utilitySourceGroupCxx.h new file mode 100644 index 00000000..54eda591 --- /dev/null +++ b/src/lib_cxx/utility/utilitySourceGroupCxx.h @@ -0,0 +1,19 @@ +#ifndef UTILITY_SOURCE_GROUP_CXX_H +#define UTILITY_SOURCE_GROUP_CXX_H + +#include +#include + +#include "utility/file/FilePath.h" +#include "utility/file/FilePathFilter.h" + +namespace utility +{ + std::set filterToContainedFilePaths( + const std::set filePaths, + const std::set& indexedSourcePaths, + const std::set& indexedHeaderPaths, + const std::vector excludeFilters); +} + +#endif // UTILITY_SOURCE_GROUP_CXX_H diff --git a/src/lib_java/project/SourceGroupFactoryModuleJava.cpp b/src/lib_java/project/SourceGroupFactoryModuleJava.cpp index 0e0bdcd3..f9d79887 100644 --- a/src/lib_java/project/SourceGroupFactoryModuleJava.cpp +++ b/src/lib_java/project/SourceGroupFactoryModuleJava.cpp @@ -9,10 +9,6 @@ #include "settings/SourceGroupSettingsJavaMaven.h" #include "settings/SourceGroupSettingsJavaSonargraph.h" -SourceGroupFactoryModuleJava::~SourceGroupFactoryModuleJava() -{ -} - bool SourceGroupFactoryModuleJava::supports(SourceGroupType type) const { switch (type) @@ -28,7 +24,7 @@ bool SourceGroupFactoryModuleJava::supports(SourceGroupType type) const return false; } -std::shared_ptr SourceGroupFactoryModuleJava::createSourceGroup(std::shared_ptr settings) +std::shared_ptr SourceGroupFactoryModuleJava::createSourceGroup(std::shared_ptr settings) const { std::shared_ptr sourceGroup; if (std::shared_ptr javaSettings = std::dynamic_pointer_cast(settings)) diff --git a/src/lib_java/project/SourceGroupFactoryModuleJava.h b/src/lib_java/project/SourceGroupFactoryModuleJava.h index 0d82bd34..f07f15a4 100644 --- a/src/lib_java/project/SourceGroupFactoryModuleJava.h +++ b/src/lib_java/project/SourceGroupFactoryModuleJava.h @@ -6,9 +6,8 @@ class SourceGroupFactoryModuleJava: public SourceGroupFactoryModule { public: - virtual ~SourceGroupFactoryModuleJava(); - virtual bool supports(SourceGroupType type) const; - virtual std::shared_ptr createSourceGroup(std::shared_ptr settings); + bool supports(SourceGroupType type) const override; + std::shared_ptr createSourceGroup(std::shared_ptr settings) const override; }; #endif // SOURCE_GROUP_FACTORY_MODULE_JAVA_H