From cc0db43c34b19f7142bd042fd5355f1853a2c35a Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 16 Aug 2018 18:01:55 +0200 Subject: [PATCH] Clang: Extent sources manager with dependency For many index cases such a function call it is needed to check if any of the included files are changed because the function which is called could be changed too. Change-Id: Ibe0f43426c735d39072f284cad075dd4dc6f99c0 Reviewed-by: Ivan Donchevskii --- .../source/sourcesmanager.h | 14 +++ tests/unit/unittest/sourcesmanager-test.cpp | 96 +++++++++++++++++++ 2 files changed, 110 insertions(+) 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); +} + }