forked from qt-creator/qt-creator
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:
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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, "
|
||||||
|
@@ -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;
|
||||||
|
@@ -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()
|
||||||
|
@@ -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,
|
||||||
|
@@ -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();
|
||||||
}
|
}
|
||||||
|
@@ -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);
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -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();
|
||||||
|
@@ -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,
|
||||||
|
@@ -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)")));
|
||||||
|
@@ -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),
|
||||||
|
@@ -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)
|
||||||
|
Reference in New Issue
Block a user