From 2bd0c7c2764f6b60980be87b5d17d4ac6b49e0ff Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 14 Feb 2019 13:29:21 +0100 Subject: [PATCH] ClangPchManager: Don't watch generated files Task-number: QTCREATORBUG-21983 Change-Id: I80af39278140c48c8740c83af85596d3ee9bf2da Reviewed-by: Ivan Donchevskii --- .../source/pchcreator.cpp | 19 ++++++++++++++++++- .../source/pchcreator.h | 1 + tests/unit/unittest/pchcreator-test.cpp | 11 ++++------- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp index f4a10053622..71a033d67ce 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp @@ -138,6 +138,16 @@ const ProjectPartPch &PchCreator::projectPartPch() void PchCreator::setUnsavedFiles(const V2::FileContainers &fileContainers) { + m_generatedFilePathIds.clear(); + m_generatedFilePathIds.reserve(fileContainers.size()); + std::transform(fileContainers.begin(), + fileContainers.end(), + std::back_inserter(m_generatedFilePathIds), + [&](const V2::FileContainer &fileContainer) { + return m_filePathCache.filePathId(fileContainer.filePath); + }); + std::sort(m_generatedFilePathIds.begin(), m_generatedFilePathIds.end()); + m_clangTool.addUnsavedFiles(fileContainers); } @@ -159,7 +169,14 @@ void PchCreator::clear() void PchCreator::doInMainThreadAfterFinished() { - m_clangPathwatcher.updateIdPaths({{m_projectPartPch.projectPartId, m_allInclues}}); + FilePathIds existingIncludes; + existingIncludes.reserve(m_allInclues.size()); + std::set_difference(m_allInclues.begin(), + m_allInclues.end(), + m_generatedFilePathIds.begin(), + m_generatedFilePathIds.end(), + std::back_inserter(existingIncludes)); + m_clangPathwatcher.updateIdPaths({{m_projectPartPch.projectPartId, existingIncludes}}); m_pchManagerClient.precompiledHeadersUpdated(ProjectPartPchs{m_projectPartPch}); } diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.h b/src/tools/clangpchmanagerbackend/source/pchcreator.h index b2c0c309e77..7c736dd2342 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.h +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.h @@ -98,6 +98,7 @@ private: ProjectPartPch m_projectPartPch; FilePathCaching m_filePathCache; FilePathIds m_allInclues; + FilePathIds m_generatedFilePathIds; Environment &m_environment; PchManagerClientInterface &m_pchManagerClient; ClangPathWatcherInterface &m_clangPathwatcher; diff --git a/tests/unit/unittest/pchcreator-test.cpp b/tests/unit/unittest/pchcreator-test.cpp index d44e72ee6f5..9c675c873dc 100644 --- a/tests/unit/unittest/pchcreator-test.cpp +++ b/tests/unit/unittest/pchcreator-test.cpp @@ -78,10 +78,7 @@ MATCHER_P2(HasIdAndType, class PchCreator: public ::testing::Test { protected: - PchCreator() - { - creator.setUnsavedFiles({generatedFile}); - } + PchCreator() { creator.setUnsavedFiles({generatedFile}); } ClangBackEnd::FilePathId id(ClangBackEnd::FilePathView path) { @@ -95,10 +92,9 @@ protected: FilePath main2Path = TESTDATA_DIR "/builddependencycollector/project/main2.cpp"; FilePath header1Path = TESTDATA_DIR "/builddependencycollector/project/header1.h"; FilePath header2Path = TESTDATA_DIR "/builddependencycollector/project/header2.h"; - Utils::SmallStringView generatedFileName = "builddependencycollector/project/generated_file.h"; FilePath generatedFilePath = TESTDATA_DIR "/builddependencycollector/project/generated_file.h"; TestEnvironment environment; - FileContainer generatedFile{{TESTDATA_DIR, generatedFileName}, "#pragma once", {}}; + FileContainer generatedFile{generatedFilePath.clone(), "#pragma once", {}}; NiceMock mockPchManagerClient; NiceMock mockClangPathWatcher; ClangBackEnd::PchCreator creator{environment, database, mockPchManagerClient, mockClangPathWatcher}; @@ -107,7 +103,8 @@ protected: {id(TESTDATA_DIR "/builddependencycollector/project/header2.h"), id(TESTDATA_DIR "/builddependencycollector/external/external1.h"), id(TESTDATA_DIR "/builddependencycollector/external/external2.h")}, - {id(TESTDATA_DIR "/builddependencycollector/project/header2.h"), + {id(generatedFilePath), + id(TESTDATA_DIR "/builddependencycollector/project/header2.h"), id(TESTDATA_DIR "/builddependencycollector/external/external1.h"), id(TESTDATA_DIR "/builddependencycollector/external/external2.h")}, {},