From df8653dda9f102120176826a54497676d34f6210 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 22 Jan 2019 14:38:39 +0100 Subject: [PATCH] PchManager: Fix generated file handling in PchCreator Task-number: QTCREATORBUG-21843 Change-Id: I0517b87725117b7db7db14d32b737a0a6f2b3c35 Reviewed-by: Ivan Donchevskii --- .../source/pchcreator.cpp | 3 ++- .../clangpchmanagerbackend/source/pchcreator.h | 6 +++++- .../source/clangtool.cpp | 6 ++++++ .../clangrefactoringbackend/source/clangtool.h | 4 ++++ tests/unit/unittest/pchcreator-test.cpp | 17 +++++++++++++++++ 5 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp index ea9d7c3e376..f10c620a897 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp @@ -148,7 +148,7 @@ const ProjectPartPch &PchCreator::projectPartPch() void PchCreator::setUnsavedFiles(const V2::FileContainers &fileContainers) { - m_unsavedFiles = fileContainers; + m_clangTool.addUnsavedFiles(fileContainers); } void PchCreator::setIsUsed(bool isUsed) @@ -163,6 +163,7 @@ bool PchCreator::isUsed() const void PchCreator::clear() { + m_clangTool = ClangTool{}; m_projectPartPch = {}; } diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.h b/src/tools/clangpchmanagerbackend/source/pchcreator.h index ce1b7ab1eba..7e5eb36d77d 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.h +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.h @@ -89,12 +89,16 @@ public: static std::unique_ptr generateFileWithContent(const Utils::SmallString &filePath, const Utils::SmallString &content); + const ClangTool &clangTool() const + { + return m_clangTool; + } + private: mutable std::mt19937_64 randomNumberGenator{std::random_device{}()}; ClangTool m_clangTool; ProjectPartPch m_projectPartPch; FilePathCaching m_filePathCache; - V2::FileContainers m_unsavedFiles; Environment &m_environment; PchManagerClientInterface &m_pchManagerClient; bool m_isUsed = false; diff --git a/src/tools/clangrefactoringbackend/source/clangtool.cpp b/src/tools/clangrefactoringbackend/source/clangtool.cpp index dea6e1190a6..66f85c6d36d 100644 --- a/src/tools/clangrefactoringbackend/source/clangtool.cpp +++ b/src/tools/clangrefactoringbackend/source/clangtool.cpp @@ -149,4 +149,10 @@ clang::tooling::ClangTool ClangTool::createOutputTool() const return tool; } +bool ClangTool::isClean() const +{ + return m_sourceFilePaths.empty() && m_fileContents.empty() + && m_compilationDatabase.getAllFiles().empty() && m_unsavedFileContents.empty(); +} + } // namespace ClangBackEnd diff --git a/src/tools/clangrefactoringbackend/source/clangtool.h b/src/tools/clangrefactoringbackend/source/clangtool.h index deee71599b3..b9d366859e3 100644 --- a/src/tools/clangrefactoringbackend/source/clangtool.h +++ b/src/tools/clangrefactoringbackend/source/clangtool.h @@ -93,6 +93,10 @@ public: clang::tooling::ClangTool createTool() const; clang::tooling::ClangTool createOutputTool() const; + bool isClean() const; + + + private: RefactoringCompilationDatabase m_compilationDatabase; std::vector m_fileContents; diff --git a/tests/unit/unittest/pchcreator-test.cpp b/tests/unit/unittest/pchcreator-test.cpp index 68c67ecdd51..b03371794c9 100644 --- a/tests/unit/unittest/pchcreator-test.cpp +++ b/tests/unit/unittest/pchcreator-test.cpp @@ -227,6 +227,15 @@ TEST_F(PchCreatorVerySlowTest, ProjectPartPchCleared) ASSERT_THAT(creator.projectPartPch(), ClangBackEnd::ProjectPartPch{}); } +TEST_F(PchCreatorVerySlowTest, ClangToolCleared) +{ + creator.generatePch(std::move(pchTask1)); + + creator.clear(); + + ASSERT_TRUE(creator.clangTool().isClean()); +} + TEST_F(PchCreatorVerySlowTest, FaultyProjectPartPchForCreatesFaultyPchForPchTask) { PchTask faultyPchTask{"faultyProjectPart", @@ -245,4 +254,12 @@ TEST_F(PchCreatorVerySlowTest, FaultyProjectPartPchForCreatesFaultyPchForPchTask Field(&ProjectPartPch::lastModified, Eq(-1)))); } +TEST_F(PchCreatorVerySlowTest, GeneratedFile) +{ + creator.clear(); + + creator.setUnsavedFiles({generatedFile}); + + ASSERT_FALSE(creator.clangTool().isClean()); +} }