diff --git a/src/lib/utility/utility.h b/src/lib/utility/utility.h index 075d94bd..1c7f0372 100644 --- a/src/lib/utility/utility.h +++ b/src/lib/utility/utility.h @@ -73,6 +73,12 @@ namespace utility template std::vector convert(const std::vector& sourceContainer); + template + std::set convert(const std::set& sourceContainer, std::function conversion); + + template + std::set convert(const std::set& sourceContainer); + template std::vector toStrings(const std::vector& d); template<> @@ -259,7 +265,8 @@ template std::vector utility::convert(const std::vector& sourceContainer, std::function conversion) { std::vector targetContainer; - for (const SourceType& sourceElement: sourceContainer) + targetContainer.reserve(sourceContainer.size()); + for (const SourceType& sourceElement : sourceContainer) { targetContainer.push_back(conversion(sourceElement)); } @@ -270,6 +277,7 @@ template std::vector utility::convert(const std::vector& sourceContainer) { std::vector targetContainer; + targetContainer.reserve(sourceContainer.size()); for (const SourceType& sourceElement : sourceContainer) { targetContainer.push_back(TargetType(sourceElement)); @@ -277,6 +285,28 @@ std::vector utility::convert(const std::vector& sourceCo return targetContainer; } +template +std::set utility::convert(const std::set& sourceContainer, std::function conversion) +{ + std::set targetContainer; + for (const SourceType& sourceElement : sourceContainer) + { + targetContainer.insert(conversion(sourceElement)); + } + return targetContainer; +} + +template +std::set utility::convert(const std::set& sourceContainer) +{ + std::set targetContainer; + for (const SourceType& sourceElement : sourceContainer) + { + targetContainer.insert(TargetType(sourceElement)); + } + return targetContainer; +} + template std::vector utility::toStrings(const std::vector& d) { diff --git a/src/lib_cxx/utility/codeblocks/CodeblocksProject.cpp b/src/lib_cxx/utility/codeblocks/CodeblocksProject.cpp index 94b3d444..d5b0f133 100644 --- a/src/lib_cxx/utility/codeblocks/CodeblocksProject.cpp +++ b/src/lib_cxx/utility/codeblocks/CodeblocksProject.cpp @@ -129,7 +129,17 @@ namespace Codeblocks std::shared_ptr sourceGroupSettings ) const { - const std::set sourceExtensions = utility::toSet(sourceGroupSettings->getSourceExtensions()); + return utility::convert(getAllSourceFilePaths(sourceGroupSettings), [](const FilePath& path) { return path.getCanonical(); }); + } + + std::set Project::getAllSourceFilePaths( + std::shared_ptr sourceGroupSettings + ) const + { + const std::set sourceExtensions = utility::toSet(utility::convert( + sourceGroupSettings->getSourceExtensions(), + [](const std::wstring& e) { return utility::toLowerCase(e); } + )); std::set filePaths; for (std::shared_ptr unit : m_units) @@ -139,7 +149,7 @@ namespace Codeblocks FilePath filePath(unit->getFilename()); if (sourceExtensions.find(filePath.getLowerCase().extension()) != sourceExtensions.end()) { - filePaths.insert(filePath.makeCanonical()); + filePaths.insert(filePath); } } } @@ -148,16 +158,33 @@ namespace Codeblocks std::set Project::getAllCxxHeaderSearchPathsCanonical() const { + std::set usedTargetNames; + for (std::shared_ptr unit : m_units) + { + if (unit && unit->getCompile()) + { + utility::append(usedTargetNames, unit->getTargetNames()); + } + } + + OrderedCache canonicalDirectoryPathCache([](const FilePath& path) { + return path.getCanonical(); + }); + std::set paths; for (std::shared_ptr target : m_targets) { - if (target) + if (target && usedTargetNames.find(target->getTitle()) != usedTargetNames.end()) { if (std::shared_ptr compiler = target->getCompiler()) { for (const std::wstring& directory : compiler->getDirectories()) { - paths.insert(FilePath(directory).makeCanonical()); + FilePath path(directory); + if (path.isAbsolute()) + { + paths.insert(canonicalDirectoryPathCache.getValue(path)); + } } } } diff --git a/src/lib_cxx/utility/codeblocks/CodeblocksProject.h b/src/lib_cxx/utility/codeblocks/CodeblocksProject.h index 123c48c8..1b918f4a 100644 --- a/src/lib_cxx/utility/codeblocks/CodeblocksProject.h +++ b/src/lib_cxx/utility/codeblocks/CodeblocksProject.h @@ -27,6 +27,9 @@ namespace Codeblocks std::set getAllSourceFilePathsCanonical( std::shared_ptr sourceGroupSettings ) const; + std::set getAllSourceFilePaths( + std::shared_ptr sourceGroupSettings + ) const; std::set getAllCxxHeaderSearchPathsCanonical() const; std::vector> getIndexerCommands( diff --git a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.cpp b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.cpp index 63ae9878..0a227ba6 100644 --- a/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.cpp +++ b/src/lib_gui/qt/window/project_wizzard/QtProjectWizzardContentPaths.cpp @@ -312,9 +312,13 @@ std::vector QtProjectWizzardContentIndexedHeaderPaths::getIndexedPaths { if (std::shared_ptr codeblocksProject = Codeblocks::Project::load(codeblocksProjectPath)) { - for (const FilePath& path : codeblocksProject->getAllSourceFilePathsCanonical(settings)) + OrderedCache canonicalDirectoryPathCache([](const FilePath& path) { + return path.getCanonical(); + }); + + for (const FilePath& path : codeblocksProject->getAllSourceFilePaths(settings)) { - indexedHeaderPaths.insert(path.getCanonical().getParentDirectory()); + indexedHeaderPaths.insert(canonicalDirectoryPathCache.getValue(path.getParentDirectory())); } utility::append(indexedHeaderPaths, codeblocksProject->getAllCxxHeaderSearchPathsCanonical()); }