diff --git a/src/lib/Application.cpp b/src/lib/Application.cpp index 40a2b0d5..4169e70d 100644 --- a/src/lib/Application.cpp +++ b/src/lib/Application.cpp @@ -101,6 +101,7 @@ void Application::reloadProject() m_storageCache->clear(); m_componentManager->refreshViews(); + m_project->reloadProjectSettings(); m_project->parseCode(); } diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp index d0d4a2fa..97a7b825 100644 --- a/src/lib/Project.cpp +++ b/src/lib/Project.cpp @@ -28,7 +28,8 @@ bool Project::loadProjectSettings(const std::string& projectSettingsFile) { m_projectSettingsFilepath = projectSettingsFile; - createFileManager(); + m_fileManager.reset(); + updateFileManager(); } return success; } @@ -60,6 +61,15 @@ void Project::clearProjectSettings() m_fileManager.reset(); } +void Project::reloadProjectSettings() +{ + if (m_projectSettingsFilepath.size()) + { + ProjectSettings::getInstance()->load(m_projectSettingsFilepath); + updateFileManager(); + } +} + bool Project::setSourceDirectoryPath(const std::string& sourceDirectoryPath) { m_projectSettingsFilepath = sourceDirectoryPath + "/ProjectSettings.xml"; @@ -67,7 +77,8 @@ bool Project::setSourceDirectoryPath(const std::string& sourceDirectoryPath) if (success) { - createFileManager(); + m_fileManager.reset(); + updateFileManager(); } return success; @@ -83,18 +94,12 @@ void Project::clearStorage() void Project::parseCode() { - if (!m_fileManager) - { - LOG_ERROR("No FileManger was created."); - return; - } - std::shared_ptr projSettings = ProjectSettings::getInstance(); - m_fileManager->fetchFilePaths(); - std::set addedFilePaths = m_fileManager->getAddedFilePaths(); - std::set updatedFilePaths = m_fileManager->getUpdatedFilePaths(); - std::set removedFilePaths = m_fileManager->getRemovedFilePaths(); + m_fileManager.fetchFilePaths(); + std::set addedFilePaths = m_fileManager.getAddedFilePaths(); + std::set updatedFilePaths = m_fileManager.getUpdatedFilePaths(); + std::set removedFilePaths = m_fileManager.getRemovedFilePaths(); utility::append(updatedFilePaths, m_storage->getDependingFilePathsAndRemoveFileNodes(updatedFilePaths)); utility::append(updatedFilePaths, m_storage->getDependingFilePathsAndRemoveFileNodes(removedFilePaths)); @@ -114,7 +119,7 @@ void Project::parseCode() Task::dispatch(std::make_shared( m_storage.get(), - m_fileManager.get(), + &m_fileManager, getParserArguments(), filesToParse )); @@ -127,7 +132,7 @@ void Project::logStats() const m_storage->logStats(); } -void Project::createFileManager() +void Project::updateFileManager() { std::shared_ptr projSettings = ProjectSettings::getInstance(); @@ -137,10 +142,7 @@ void Project::createFileManager() std::vector sourceExtensions = projSettings->getSourceExtensions(); std::vector includeExtensions = projSettings->getHeaderExtensions(); - if (sourcePaths.size()) - { - m_fileManager = std::make_shared(sourcePaths, includePaths, sourceExtensions, includeExtensions); - } + m_fileManager.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); } Parser::Arguments Project::getParserArguments() const @@ -150,17 +152,11 @@ Parser::Arguments Project::getParserArguments() const Parser::Arguments args; - if (!m_fileManager) - { - LOG_ERROR("No FileManger was created."); - return args; - } - utility::append(args.compilerFlags, projSettings->getCompilerFlags()); utility::append(args.compilerFlags, appSettings->getCompilerFlags()); // Add the include paths as HeaderSearchPaths as well, so clang will also look here when searching include files. - utility::append(args.systemHeaderSearchPaths, m_fileManager->getIncludePaths()); + utility::append(args.systemHeaderSearchPaths, m_fileManager.getIncludePaths()); utility::append(args.systemHeaderSearchPaths, projSettings->getHeaderSearchPaths()); utility::append(args.systemHeaderSearchPaths, appSettings->getHeaderSearchPaths()); diff --git a/src/lib/Project.h b/src/lib/Project.h index 17bd3ce0..25a09880 100644 --- a/src/lib/Project.h +++ b/src/lib/Project.h @@ -20,6 +20,7 @@ public: bool loadProjectSettings(const std::string& projectSettingsFile); bool saveProjectSettings(const std::string& projectSettingsFile); void clearProjectSettings(); + void reloadProjectSettings(); bool setSourceDirectoryPath(const std::string& sourceDirectoryPath); @@ -33,16 +34,16 @@ private: Project(const Project&); Project operator=(const Project&); - void createFileManager(); + void updateFileManager(); Parser::Arguments getParserArguments() const; - std::string m_projectSettingsFilepath; - StorageAccessProxy* const m_storageAccessProxy; + std::string m_projectSettingsFilepath; + FileManager m_fileManager; + std::shared_ptr m_storage; - std::shared_ptr m_fileManager; }; #endif // PROJECT_H diff --git a/src/lib/utility/file/FileManager.cpp b/src/lib/utility/file/FileManager.cpp index 163c36ae..318f69e8 100644 --- a/src/lib/utility/file/FileManager.cpp +++ b/src/lib/utility/file/FileManager.cpp @@ -5,16 +5,7 @@ #include "utility/file/FileSystem.h" -FileManager::FileManager( - std::vector sourcePaths, - std::vector includePaths, - std::vector sourceExtensions, - std::vector includeExtensions -) - : m_sourcePaths(sourcePaths) - , m_includePaths(includePaths) - , m_sourceExtensions(sourceExtensions) - , m_includeExtensions(includeExtensions) +FileManager::FileManager() { } @@ -32,6 +23,18 @@ const std::vector& FileManager::getIncludePaths() const return m_includePaths; } +void FileManager::setPaths( + std::vector sourcePaths, + std::vector includePaths, + std::vector sourceExtensions, + std::vector includeExtensions +){ + m_sourcePaths = sourcePaths; + m_includePaths = includePaths; + m_sourceExtensions = sourceExtensions; + m_includeExtensions = includeExtensions; +} + void FileManager::reset() { m_files.clear(); diff --git a/src/lib/utility/file/FileManager.h b/src/lib/utility/file/FileManager.h index 5788404b..867d58a9 100644 --- a/src/lib/utility/file/FileManager.h +++ b/src/lib/utility/file/FileManager.h @@ -10,16 +10,18 @@ class FileManager { public: - FileManager( + FileManager(); + ~FileManager(); + + const std::vector& getSourcePaths() const; + const std::vector& getIncludePaths() const; + + void setPaths( std::vector sourcePaths, std::vector includePaths, std::vector sourceExtensions, std::vector includeExtensions ); - ~FileManager(); - - const std::vector& getSourcePaths() const; - const std::vector& getIncludePaths() const; void reset(); void fetchFilePaths(); diff --git a/src/test/FileManagerTestSuite.h b/src/test/FileManagerTestSuite.h index 5c838123..270021bf 100644 --- a/src/test/FileManagerTestSuite.h +++ b/src/test/FileManagerTestSuite.h @@ -7,18 +7,7 @@ class FileManagerTestSuite : public CxxTest::TestSuite public: void test_file_manager_is_created_empty() { - std::vector sourcePaths; - sourcePaths.push_back("./data/FileManagerTestSuite/src/"); - std::vector includePaths; - includePaths.push_back("./data/FileManagerTestSuite/include/"); - std::vector sourceExtensions; - sourceExtensions.push_back(".cpp"); - sourceExtensions.push_back(".c"); - std::vector includeExtensions; - includeExtensions.push_back(".hpp"); - includeExtensions.push_back(".h"); - - FileManager fm = FileManager(sourcePaths, includePaths, sourceExtensions, includeExtensions); + FileManager fm = FileManager(); TS_ASSERT_EQUALS(fm.getAddedFilePaths().size(), 0); TS_ASSERT_EQUALS(fm.getUpdatedFilePaths().size(), 0); @@ -38,7 +27,8 @@ public: includeExtensions.push_back(".hpp"); includeExtensions.push_back(".h"); - FileManager fm = FileManager(sourcePaths, includePaths, sourceExtensions, includeExtensions); + FileManager fm; + fm.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); fm.fetchFilePaths(); TS_ASSERT_EQUALS(fm.getAddedFilePaths().size(), 4); @@ -57,7 +47,8 @@ public: includeExtensions.push_back(".hpp"); includeExtensions.push_back(".h"); - FileManager fm = FileManager(sourcePaths, includePaths, sourceExtensions, includeExtensions); + FileManager fm; + fm.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); fm.fetchFilePaths(); fm.fetchFilePaths(); @@ -77,7 +68,8 @@ public: includeExtensions.push_back(".hpp"); includeExtensions.push_back(".h"); - FileManager fm = FileManager(sourcePaths, includePaths, sourceExtensions, includeExtensions); + FileManager fm; + fm.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); fm.fetchFilePaths(); std::fstream fileStream; @@ -91,4 +83,33 @@ public: TS_ASSERT_EQUALS(fm.getUpdatedFilePaths().size(), 1); TS_ASSERT_EQUALS(fm.getRemovedFilePaths().size(), 0); } + + void test_file_manager_has_added_and_removed_file_paths_after_setting_different_paths() + { + std::vector sourcePaths(1, "./data/FileManagerTestSuite/src/a.cpp"); + std::vector includePaths(1, "./data/FileManagerTestSuite/include/c.h"); + std::vector sourceExtensions; + sourceExtensions.push_back(".cpp"); + sourceExtensions.push_back(".c"); + std::vector includeExtensions; + includeExtensions.push_back(".hpp"); + includeExtensions.push_back(".h"); + + FileManager fm; + fm.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); + fm.fetchFilePaths(); + + TS_ASSERT_EQUALS(fm.getAddedFilePaths().size(), 2); + TS_ASSERT_EQUALS(fm.getUpdatedFilePaths().size(), 0); + TS_ASSERT_EQUALS(fm.getRemovedFilePaths().size(), 0); + + sourcePaths[0] = "./data/FileManagerTestSuite/src/d.c"; + + fm.setPaths(sourcePaths, includePaths, sourceExtensions, includeExtensions); + fm.fetchFilePaths(); + + TS_ASSERT_EQUALS(fm.getAddedFilePaths().size(), 1); + TS_ASSERT_EQUALS(fm.getUpdatedFilePaths().size(), 0); + TS_ASSERT_EQUALS(fm.getRemovedFilePaths().size(), 1); + } }; diff --git a/src/test/helper/TestFileManager.cpp b/src/test/helper/TestFileManager.cpp index f843436f..0ef56b29 100644 --- a/src/test/helper/TestFileManager.cpp +++ b/src/test/helper/TestFileManager.cpp @@ -1,12 +1,6 @@ #include "TestFileManager.h" TestFileManager::TestFileManager() - : FileManager( - std::vector(), - std::vector(), - std::vector(), - std::vector() - ) { } diff --git a/src/test/helper/TestFileManager.h b/src/test/helper/TestFileManager.h index c37cb2e1..c6957027 100644 --- a/src/test/helper/TestFileManager.h +++ b/src/test/helper/TestFileManager.h @@ -3,7 +3,8 @@ #include "utility/file/FileManager.h" -class TestFileManager: public FileManager +class TestFileManager + : public FileManager { public: TestFileManager();