Clang: Watch only PCH sources

We watched all sources but we do not want to watch the sources of the
project part because they are not used to build a PCH.

Change-Id: I700cd6077fc54230c9be94d620043cf3f10cf9ea
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2019-06-18 18:26:27 +02:00
parent cbfd9dc16b
commit e031ada154
13 changed files with 49 additions and 37 deletions

View File

@@ -144,11 +144,11 @@ public:
table.setName("projectPartsFiles"); table.setName("projectPartsFiles");
const Sqlite::Column &projectPartIdColumn = table.addColumn("projectPartId", Sqlite::ColumnType::Integer); const Sqlite::Column &projectPartIdColumn = table.addColumn("projectPartId", Sqlite::ColumnType::Integer);
const Sqlite::Column &sourceIdColumn = table.addColumn("sourceId", Sqlite::ColumnType::Integer); const Sqlite::Column &sourceIdColumn = table.addColumn("sourceId", Sqlite::ColumnType::Integer);
table.addColumn("sourceType", Sqlite::ColumnType::Integer); const Sqlite::Column &sourceType = table.addColumn("sourceType", Sqlite::ColumnType::Integer);
table.addColumn("pchCreationTimeStamp", Sqlite::ColumnType::Integer); table.addColumn("pchCreationTimeStamp", Sqlite::ColumnType::Integer);
table.addColumn("hasMissingIncludes", Sqlite::ColumnType::Integer); table.addColumn("hasMissingIncludes", Sqlite::ColumnType::Integer);
table.addUniqueIndex({sourceIdColumn, projectPartIdColumn}); table.addUniqueIndex({sourceIdColumn, projectPartIdColumn});
table.addIndex({projectPartIdColumn}); table.addIndex({projectPartIdColumn, sourceType});
table.initialize(database); table.initialize(database);
} }

View File

