Clang: Add isInPrecompiledHeader to the file status table

It will useful to find out if we have to wait for an updated precompiled
header.

Change-Id: I6a314f278485965571cc6e46982bbd6f5523c581
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-02-14 18:49:25 +01:00
parent 49bdde2ab0
commit a6f47e872f
12 changed files with 55 additions and 25 deletions

View File

@@ -76,9 +76,7 @@ public:
const clang::FileEntry *fileEntry = m_sourceManager.getFileEntryForID(
m_sourceManager.getFileID(sourceLocation));
if (fileEntry) {
m_fileStatuses.emplace_back(filePathId(fileEntry),
fileEntry->getSize(),
fileEntry->getModificationTime());
addFileStatus(fileEntry);
addSourceFile(fileEntry);
}
}
@@ -258,16 +256,36 @@ public:
}
}
void addSourceFile(const clang::FileEntry *file)
void addSourceFile(const clang::FileEntry *fileEntry)
{
auto id = filePathId(file);
auto id = filePathId(fileEntry);
auto found = std::find(m_sourceFiles.begin(), m_sourceFiles.end(), id);
auto found = std::lower_bound(m_sourceFiles.begin(), m_sourceFiles.end(), id);
if (found == m_sourceFiles.end() || *found != id)
m_sourceFiles.insert(found, id);
}
void addFileStatus(const clang::FileEntry *fileEntry)
{
auto id = filePathId(fileEntry);
auto found = std::lower_bound(m_fileStatuses.begin(),
m_fileStatuses.end(),
id,
[] (const auto &first, const auto &second) {
return first.filePathId < second;
});
if (found == m_fileStatuses.end() || found->filePathId != id) {
m_fileStatuses.emplace(found,
id,
fileEntry->getSize(),
fileEntry->getModificationTime(),
fileEntry->isInPCH());
}
}
void addSourceDependency(const clang::FileEntry *file, clang::SourceLocation includeLocation)
{
auto includeFilePathId = filePathId(includeLocation);

View File

@@ -37,11 +37,13 @@ class FileStatus
{
public:
FileStatus(FilePathId filePathId,
off_t size,
std::time_t lastModified)
off_t size,
std::time_t lastModified,
bool isInPrecompiledHeader)
: filePathId(filePathId),
size(size),
lastModified(lastModified)
lastModified(lastModified),
isInPrecompiledHeader(isInPrecompiledHeader)
{}
friend
@@ -56,6 +58,7 @@ public:
FilePathId filePathId;
off_t size;
std::time_t lastModified;
bool isInPrecompiledHeader;
};
using FileStatuses = std::vector<FileStatus>;

View File

@@ -198,7 +198,7 @@ public:
database
};
WriteStatement insertFileStatuses{
"INSERT OR REPLACE INTO fileStatuses(sourceId, size, lastModified) VALUES (?,?,?)",
"INSERT OR REPLACE INTO fileStatuses(sourceId, size, lastModified, isInPrecompiledHeader) VALUES (?,?,?,?)",
database
};
WriteStatement insertIntoNewSourceDependenciesStatement{

View File

@@ -156,7 +156,8 @@ public:
for (const FileStatus &fileStatus : fileStatuses)
statement.write(fileStatus.filePathId.filePathId,
fileStatus.size,
fileStatus.lastModified);
fileStatus.lastModified,
fileStatus.isInPrecompiledHeader);
}
static Utils::SmallString toJson(const Utils::SmallStringVector &strings)