diff --git a/bin/app/user/projects/tictactoe/src/field.cpp b/bin/app/user/projects/tictactoe/src/field.cpp index d87128a8..6fb4ca70 100644 --- a/bin/app/user/projects/tictactoe/src/field.cpp +++ b/bin/app/user/projects/tictactoe/src/field.cpp @@ -1,4 +1,4 @@ -#include "field.h" +#include "fied.h" #include "io.h" diff --git a/bin/app/user/projects/tictactoe/src/player.h b/bin/app/user/projects/tictactoe/src/player.h index 2124fc59..0d1df4fd 100644 --- a/bin/app/user/projects/tictactoe/src/player.h +++ b/bin/app/user/projects/tictactoe/src/player.h @@ -2,7 +2,7 @@ #define _PLAYER_ #include "field.h" -#include "game_object.h" +#include "game_objec.h" class Player : public GameObject { public: diff --git a/src/lib/component/controller/CodeController.cpp b/src/lib/component/controller/CodeController.cpp index 8214a7ad..7bade76e 100644 --- a/src/lib/component/controller/CodeController.cpp +++ b/src/lib/component/controller/CodeController.cpp @@ -301,7 +301,12 @@ void CodeController::handleMessage(MessageShowErrors* message) CodeView::ScrollParams scrollParams(CodeView::ScrollParams::SCROLL_TO_DEFINITION); view->scrollTo(scrollParams); - std::vector errors = m_storageAccess->getErrorsLimited(message->errorIds); + std::vector errors; + if (!message->showsOnlyErrorIds || message->errorIds.size()) + { + errors = m_storageAccess->getErrorsLimited(message->errorIds); + } + m_collection = m_storageAccess->getErrorSourceLocations(errors); std::vector snippets = getSnippetsForCollection(m_collection); diff --git a/src/lib/component/controller/ErrorController.cpp b/src/lib/component/controller/ErrorController.cpp index 6c5e2f49..f041c1a5 100644 --- a/src/lib/component/controller/ErrorController.cpp +++ b/src/lib/component/controller/ErrorController.cpp @@ -80,7 +80,12 @@ void ErrorController::handleMessage(MessageShowErrors* message) clear(); - std::vector errors = m_storageAccess->getErrorsLimited(message->errorIds); + std::vector errors; + if (!message->showsOnlyErrorIds || message->errorIds.size()) + { + errors = m_storageAccess->getErrorsLimited(message->errorIds); + } + if (errors.size()) { getView()->showDockWidget(); diff --git a/src/lib/data/storage/IntermediateStorage.cpp b/src/lib/data/storage/IntermediateStorage.cpp index 17a32434..8e91e7ac 100644 --- a/src/lib/data/storage/IntermediateStorage.cpp +++ b/src/lib/data/storage/IntermediateStorage.cpp @@ -126,10 +126,26 @@ void IntermediateStorage::addSymbol(const StorageSymbol& symbol) void IntermediateStorage::addFile(const StorageFile& file) { const std::wstring serialized = serialize(file); - if (m_serializedFiles.find(serialized) == m_serializedFiles.end()) + + std::unordered_map::const_iterator it = m_serializedFiles.find(serialized); + if (it == m_serializedFiles.end()) { + m_serializedFiles.emplace(serialized, m_files.size()); m_files.push_back(file); - m_serializedFiles.insert(serialized); + } + else + { + StorageFile& storedFile = m_files[it->second]; + + if (file.indexed) + { + storedFile.indexed = true; + } + + if (file.complete) + { + storedFile.complete = true; + } } } diff --git a/src/lib/data/storage/IntermediateStorage.h b/src/lib/data/storage/IntermediateStorage.h index 647155fd..5abb25ab 100644 --- a/src/lib/data/storage/IntermediateStorage.h +++ b/src/lib/data/storage/IntermediateStorage.h @@ -96,7 +96,7 @@ private: std::unordered_map m_nodesIndex; std::vector m_nodes; - std::unordered_set m_serializedFiles; // this is used to prevent duplicates (unique) + std::unordered_map m_serializedFiles; // this is used to prevent duplicates (unique) std::vector m_files; std::vector m_symbols; diff --git a/src/lib/data/storage/PersistentStorage.cpp b/src/lib/data/storage/PersistentStorage.cpp index acc68336..7cfc3e2b 100644 --- a/src/lib/data/storage/PersistentStorage.cpp +++ b/src/lib/data/storage/PersistentStorage.cpp @@ -92,7 +92,7 @@ void PersistentStorage::addFile(const StorageFile& data) if (!storedFile.complete && data.complete) { - m_sqliteIndexStorage.setFileComplete(storedFile.id, data.complete); + m_sqliteIndexStorage.setFileCompleteIfNoError(storedFile.id, storedFile.filePath, data.complete); } } } @@ -1604,36 +1604,64 @@ std::vector PersistentStorage::getErrorsLimited(const std::vector std::vector PersistentStorage::getErrorIdsForFile(const FilePath& filePath) const { - std::unordered_map> includingMap = getFileIdToIncludedFileIdMap(); + Id fileId = getFileNodeId(filePath); + std::set fileIds = { fileId }; + std::vector errorIds; - std::set filePaths; - filePaths.insert(filePath); - - std::set fileIdsToProcess = includingMap[getFileNodeId(filePath)]; + std::unordered_map> includedMap = getFileIdToIncludedFileIdMap(); + std::set fileIdsToProcess = includedMap[getFileNodeId(filePath)]; std::set processedFileIds; + while (fileIdsToProcess.size()) { std::set nextFileIdsToProcess; for (Id id : fileIdsToProcess) { - if (filePaths.insert(getFileNodePath(id)).second) + if (fileIds.insert(id).second) { - utility::append(nextFileIdsToProcess, includingMap[id]); + utility::append(nextFileIdsToProcess, includedMap[id]); } } fileIdsToProcess = nextFileIdsToProcess; } - std::vector errorIds; - - for (const ErrorInfo& error : m_sqliteIndexStorage.getAll()) + std::vector errors = m_sqliteIndexStorage.getAll(); + for (const StorageError& error : errors) { - if (m_errorFilter.filter(error) && filePaths.find(FilePath(error.filePath)) != filePaths.end()) + if (m_errorFilter.filter(error) && fileIds.find(getFileNodeId(FilePath(error.filePath))) != fileIds.end()) { errorIds.push_back(error.id); } } + if (errorIds.empty()) + { + std::unordered_map> includingMap = getFileIdToIncludingFileIdMap(); + fileIds.clear(); + + fileIdsToProcess = includingMap[fileId]; + while (fileIdsToProcess.size()) + { + std::set nextFileIdsToProcess; + for (Id id : fileIdsToProcess) + { + if (fileIds.insert(id).second) + { + utility::append(nextFileIdsToProcess, includingMap[id]); + } + } + fileIdsToProcess = nextFileIdsToProcess; + } + + for (const ErrorInfo& error : errors) + { + if (error.fatal && m_errorFilter.filter(error) && fileIds.find(getFileNodeId(FilePath(error.filePath))) != fileIds.end()) + { + errorIds.push_back(error.id); + } + } + } + return errorIds; } diff --git a/src/lib/data/storage/Storage.cpp b/src/lib/data/storage/Storage.cpp index 442beb2c..a4305f4e 100644 --- a/src/lib/data/storage/Storage.cpp +++ b/src/lib/data/storage/Storage.cpp @@ -29,6 +29,13 @@ void Storage::inject(Storage* injected) TRACE(); startInjection(); + injected->forEachError( + [&](const StorageErrorData& injectedData) + { + addError(injectedData); + } + ); + std::unordered_map injectedIdToOwnId; injected->forEachNode( @@ -189,13 +196,6 @@ void Storage::inject(Storage* injected) } ); - injected->forEachError( - [&](const StorageErrorData& injectedData) - { - addError(injectedData); - } - ); - finishInjection(); } diff --git a/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp b/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp index c9f23f0f..611d9622 100644 --- a/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp +++ b/src/lib/data/storage/sqlite/SqliteIndexStorage.cpp @@ -648,8 +648,14 @@ void SqliteIndexStorage::setFileIndexed(Id fileId, bool indexed) ); } -void SqliteIndexStorage::setFileComplete(Id fileId, bool complete) +void SqliteIndexStorage::setFileCompleteIfNoError(Id fileId, const std::wstring& filePath, bool complete) { + StorageError error = doGetFirst("WHERE file_path == '" + utility::encodeToUtf8(filePath) + "'"); + if (error.id) + { + return; + } + executeStatement( "UPDATE file SET complete = " + std::to_string(complete) + " WHERE id == " + std::to_string(fileId) + ";" ); diff --git a/src/lib/data/storage/sqlite/SqliteIndexStorage.h b/src/lib/data/storage/sqlite/SqliteIndexStorage.h index 2de507c3..08435346 100644 --- a/src/lib/data/storage/sqlite/SqliteIndexStorage.h +++ b/src/lib/data/storage/sqlite/SqliteIndexStorage.h @@ -88,7 +88,7 @@ public: std::shared_ptr getFileContentById(Id fileId) const; void setFileIndexed(Id fileId, bool indexed); - void setFileComplete(Id fileId, bool complete); + void setFileCompleteIfNoError(Id fileId, const std::wstring& filePath, bool complete); void setNodeType(int type, Id nodeId); std::shared_ptr getSourceLocationsForFile( diff --git a/src/lib/utility/messaging/type/MessageShowErrors.h b/src/lib/utility/messaging/type/MessageShowErrors.h index fbe18af9..364effa9 100644 --- a/src/lib/utility/messaging/type/MessageShowErrors.h +++ b/src/lib/utility/messaging/type/MessageShowErrors.h @@ -18,6 +18,7 @@ public: MessageShowErrors(const std::vector& errorIds) : errorIds(errorIds) , errorId(0) + , showsOnlyErrorIds(true) { } @@ -34,6 +35,8 @@ public: const ErrorCountInfo errorCount; const std::vector errorIds; const Id errorId; + + bool showsOnlyErrorIds = false; }; #endif // MESSAGE_SHOW_ERRORS_H