@@ -66,10 +66,9 @@ public:
} }
} }
FilePathIds fetchSources(ProjectPartId projectPartId) const override FilePathIds fetchPchSources(ProjectPartId projectPartId) const override
{ {
return fetchProjectPartsFilesStatement.template values<FilePathId>(1024, return fetchPchSourcesStatement.template values<FilePathId>(1024, projectPartId.projectPathId);
projectPartId.projectPathId);
} }
void insertOrUpdateFileStatuses(const FileStatuses &fileStatuses) override void insertOrUpdateFileStatuses(const FileStatuses &fileStatuses) override
@@ -252,8 +251,10 @@ public:
"CONFLICT(sourceId, projectPartId) DO UPDATE SET sourceType = ?003, " "CONFLICT(sourceId, projectPartId) DO UPDATE SET sourceType = ?003, "
"hasMissingIncludes = ?004", "hasMissingIncludes = ?004",
database}; database};
mutable ReadStatement fetchProjectPartsFilesStatement{ mutable ReadStatement fetchPchSourcesStatement{
"SELECT sourceId FROM projectPartsFiles WHERE projectPartId = ? ORDER BY sourceId", database}; "SELECT sourceId FROM projectPartsFiles WHERE projectPartId = ? AND sourceType IN (0, 1, "
"3, 4) ORDER BY sourceId",
database};
mutable ReadStatement fetchSourceDependenciesStatement{ mutable ReadStatement fetchSourceDependenciesStatement{
"WITH RECURSIVE collectedDependencies(sourceId) AS (VALUES(?) UNION " "WITH RECURSIVE collectedDependencies(sourceId) AS (VALUES(?) UNION "
"SELECT dependencySourceId FROM sourceDependencies, " "SELECT dependencySourceId FROM sourceDependencies, "

View File

@@ -56,7 +56,7 @@ public:
virtual UsedMacros fetchUsedMacros(FilePathId sourceId) const = 0; virtual UsedMacros fetchUsedMacros(FilePathId sourceId) const = 0;
virtual ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) = 0; virtual ProjectPartId fetchProjectPartId(Utils::SmallStringView projectPartName) = 0;
virtual void updatePchCreationTimeStamp(long long pchCreationTimeStamp, ProjectPartId projectPartId) = 0; virtual void updatePchCreationTimeStamp(long long pchCreationTimeStamp, ProjectPartId projectPartId) = 0;
virtual FilePathIds fetchSources(ProjectPartId projectPartId) const = 0; virtual FilePathIds fetchPchSources(ProjectPartId projectPartId) const = 0;
protected: protected:
~BuildDependenciesStorageInterface() = default; ~BuildDependenciesStorageInterface() = default;

View File

@@ -114,7 +114,7 @@ void PchCreator::generatePch(PchTask &&pchTask)
{ {
m_projectPartPch.projectPartId = pchTask.projectPartId(); m_projectPartPch.projectPartId = pchTask.projectPartId();
m_projectPartPch.lastModified = QDateTime::currentSecsSinceEpoch(); m_projectPartPch.lastModified = QDateTime::currentSecsSinceEpoch();
m_sources = std::move(pchTask.sources);
if (pchTask.includes.empty()) if (pchTask.includes.empty())
return; return;
@@ -127,10 +127,9 @@ void PchCreator::generatePch(PchTask &&pchTask)
m_clangTool.addFile(std::move(headerFilePath), content.clone(), std::move(commandLine)); m_clangTool.addFile(std::move(headerFilePath), content.clone(), std::move(commandLine));
bool success = generatePch(NativeFilePath{headerFilePath}, content); bool success = generatePch(NativeFilePath{headerFilePath}, content);
if (success) {
m_sources = pchTask.sources; if (success)
m_projectPartPch.pchPath = std::move(pchOutputPath); m_projectPartPch.pchPath = std::move(pchOutputPath);
}
} }
const ProjectPartPch &PchCreator::projectPartPch() const ProjectPartPch &PchCreator::projectPartPch()

View File

@@ -128,23 +128,26 @@ private:
case SourceType::TopSystemInclude: case SourceType::TopSystemInclude:
topSystemIncludes.emplace_back(source.sourceId); topSystemIncludes.emplace_back(source.sourceId);
systemIncludes.emplace_back(source.sourceId); systemIncludes.emplace_back(source.sourceId);
sources.emplace_back(source.sourceId);
break; break;
case SourceType::SystemInclude: case SourceType::SystemInclude:
systemIncludes.emplace_back(source.sourceId); systemIncludes.emplace_back(source.sourceId);
sources.emplace_back(source.sourceId);
break; break;
case SourceType::TopProjectInclude: case SourceType::TopProjectInclude:
topProjectIncludes.emplace_back(source.sourceId); topProjectIncludes.emplace_back(source.sourceId);
projectIncludes.emplace_back(source.sourceId); projectIncludes.emplace_back(source.sourceId);
sources.emplace_back(source.sourceId);
break; break;
case SourceType::ProjectInclude: case SourceType::ProjectInclude:
projectIncludes.emplace_back(source.sourceId); projectIncludes.emplace_back(source.sourceId);
sources.emplace_back(source.sourceId);
break; break;
case SourceType::UserInclude: case SourceType::UserInclude:
case SourceType::Source: case SourceType::Source:
break; break;
} }
sources.emplace_back(source.sourceId);
} }
static Utils::SmallStringVector filterUsedMarcos(const UsedMacros &usedMacros, static Utils::SmallStringVector filterUsedMarcos(const UsedMacros &usedMacros,

View File

@@ -145,7 +145,7 @@ void SymbolIndexer::updateProjectPart(ProjectPartContainer &&projectPart)
} }
m_pathWatcher.updateIdPaths( m_pathWatcher.updateIdPaths(
{{projectPartId, m_buildDependencyStorage.fetchSources(projectPartId)}}); {{projectPartId, m_buildDependencyStorage.fetchPchSources(projectPartId)}});
m_symbolIndexerTaskQueue.addOrUpdateTasks(std::move(symbolIndexerTask)); m_symbolIndexerTaskQueue.addOrUpdateTasks(std::move(symbolIndexerTask));
m_symbolIndexerTaskQueue.processEntries(); m_symbolIndexerTaskQueue.processEntries();
} }

View File

@@ -70,7 +70,7 @@ protected:
MockSqliteWriteStatement &updatePchCreationTimeStampStatement = storage.updatePchCreationTimeStampStatement; MockSqliteWriteStatement &updatePchCreationTimeStampStatement = storage.updatePchCreationTimeStampStatement;
MockSqliteWriteStatement &deleteAllProjectPartsFilesWithProjectPartNameStatement MockSqliteWriteStatement &deleteAllProjectPartsFilesWithProjectPartNameStatement
= storage.deleteAllProjectPartsFilesWithProjectPartNameStatement; = storage.deleteAllProjectPartsFilesWithProjectPartNameStatement;
MockSqliteReadStatement &fetchProjectPartsFilesStatement = storage.fetchProjectPartsFilesStatement; MockSqliteReadStatement &fetchProjectPartsFilesStatement = storage.fetchPchSourcesStatement;
}; };
TEST_F(BuildDependenciesStorage, ConvertStringsToJson) TEST_F(BuildDependenciesStorage, ConvertStringsToJson)
@@ -238,7 +238,7 @@ TEST_F(BuildDependenciesStorage, FetchSources)
ClangBackEnd::FilePathIds result{3, 5, 7}; ClangBackEnd::FilePathIds result{3, 5, 7};
EXPECT_CALL(fetchProjectPartsFilesStatement, valuesReturnFilePathIds(_, 22)).WillOnce(Return(result)); EXPECT_CALL(fetchProjectPartsFilesStatement, valuesReturnFilePathIds(_, 22)).WillOnce(Return(result));
auto sources = storage.fetchSources(22); auto sources = storage.fetchPchSources(22);
ASSERT_THAT(sources, result); ASSERT_THAT(sources, result);
} }

