ui: Improved user experience of error display

* label errors as errors instead of references in file snippet headers
* show number of fatal errors in file snippet headers as well
* only show the first 10 error snippets open, remaining collapsed
* don't show status message after parsing in red on errors
* don't show stats of parsing when project was only loaded
This commit is contained in:
Eberhard Graether
2016-04-13 12:14:55 +02:00
parent 4eef42d15c
commit fcc39f4a77
21 changed files with 159 additions and 53 deletions
+36 -16
View File
@@ -28,8 +28,8 @@ const uint CodeController::s_lineRadius = 2;
void CodeController::handleMessage(MessageActivateAll* message)
{
std::vector<std::string> errorMessages;
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
std::vector<ErrorInfo> errors;
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errors);
StorageStats stats = m_storageAccess->getStorageStats();
CodeSnippetParams statsSnippet;
@@ -80,7 +80,7 @@ void CodeController::handleMessage(MessageActivateAll* message)
snippets.insert(snippets.begin(), statsSnippet);
CodeView* view = getView();
view->setErrorMessages(errorMessages);
view->setErrorInfos(errors);
view->showCodeSnippets(snippets, std::vector<Id>());
showContents(message);
@@ -95,7 +95,7 @@ void CodeController::handleMessage(MessageActivateLocalSymbols* message)
void CodeController::handleMessage(MessageActivateTokens* message)
{
CodeView* view = getView();
view->setErrorMessages(std::vector<std::string>());
view->setErrorInfos(std::vector<ErrorInfo>());
std::vector<Id> activeTokenIds = message->tokenIds;
Id declarationId = 0; // 0 means that no token is found.
@@ -162,7 +162,14 @@ void CodeController::handleMessage(MessageChangeFileView* message)
case MessageChangeFileView::FILE_SNIPPETS:
if (message->needsData)
{
view->addCodeSnippets(getSnippetsForActiveTokenLocationsInFile(message->locationFile), false);
if (message->showErrors)
{
view->addCodeSnippets(getSnippetsForFile(message->locationFile), false);
}
else
{
view->addCodeSnippets(getSnippetsForActiveTokenLocationsInFile(message->locationFile), false);
}
}
view->setFileState(message->filePath, CodeView::FILE_SNIPPETS);
break;
@@ -181,8 +188,8 @@ void CodeController::handleMessage(MessageChangeFileView* message)
if (message->showErrors)
{
std::vector<std::string> errorMessages;
TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(&errorMessages);
std::vector<ErrorInfo> errors;
TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(&errors);
params.locationFile = std::make_shared<TokenLocationFile>(*errorCollection.findTokenLocationFileByPath(message->filePath));
params.locationFile->isWholeCopy = true;
}
@@ -225,11 +232,11 @@ void CodeController::handleMessage(MessageScrollCode* message)
void CodeController::handleMessage(MessageShowErrors* message)
{
std::vector<std::string> errorMessages;
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errorMessages);
std::vector<ErrorInfo> errors;
std::vector<CodeSnippetParams> snippets = getSnippetsForErrorLocations(&errors);
CodeView* view = getView();
view->setErrorMessages(errorMessages);
view->setErrorInfos(errors);
view->showCodeSnippets(snippets, std::vector<Id>());
showContents(message);
@@ -256,8 +263,8 @@ void CodeController::handleMessage(MessageShowScope* message)
if (message->showErrors)
{
std::vector<std::string> errorMessages;
std::vector<CodeSnippetParams> errorSnippets = getSnippetsForErrorLocations(&errorMessages);
std::vector<ErrorInfo> errors;
std::vector<CodeSnippetParams> errorSnippets = getSnippetsForErrorLocations(&errors);
for (const CodeSnippetParams& error : errorSnippets)
{
@@ -556,17 +563,30 @@ std::shared_ptr<TokenLocationFile> CodeController::getTokenLocationOfParentScope
}
std::vector<CodeSnippetParams> CodeController::getSnippetsForErrorLocations(
std::vector<std::string>* errorMessages) const
std::vector<ErrorInfo>* errors) const
{
TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(errorMessages);
TokenLocationCollection errorCollection = m_storageAccess->getErrorTokenLocations(errors);
std::vector<CodeSnippetParams> snippets;
errorCollection.forEachTokenLocationFile(
[&](std::shared_ptr<TokenLocationFile> file) -> void
{
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
if (snippets.size() < 10)
{
std::vector<CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
}
else
{
CodeSnippetParams params;
params.locationFile = file;
params.refCount = file->getUnscopedStartTokenLocationCount();
params.modificationTime = m_storageAccess->getFileModificationTime(file->getFilePath());
params.isCollapsed = true;
snippets.push_back(params);
}
}
);