data: refreshing with DB

* database stores modification time of files.
* FileManager updates internal state based on database info.
* reimplemented FileManager's check if a file is in project.
* implemented clearing data of updated or removed files before reparsing the updated and added files.
This commit is contained in:
malte_langkabel
2015-09-16 18:53:33 +02:00
parent 73b1b77ca8
commit 3d94b78b8c
22 changed files with 406 additions and 109 deletions
+3 -2
View File
@@ -6,6 +6,7 @@
#include "utility/types.h"
#include "data/name/NameHierarchy.h"
#include "utility/file/FileInfo.h"
struct ParseFunction;
struct ParseLocation;
@@ -125,9 +126,9 @@ public:
virtual Id onTemplateFunctionSpecializationParsed(
const ParseLocation& location, const ParseFunction specializedFunction, const ParseFunction templateFunction) = 0;
virtual Id onFileParsed(const std::string& filePath) = 0;
virtual Id onFileParsed(const FileInfo& fileInfo) = 0;
virtual Id onFileIncludeParsed(
const ParseLocation& location, const std::string& filePath, const std::string& includedPath) = 0;
const ParseLocation& location, const FileInfo& fileInfo, const FileInfo& includedFileInfo) = 0;
};
#endif // PARSER_CLIENT_H
+15 -4
View File
@@ -345,16 +345,27 @@ bool ASTVisitor::VisitClassTemplateDecl(clang::ClassTemplateDecl* declaration)
{
clang::ClassTemplateSpecializationDecl* specializationDecl = *it;
ParseLocation specializationLocation = getParseLocationForNamedDecl(*it);
if (specializationDecl->getSpecializationKind() == clang::TSK_ImplicitInstantiation)
{
specializationLocation = getParseLocation(specializationDecl->getPointOfInstantiation());
}
NameHierarchy specializedRecordNameHierarchy = utility::getDeclNameHierarchy(specializationDecl);
ParserClient::RecordType specializedRecordType = specializationDecl->isStruct() ? ParserClient::RECORD_STRUCT : ParserClient::RECORD_CLASS;
// The specializationParent can be an indirect specialization of the ClassTemplate (by specializing a partial specialization).
NameHierarchy specializationParentNameHierarchy = utility::getTemplateSpecializationParentNameHierarchy(specializationDecl);
ParserClient::RecordType specializedRecordType = specializationDecl->isStruct() ? ParserClient::RECORD_STRUCT : ParserClient::RECORD_CLASS;
NameHierarchy specializedRecordNameHierarchy = utility::getDeclNameHierarchy(specializationDecl);
m_client->onTemplateRecordSpecializationParsed(
getParseLocationForNamedDecl(*it), specializedRecordNameHierarchy, specializedRecordType, specializationParentNameHierarchy
specializationLocation,
specializedRecordNameHierarchy,
specializedRecordType,
specializationParentNameHierarchy
);
std::string specializationFilePath = getParseLocationForNamedDecl(specializationDecl).filePath.str();
std::string specializationFilePath = specializationLocation.filePath.str();
const clang::TemplateArgumentList &argList = specializationDecl->getTemplateArgs();
for (size_t i = 0; i < argList.size(); i++)
@@ -26,7 +26,10 @@ void PreprocessorCallbacks::FileChanged(
const clang::FileEntry *fileEntry = m_sourceManager.getFileEntryForID(m_sourceManager.getFileID(location));
if (fileEntry && m_fileRegister->getFileManager()->hasFilePath(fileEntry->getName()))
{
m_client->onFileParsed(fileEntry->getName());
m_client->onFileParsed(FileInfo(
FilePath(fileEntry->getName()),
boost::posix_time::from_time_t(fileEntry->getModificationTime())
));
m_fileRegister->markIncludeFileParsing(fileEntry->getName());
}
}
@@ -40,12 +43,15 @@ void PreprocessorCallbacks::InclusionDirective(
if (fileEntry && baseFileEntry)
{
std::string baseFilePath = baseFileEntry->getName();
std::string filePath = fileEntry->getName();
std::string includedFilePath = fileEntry->getName();
if (m_fileRegister->getFileManager()->hasFilePath(baseFilePath) &&
m_fileRegister->getFileManager()->hasFilePath(filePath))
if (m_fileRegister->getFileManager()->hasFilePath(baseFilePath) && // check if file is in project
m_fileRegister->getFileManager()->hasFilePath(includedFilePath))
{
m_client->onFileIncludeParsed(getParseLocation(fileNameRange.getAsRange()), baseFilePath, filePath);
FileInfo baseFileInfo(baseFilePath, boost::posix_time::from_time_t(baseFileEntry->getModificationTime()));
FileInfo includedFileInfo(includedFilePath, boost::posix_time::from_time_t(fileEntry->getModificationTime()));
m_client->onFileIncludeParsed(getParseLocation(fileNameRange.getAsRange()), baseFileInfo, includedFileInfo);
}
}
}