View File

@@ -51,7 +51,7 @@ public:
ClangBackEnd::ProjectPartId(Utils::SmallStringView projectPartName)); ClangBackEnd::ProjectPartId(Utils::SmallStringView projectPartName));
MOCK_METHOD2(updatePchCreationTimeStamp, MOCK_METHOD2(updatePchCreationTimeStamp,
void(long long pchCreationTimeStamp, ClangBackEnd::ProjectPartId projectPartId)); void(long long pchCreationTimeStamp, ClangBackEnd::ProjectPartId projectPartId));
MOCK_CONST_METHOD1(fetchSources, MOCK_CONST_METHOD1(fetchPchSources,
ClangBackEnd::FilePathIds(ClangBackEnd::ProjectPartId projectPartId)); ClangBackEnd::FilePathIds(ClangBackEnd::ProjectPartId projectPartId));
}; };

View File

@@ -226,16 +226,21 @@ TEST_F(PchCreatorVerySlowTest, SourcesAreWatchedAfterSucess)
creator.doInMainThreadAfterFinished(); creator.doInMainThreadAfterFinished();
} }
TEST_F(PchCreatorVerySlowTest, SourcesAreNotWatchedAfterFail) TEST_F(PchCreatorVerySlowTest, SourcesAreWatchedAfterFail)
{ {
pchTask1.systemIncludeSearchPaths = {}; pchTask1.systemIncludeSearchPaths = {};
pchTask1.projectIncludeSearchPaths = {}; pchTask1.projectIncludeSearchPaths = {};
creator.generatePch(std::move(pchTask1)); creator.generatePch(std::move(pchTask1));
EXPECT_CALL(mockClangPathWatcher, EXPECT_CALL(mockClangPathWatcher,
updateIdPaths( updateIdPaths(ElementsAre(AllOf(
ElementsAre(AllOf(Field(&ClangBackEnd::IdPaths::id, 1), Field(&ClangBackEnd::IdPaths::id, 1),
Field(&ClangBackEnd::IdPaths::filePathIds, IsEmpty()))))); Field(&ClangBackEnd::IdPaths::filePathIds,
UnorderedElementsAre(
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/main2.cpp")))))));
creator.doInMainThreadAfterFinished(); creator.doInMainThreadAfterFinished();
} }
@@ -337,9 +342,14 @@ TEST_F(PchCreatorSlowTest, NoIncludesInTheMainThreadCalls)
Field(&ClangBackEnd::PrecompiledHeadersUpdatedMessage::projectPartIds, Field(&ClangBackEnd::PrecompiledHeadersUpdatedMessage::projectPartIds,
ElementsAre(Eq(creator.projectPartPch().projectPartId))))); ElementsAre(Eq(creator.projectPartPch().projectPartId)))));
EXPECT_CALL(mockClangPathWatcher, EXPECT_CALL(mockClangPathWatcher,
updateIdPaths( updateIdPaths(ElementsAre(AllOf(
ElementsAre(AllOf(Field(&ClangBackEnd::IdPaths::id, 1), Field(&ClangBackEnd::IdPaths::id, 1),
Field(&ClangBackEnd::IdPaths::filePathIds, IsEmpty()))))); Field(&ClangBackEnd::IdPaths::filePathIds,
UnorderedElementsAre(
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/main2.cpp")))))));
EXPECT_CALL(mockBuildDependenciesStorage, updatePchCreationTimeStamp(Gt(0), Eq(1))); EXPECT_CALL(mockBuildDependenciesStorage, updatePchCreationTimeStamp(Gt(0), Eq(1)));
creator.doInMainThreadAfterFinished(); creator.doInMainThreadAfterFinished();

View File

@@ -117,7 +117,7 @@ TEST_F(PchTaskGenerator, AddProjectParts)
&PchTaskSet::project, &PchTaskSet::project,
AllOf(Field(&PchTask::projectPartIds, ElementsAre(ProjectPartId{1})), AllOf(Field(&PchTask::projectPartIds, ElementsAre(ProjectPartId{1})),
Field(&PchTask::includes, ElementsAre(3)), Field(&PchTask::includes, ElementsAre(3)),
Field(&PchTask::sources, ElementsAre(1, 2, 3, 4, 5)), Field(&PchTask::sources, ElementsAre(1, 3, 4, 5)),
Field(&PchTask::compilerMacros, Field(&PchTask::compilerMacros,
ElementsAre(CompilerMacro{"YI", "1", 1}, CompilerMacro{"SAN", "3", 3})), ElementsAre(CompilerMacro{"YI", "1", 1}, CompilerMacro{"SAN", "3", 3})),
Field(&PchTask::systemIncludeSearchPaths, Field(&PchTask::systemIncludeSearchPaths,

View File

@@ -107,7 +107,10 @@ TEST_F(RefactoringDatabaseInitializer, AddProjectPartsFilesTable)
"sourceId INTEGER, sourceType INTEGER, pchCreationTimeStamp INTEGER, " "sourceId INTEGER, sourceType INTEGER, pchCreationTimeStamp INTEGER, "
"hasMissingIncludes INTEGER)"))); "hasMissingIncludes INTEGER)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId ON projectPartsFiles(sourceId, projectPartId)"))); EXPECT_CALL(mockDatabase, execute(Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId ON projectPartsFiles(sourceId, projectPartId)")));
EXPECT_CALL(mockDatabase, execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId ON projectPartsFiles(projectPartId)"))); EXPECT_CALL(mockDatabase,
execute(Eq(
"CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId_sourceType "
"ON projectPartsFiles(projectPartId, sourceType)")));
initializer.createProjectPartsFilesTable(); initializer.createProjectPartsFilesTable();
} }
@@ -247,9 +250,10 @@ TEST_F(RefactoringDatabaseInitializer, CreateInTheContructor)
execute( execute(
Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId " Eq("CREATE UNIQUE INDEX IF NOT EXISTS index_projectPartsFiles_sourceId_projectPartId "
"ON projectPartsFiles(sourceId, projectPartId)"))); "ON projectPartsFiles(sourceId, projectPartId)")));
EXPECT_CALL(mockDatabase, EXPECT_CALL(
execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId ON " mockDatabase,
"projectPartsFiles(projectPartId)"))); execute(Eq("CREATE INDEX IF NOT EXISTS index_projectPartsFiles_projectPartId_sourceType ON "
"projectPartsFiles(projectPartId, sourceType)")));
EXPECT_CALL(mockDatabase, EXPECT_CALL(mockDatabase,
execute(Eq("CREATE TABLE IF NOT EXISTS usedMacros(usedMacroId INTEGER PRIMARY KEY, " execute(Eq("CREATE TABLE IF NOT EXISTS usedMacros(usedMacroId INTEGER PRIMARY KEY, "
"sourceId INTEGER, macroName TEXT)"))); "sourceId INTEGER, macroName TEXT)")));

