diff --git a/src/tools/clangrefactoringbackend/source/sourcesmanager.h b/src/tools/clangrefactoringbackend/source/sourcesmanager.h index 25451b676a4..a586707c638 100644 --- a/src/tools/clangrefactoringbackend/source/sourcesmanager.h +++ b/src/tools/clangrefactoringbackend/source/sourcesmanager.h @@ -59,6 +59,8 @@ public: if (!upToDate) addOrUpdateNewEntry(filePathId, modifiedTime); + m_dependendFilesModified = m_dependendFilesModified || !upToDate; + return upToDate ; } @@ -80,6 +82,17 @@ public: m_modifiedTimeStamps = std::move(mergedModifiedTimeStamps); m_newModifiedTimeStamps.clear(); + m_dependendFilesModified = false; + } + + bool dependendFilesModified() const + { + return m_dependendFilesModified; + } + + bool alreadyParsedAllDependFiles(FilePathId filePathId, std::time_t modifiedTime) + { + return alreadyParsed(filePathId, modifiedTime) && !dependendFilesModified(); } private: @@ -101,6 +114,7 @@ private: private: std::vector m_modifiedTimeStamps; std::vector m_newModifiedTimeStamps; + bool m_dependendFilesModified = false; }; } diff --git a/tests/unit/unittest/sourcesmanager-test.cpp b/tests/unit/unittest/sourcesmanager-test.cpp index f20cb1b143f..f969b9bc09d 100644 --- a/tests/unit/unittest/sourcesmanager-test.cpp +++ b/tests/unit/unittest/sourcesmanager-test.cpp @@ -136,4 +136,100 @@ TEST_F(SourcesManager, TimeIsUpdated) ASSERT_TRUE(sources.alreadyParsed({1, 1}, 57)); } +TEST_F(SourcesManager, AnyDependFileIsNotModifiedAfterInitialization) +{ + ASSERT_FALSE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsModified) +{ + sources.alreadyParsed({1, 1}, 56); + + ASSERT_TRUE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsModifiedAfterParsingTwoTimesSameTimeStamp) +{ + sources.alreadyParsed({1, 1}, 56); + sources.alreadyParsed({1, 1}, 56); + + ASSERT_TRUE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsNotModifiedAfterUpdate) +{ + sources.alreadyParsed({1, 1}, 56); + sources.updateModifiedTimeStamps(); + + ASSERT_FALSE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsNotModifiedAfterNotAlreadyPared) +{ + sources.alreadyParsed({1, 1}, 56); + sources.updateModifiedTimeStamps(); + + sources.alreadyParsed({1, 1}, 56); + + ASSERT_FALSE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsNotModifiedAfterAlreadyPared) +{ + sources.alreadyParsed({1, 1}, 56); + sources.updateModifiedTimeStamps(); + + sources.alreadyParsed({1, 1}, 57); + + ASSERT_TRUE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AnyDependFileIsModifiedAfterUpdateNewTimeStamp) +{ + sources.alreadyParsed({1, 1}, 56); + sources.alreadyParsed({1, 2}, 56); + sources.updateModifiedTimeStamps(); + sources.alreadyParsed({1, 1}, 57); + + sources.alreadyParsed({1, 2}, 56); + + ASSERT_TRUE(sources.dependendFilesModified()); +} + +TEST_F(SourcesManager, AlreadyParsedWithDependencyAfterUpdateNewTimeStamp) +{ + sources.alreadyParsedAllDependFiles({1, 1}, 56); + sources.alreadyParsedAllDependFiles({1, 2}, 56); + sources.updateModifiedTimeStamps(); + sources.alreadyParsedAllDependFiles({1, 1}, 57); + + bool alreadyParsed = sources.alreadyParsedAllDependFiles({1, 2}, 56); + + ASSERT_FALSE(alreadyParsed); +} + +TEST_F(SourcesManager, AlreadyParsedWithDependencyAfterUpdateNewSecondTimeStamp) +{ + sources.alreadyParsedAllDependFiles({1, 1}, 56); + sources.alreadyParsedAllDependFiles({1, 2}, 56); + sources.updateModifiedTimeStamps(); + sources.alreadyParsedAllDependFiles({1, 1}, 56); + + bool alreadyParsed = sources.alreadyParsedAllDependFiles({1, 2}, 57); + + ASSERT_FALSE(alreadyParsed); +} + +TEST_F(SourcesManager, AlreadyParsedWithDependencyAfterUpdateSameTimeStamps) +{ + sources.alreadyParsedAllDependFiles({1, 1}, 56); + sources.alreadyParsedAllDependFiles({1, 2}, 56); + sources.updateModifiedTimeStamps(); + sources.alreadyParsedAllDependFiles({1, 1}, 56); + + bool alreadyParsed = sources.alreadyParsedAllDependFiles({1, 2}, 56); + + ASSERT_TRUE(alreadyParsed); +} + }