diff --git a/bin/app/data/ProjectSettings_template.xml b/bin/app/data/ProjectSettings_template.xml
index 0ba7b27f..a057e8f2 100644
--- a/bin/app/data/ProjectSettings_template.xml
+++ b/bin/app/data/ProjectSettings_template.xml
@@ -35,7 +35,6 @@
-
diff --git a/bin/test/data/TestSettings_template.xml b/bin/test/data/TestSettings_template.xml
deleted file mode 100644
index ab90867b..00000000
--- a/bin/test/data/TestSettings_template.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/bin/test/data/log/test_log.txt b/bin/test/data/log/test_log.txt
index 64a9ae4b..0debded1 100644
--- a/bin/test/data/log/test_log.txt
+++ b/bin/test/data/log/test_log.txt
@@ -1,174 +1,3 @@
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
-Settings.cpp WARNING: File for Settings not found: data/TestSettings.xml
Token.cpp ERROR: Location Id was not referenced by this Token.
Node.cpp WARNING: Cannot change NodeType after it was already set from namespace to class
Edge.cpp ERROR: Nodes are not plain copies.
diff --git a/src/lib/Project.cpp b/src/lib/Project.cpp
index 79cec11c..0b2bcb90 100644
--- a/src/lib/Project.cpp
+++ b/src/lib/Project.cpp
@@ -247,18 +247,16 @@ void Project::updateFileManager()
std::shared_ptr projSettings = ProjectSettings::getInstance();
std::vector sourcePaths = projSettings->getAbsoluteSourcePaths();
- std::vector headerPaths;
+ std::vector headerPaths = sourcePaths;
if (projSettings->getCompilationDatabasePath().exists())
{
- headerPaths = sourcePaths;
sourcePaths = TaskParseCxx::getSourceFilesFromCDB(projSettings->getCompilationDatabasePath());
}
std::vector sourceExtensions = projSettings->getSourceExtensions();
- std::vector includeExtensions = projSettings->getHeaderExtensions();
- m_fileManager.setPaths(sourcePaths, headerPaths, sourceExtensions, includeExtensions);
+ m_fileManager.setPaths(sourcePaths, headerPaths, sourceExtensions);
}
Parser::Arguments Project::getParserArguments() const
diff --git a/src/lib/settings/ProjectSettings.cpp b/src/lib/settings/ProjectSettings.cpp
index 18e81ce7..746a00db 100644
--- a/src/lib/settings/ProjectSettings.cpp
+++ b/src/lib/settings/ProjectSettings.cpp
@@ -2,14 +2,6 @@
#include "utility/utility.h"
-std::vector ProjectSettings::getDefaultHeaderExtensions()
-{
- std::vector defaultValues;
- defaultValues.push_back(".h");
- defaultValues.push_back(".hpp");
- return defaultValues;
-}
-
std::vector ProjectSettings::getDefaultSourceExtensions()
{
std::vector defaultValues;
@@ -53,7 +45,6 @@ bool ProjectSettings::operator==(const ProjectSettings& other) const
utility::isPermutation(getHeaderSearchPaths(), other.getHeaderSearchPaths()) &&
utility::isPermutation(getFrameworkSearchPaths(), other.getFrameworkSearchPaths()) &&
utility::isPermutation(getCompilerFlags(), other.getCompilerFlags()) &&
- utility::isPermutation(getHeaderExtensions(), other.getHeaderExtensions()) &&
utility::isPermutation(getSourceExtensions(), other.getSourceExtensions());
}
@@ -155,21 +146,11 @@ bool ProjectSettings::setCompilerFlags(const std::vector& compilerF
return setValues("source/compiler_flags/compiler_flag", compilerFlags);
}
-std::vector ProjectSettings::getHeaderExtensions() const
-{
- return getValues("source/extensions/header_extensions", getDefaultHeaderExtensions());
-}
-
std::vector ProjectSettings::getSourceExtensions() const
{
return getValues("source/extensions/source_extensions", getDefaultSourceExtensions());
}
-bool ProjectSettings::setHeaderExtensions(const std::vector &headerExtensions)
-{
- return setValues("source/extensions/header_extensions", headerExtensions);
-}
-
bool ProjectSettings::setSourceExtensions(const std::vector &sourceExtensions)
{
return setValues("source/extensions/source_extensions", sourceExtensions);
diff --git a/src/lib/settings/ProjectSettings.h b/src/lib/settings/ProjectSettings.h
index 3f2426fd..deab2029 100644
--- a/src/lib/settings/ProjectSettings.h
+++ b/src/lib/settings/ProjectSettings.h
@@ -10,7 +10,6 @@ class ProjectSettings
: public Settings
{
public:
- static std::vector getDefaultHeaderExtensions();
static std::vector getDefaultSourceExtensions();
static std::shared_ptr getInstance();
diff --git a/src/lib/utility/file/FileManager.cpp b/src/lib/utility/file/FileManager.cpp
index eb2f613d..a8a91939 100644
--- a/src/lib/utility/file/FileManager.cpp
+++ b/src/lib/utility/file/FileManager.cpp
@@ -23,13 +23,11 @@ const std::vector& FileManager::getSourcePaths() const
void FileManager::setPaths(
std::vector sourcePaths,
std::vector headerPaths,
- std::vector sourceExtensions,
- std::vector includeExtensions
+ std::vector sourceExtensions
){
m_sourcePaths = sourcePaths;
m_headerPaths = headerPaths;
m_sourceExtensions = sourceExtensions;
- m_includeExtensions = includeExtensions;
}
void FileManager::fetchFilePaths(const std::vector& oldFileInfos)
@@ -46,10 +44,24 @@ void FileManager::fetchFilePaths(const std::vector& oldFileInfos)
for (std::map::iterator it = m_files.begin(); it != m_files.end(); it++)
{
- m_removedFiles.insert(it->first);
+ const FilePath& filePath = it->first;
+ if (filePath.exists() && !hasSourceExtension(filePath))
+ {
+ FileInfo fileInfo = FileSystem::getFileInfoForPath(filePath);
+
+ if (fileInfo.lastWriteTime > it->second.lastWriteTime)
+ {
+ it->second.lastWriteTime = fileInfo.lastWriteTime;
+ m_updatedFiles.insert(filePath);
+ }
+ }
+ else
+ {
+ m_removedFiles.insert(filePath);
+ }
}
- std::vector fileInfos = getFileInfosInProject();
+ std::vector fileInfos = FileSystem::getFileInfosFromPaths(m_sourcePaths, m_sourceExtensions);
for (FileInfo fileInfo: fileInfos)
{
const FilePath& filePath = fileInfo.path;
@@ -60,7 +72,7 @@ void FileManager::fetchFilePaths(const std::vector& oldFileInfos)
if (fileInfo.lastWriteTime > it->second.lastWriteTime)
{
it->second.lastWriteTime = fileInfo.lastWriteTime;
- m_updatedFiles.insert(fileInfo.path);
+ m_updatedFiles.insert(filePath);
}
}
else
@@ -93,7 +105,20 @@ std::set FileManager::getRemovedFilePaths() const
bool FileManager::hasFilePath(const FilePath& filePath) const
{
- return (m_files.find(filePath) != m_files.end());
+ if (m_files.find(filePath) != m_files.end())
+ {
+ return true;
+ }
+
+ for (FilePath path : m_headerPaths)
+ {
+ if (path == filePath || path.contains(filePath))
+ {
+ return true;
+ }
+ }
+
+ return false;
}
bool FileManager::hasSourceExtension(const FilePath& filePath) const
@@ -101,39 +126,14 @@ bool FileManager::hasSourceExtension(const FilePath& filePath) const
return filePath.hasExtension(m_sourceExtensions);
}
-bool FileManager::hasIncludeExtension(const FilePath& filePath) const
-{
- return filePath.hasExtension(m_includeExtensions);
-}
-
const FileInfo FileManager::getFileInfo(const FilePath& filePath) const
{
std::map::const_iterator it = m_files.find(filePath);
if (it == m_files.end())
{
- LOG_ERROR("No FileInfo found for file: " + filePath.str());
+ return FileSystem::getFileInfoForPath(filePath);
}
return it->second;
}
-
-std::vector FileManager::getFileInfosInProject() const
-{
- std::vector fileInfos;
-
- std::vector, std::vector>> pathsExtensionsPairs;
- pathsExtensionsPairs.push_back(std::make_pair(m_sourcePaths, m_includeExtensions));
- pathsExtensionsPairs.push_back(std::make_pair(m_sourcePaths, m_sourceExtensions));
- pathsExtensionsPairs.push_back(std::make_pair(m_headerPaths, m_includeExtensions));
-
- for (size_t i = 0; i < pathsExtensionsPairs.size(); i++)
- {
- utility::append(
- fileInfos,
- FileSystem::getFileInfosFromPaths(pathsExtensionsPairs[i].first, pathsExtensionsPairs[i].second)
- );
- }
-
- return fileInfos;
-}
diff --git a/src/lib/utility/file/FileManager.h b/src/lib/utility/file/FileManager.h
index 0f982563..947c26a7 100644
--- a/src/lib/utility/file/FileManager.h
+++ b/src/lib/utility/file/FileManager.h
@@ -18,11 +18,9 @@ public:
void setPaths(
std::vector sourcePaths,
std::vector headerPaths,
- std::vector sourceExtensions,
- std::vector includeExtensions
+ std::vector sourceExtensions
);
- void clear();
void fetchFilePaths(const std::vector& oldFileInfos);
std::set getAddedFilePaths() const;
@@ -31,13 +29,10 @@ public:
virtual bool hasFilePath(const FilePath& filePath) const;
virtual bool hasSourceExtension(const FilePath& filePath) const;
- virtual bool hasIncludeExtension(const FilePath& filePath) const;
virtual const FileInfo getFileInfo(const FilePath& filePath) const;
private:
- std::vector getFileInfosInProject() const;
-
std::map m_files;
std::vector m_sourcePaths;
diff --git a/src/lib/utility/file/FilePath.cpp b/src/lib/utility/file/FilePath.cpp
index 4f90f663..bd558ab8 100644
--- a/src/lib/utility/file/FilePath.cpp
+++ b/src/lib/utility/file/FilePath.cpp
@@ -174,6 +174,27 @@ FilePath FilePath::concat(const FilePath& other) const
return boost::filesystem::path(m_path) / other.m_path;
}
+bool FilePath::contains(const FilePath& other) const
+{
+ if (!isDirectory())
+ {
+ return false;
+ }
+
+ boost::filesystem::path dir = m_path;
+ boost::filesystem::path dir2 = other.m_path;
+
+ auto dir_len = std::distance(dir.begin(), dir.end());
+ auto dir2_len = std::distance(dir2.begin(), dir2.end());
+
+ if (dir_len > dir2_len)
+ {
+ return false;
+ }
+
+ return std::equal(dir.begin(), dir.end(), dir2.begin());
+}
+
std::string FilePath::str() const
{
return m_path.generic_string();
diff --git a/src/lib/utility/file/FilePath.h b/src/lib/utility/file/FilePath.h
index c6b959d5..ef52c718 100644
--- a/src/lib/utility/file/FilePath.h
+++ b/src/lib/utility/file/FilePath.h
@@ -28,6 +28,8 @@ public:
FilePath concat(const FilePath& other) const;
FilePath expandEnvironmentVariables() const;
+ bool contains(const FilePath& other) const;
+
std::string str() const;
std::string fileName() const;
diff --git a/src/lib/utility/file/FileRegister.cpp b/src/lib/utility/file/FileRegister.cpp
index 3d538139..c7ef7d5f 100644
--- a/src/lib/utility/file/FileRegister.cpp
+++ b/src/lib/utility/file/FileRegister.cpp
@@ -10,30 +10,60 @@ FileRegister::FileRegister(const FileManager* fileManager)
void FileRegister::setFilePaths(const std::vector& filePaths)
{
- std::lock_guard sourceFileLock(m_sourceFileMutex);
- std::lock_guard includeFileLock(m_includeFileMutex);
-
- m_sourceFilePaths.clear();
- m_includeFilePaths.clear();
-
- for (const FilePath& p : filePaths)
{
- FilePath path = p.exists() ? p.absolute() : p;
+ std::lock_guard lock(m_sourceFileMutex);
+ m_sourceFilePaths.clear();
- if (m_fileManager->hasSourceExtension(path))
+ for (const FilePath& p : filePaths)
{
- m_sourceFilePaths.emplace(path, STATE_UNPARSED);
- }
- else if (m_fileManager->hasIncludeExtension(path))
- {
- m_includeFilePaths.emplace(path, STATE_UNPARSED);
+ FilePath path = p.exists() ? p.absolute() : p;
+
+ if (m_fileManager->hasSourceExtension(path))
+ {
+ m_sourceFilePaths.emplace(path, STATE_UNPARSED);
+ }
}
}
+
+ {
+ std::lock_guard lock(m_includeFileMutex);
+ m_includeFilePaths.clear();
+ }
+
+ {
+ std::lock_guard lock(m_threadFileMutex);
+ m_threadParsingFiles.clear();
+ }
}
-const FileManager* FileRegister::getFileManager() const
+bool FileRegister::hasFilePath(const FilePath& filePath) const
{
- return m_fileManager;
+ std::lock_guard lock(m_projectFilesMutex);
+ std::unordered_map::iterator it = m_projectFiles.find(filePath.str());
+ if (it != m_projectFiles.end())
+ {
+ return it->second;
+ }
+
+ bool has = m_fileManager->hasFilePath(filePath);
+ m_projectFiles.emplace(filePath.str(), has);
+
+ return has;
+}
+
+const FileInfo FileRegister::getFileInfo(const FilePath& filePath) const
+{
+ std::lock_guard lock(m_projectFileInfosMutex);
+ std::unordered_map::iterator it = m_projectFileInfos.find(filePath.str());
+ if (it != m_projectFileInfos.end())
+ {
+ return it->second;
+ }
+
+ FileInfo info = m_fileManager->getFileInfo(filePath);
+ m_projectFileInfos.emplace(filePath.str(), info);
+
+ return info;
}
std::vector FileRegister::getUnparsedSourceFilePaths() const
@@ -140,30 +170,55 @@ bool FileRegister::includeFileIsParsed(const FilePath& filePath) const
FilePath FileRegister::consumeSourceFile()
{
- std::lock_guard lock(m_sourceFileMutex);
- for (std::map::iterator it = m_sourceFilePaths.begin(); it != m_sourceFilePaths.end(); it++)
+ FilePath path;
{
- if (it->second == STATE_UNPARSED)
+ std::lock_guard lock(m_sourceFileMutex);
+ for (std::map::iterator it = m_sourceFilePaths.begin(); it != m_sourceFilePaths.end(); it++)
{
- it->second = STATE_PARSING;
- m_threadParsingFiles[std::this_thread::get_id()].insert(it->first);
- return it->first;
+ if (it->second == STATE_UNPARSED)
+ {
+ it->second = STATE_PARSING;
+ path = it->first;
+ break;
+ }
}
}
- return FilePath();
+
+ if (!path.empty())
+ {
+ std::lock_guard lock(m_threadFileMutex);
+ m_threadParsingFiles[std::this_thread::get_id()].insert(path);
+ }
+
+ return path;
}
void FileRegister::markIncludeFileParsing(const FilePath& filePath)
{
- std::lock_guard lock(m_includeFileMutex);
- std::map::iterator it = m_includeFilePaths.find(filePath);
- if (it != m_includeFilePaths.end())
+ bool unparsed = false;
{
- if (it->second == STATE_UNPARSED)
+ std::lock_guard lock(m_includeFileMutex);
+ std::map::iterator it = m_includeFilePaths.find(filePath);
+
+ if (it != m_includeFilePaths.end())
{
- it->second = STATE_PARSING;
- m_threadParsingFiles[std::this_thread::get_id()].insert(it->first);
+ if (it->second == STATE_UNPARSED)
+ {
+ it->second = STATE_PARSING;
+ unparsed = true;
+ }
}
+ else
+ {
+ m_includeFilePaths.emplace(filePath, STATE_PARSING);
+ unparsed = true;
+ }
+ }
+
+ if (unparsed)
+ {
+ std::lock_guard lock(m_threadFileMutex);
+ m_threadParsingFiles[std::this_thread::get_id()].insert(filePath);
}
}
@@ -172,7 +227,10 @@ void FileRegister::markThreadFilesParsed()
std::lock_guard sourceFileLock(m_sourceFileMutex);
std::lock_guard includeFileLock(m_includeFileMutex);
std::lock_guard threadFileLock(m_threadFileMutex);
- for (std::set::iterator it = m_threadParsingFiles[std::this_thread::get_id()].begin(); it != m_threadParsingFiles[std::this_thread::get_id()].end(); it++)
+
+ std::set& threadFiles = m_threadParsingFiles[std::this_thread::get_id()];
+
+ for (std::set::iterator it = threadFiles.begin(); it != threadFiles.end(); it++)
{
std::map::iterator it2;
it2 = m_sourceFilePaths.find(*it);
@@ -188,7 +246,8 @@ void FileRegister::markThreadFilesParsed()
it2->second = STATE_PARSED;
}
}
- m_threadParsingFiles[std::this_thread::get_id()].clear();
+
+ threadFiles.clear();
}
size_t FileRegister::getSourceFilesCount() const
diff --git a/src/lib/utility/file/FileRegister.h b/src/lib/utility/file/FileRegister.h
index 1d85ce7b..8b31ad9f 100644
--- a/src/lib/utility/file/FileRegister.h
+++ b/src/lib/utility/file/FileRegister.h
@@ -2,6 +2,7 @@
#define FILE_REGISTER_H
#include