View File

@@ -923,7 +923,7 @@ TEST_F(SymbolIndexer, SourcesAreWatched)
InSequence s; InSequence s;
FilePathIds sourcePathIds{4, 6, 8}; FilePathIds sourcePathIds{4, 6, 8};
EXPECT_CALL(mockBuildDependenciesStorage, fetchSources(projectPart1.projectPartId)) EXPECT_CALL(mockBuildDependenciesStorage, fetchPchSources(projectPart1.projectPartId))
.WillOnce(Return(sourcePathIds)); .WillOnce(Return(sourcePathIds));
EXPECT_CALL(mockPathWatcher, EXPECT_CALL(mockPathWatcher,
updateIdPaths(ElementsAre(AllOf(Field(&IdPaths::id, projectPart1.projectPartId), updateIdPaths(ElementsAre(AllOf(Field(&IdPaths::id, projectPart1.projectPartId),

View File

@@ -98,12 +98,7 @@ TEST_F(UsedMacroFilter, Sources)
ClangBackEnd::UsedMacroFilter filter(sources, usedMacros, compileMacros); ClangBackEnd::UsedMacroFilter filter(sources, usedMacros, compileMacros);
ASSERT_THAT(filter.sources, ASSERT_THAT(filter.sources,
ElementsAre(FilePathId{1}, ElementsAre(FilePathId{2}, FilePathId{3}, FilePathId{4}, FilePathId{5}));
FilePathId{2},
FilePathId{3},
FilePathId{4},
FilePathId{5},
FilePathId{6}));
} }
TEST_F(UsedMacroFilter, SystemUsedMacros) TEST_F(UsedMacroFilter, SystemUsedMacros)