ui/logic/data: show parse errors in CodeView

This change saves the errors while parsing in the Storage and displays them in the CodeView. The error messages can be
read in the tooltip on hovering. The error count is visible in the status bar.
This commit is contained in:
Eberhard Graether
2015-01-15 19:38:19 +01:00
parent 7596c699d6
commit bdb38acbce
38 changed files with 660 additions and 151 deletions
+59 -26
View File
@@ -38,8 +38,34 @@ void CodeController::handleMessage(MessageActivateTokens* message)
activeTokenIds = m_graphAccess->getActiveTokenIdsForId(activeTokenIds[0], &declarationId);
}
getView()->setActiveTokenIds(activeTokenIds);
getView()->showCodeSnippets(getSnippetsForActiveTokenIds(activeTokenIds, declarationId));
CodeView* view = getView();
view->setActiveTokenIds(activeTokenIds);
view->setErrorMessages(std::vector<std::string>());
view->showCodeSnippets(getSnippetsForActiveTokenIds(activeTokenIds, declarationId));
}
void CodeController::handleMessage(MessageFinishedParsing* message)
{
if (message->errorCount > 0)
{
std::vector<std::string> errorMessages;
TokenLocationCollection errorCollection = m_locationAccess->getErrorTokenLocations(&errorMessages);
std::vector<CodeView::CodeSnippetParams> snippets;
errorCollection.forEachTokenLocationFile(
[&](TokenLocationFile* file) -> void
{
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
snippets.insert(snippets.end(), fileSnippets.begin(), fileSnippets.end());
}
);
CodeView* view = getView();
view->setActiveTokenIds(std::vector<Id>());
view->setErrorMessages(errorMessages);
view->showCodeSnippets(snippets);
}
}
void CodeController::handleMessage(MessageRefresh* message)
@@ -78,28 +104,12 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
collection.forEachTokenLocationFile(
[&](TokenLocationFile* file) -> void
{
const std::string filePath = file->getFilePath();
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(filePath);
std::vector<CodeView::CodeSnippetParams> fileSnippets = getSnippetsForFile(file);
std::vector<std::pair<uint, uint>> ranges = getSnippetRangesForFile(file, s_lineRadius);
std::vector<CodeView::CodeSnippetParams> fileSnippets;
for (const std::pair<uint, uint>& range: ranges)
for (CodeView::CodeSnippetParams& params : fileSnippets)
{
unsigned int firstLineNumber = std::max<int>(1, range.first - s_lineRadius);
unsigned int lastLineNumber = std::min<int>(textAccess->getLineCount(), range.second + s_lineRadius);
CodeView::CodeSnippetParams params;
for (const std::string& line: textAccess->getLines(firstLineNumber, lastLineNumber))
{
params.code += line;
}
params.startLineNumber = firstLineNumber;
params.locationFile =
m_locationAccess->getTokenLocationsForLinesInFile(filePath, firstLineNumber, lastLineNumber);
fileSnippets.push_back(params);
params.locationFile = m_locationAccess->getTokenLocationsForLinesInFile(
file->getFilePath(), params.startLineNumber, params.endLineNumber);
}
if (declarationId != 0)
@@ -133,9 +143,32 @@ std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForActiveTok
return snippets;
}
std::vector<std::pair<uint, uint>> CodeController::getSnippetRangesForFile(
TokenLocationFile* file, const uint lineRadius
) const
std::vector<CodeView::CodeSnippetParams> CodeController::getSnippetsForFile(const TokenLocationFile* file) const
{
std::shared_ptr<TextAccess> textAccess = TextAccess::createFromFile(file->getFilePath());
std::vector<std::pair<uint, uint>> ranges = getSnippetRangesForFile(file);
std::vector<CodeView::CodeSnippetParams> snippets;
for (const std::pair<uint, uint>& range: ranges)
{
CodeView::CodeSnippetParams params;
params.locationFile = *file;
params.startLineNumber = std::max<int>(1, range.first - s_lineRadius);
params.endLineNumber = std::min<int>(textAccess->getLineCount(), range.second + s_lineRadius);
for (const std::string& line: textAccess->getLines(params.startLineNumber, params.endLineNumber))
{
params.code += line;
}
snippets.push_back(params);
}
return snippets;
}
std::vector<std::pair<uint, uint>> CodeController::getSnippetRangesForFile(const TokenLocationFile* file) const
{
std::vector<std::pair<uint, uint>> ranges;
uint start = 0;
@@ -152,7 +185,7 @@ std::vector<std::pair<uint, uint>> CodeController::getSnippetRangesForFile(
{
start = lineNumber;
}
else if (end && lineNumber > end + 2 * lineRadius + 1)
else if (end && lineNumber > end + 2 * s_lineRadius + 1)
{
ranges.push_back(std::make_pair(uint(start), uint(end)));
start = lineNumber;
@@ -8,6 +8,7 @@
#include "utility/messaging/MessageListener.h"
#include "utility/messaging/type/MessageActivateTokenLocation.h"
#include "utility/messaging/type/MessageActivateTokens.h"
#include "utility/messaging/type/MessageFinishedParsing.h"
#include "utility/messaging/type/MessageRefresh.h"
#include "utility/messaging/type/MessageShowFile.h"
#include "utility/types.h"
@@ -20,6 +21,7 @@ class CodeController
: public Controller
, public MessageListener<MessageActivateTokenLocation>
, public MessageListener<MessageActivateTokens>
, public MessageListener<MessageFinishedParsing>
, public MessageListener<MessageRefresh>
, public MessageListener<MessageShowFile>
{
@@ -32,6 +34,7 @@ private:
virtual void handleMessage(MessageActivateTokenLocation* message);
virtual void handleMessage(MessageActivateTokens* message);
virtual void handleMessage(MessageFinishedParsing* message);
virtual void handleMessage(MessageRefresh* message);
virtual void handleMessage(MessageShowFile* message);
@@ -39,7 +42,8 @@ private:
std::vector<CodeView::CodeSnippetParams> getSnippetsForActiveTokenIds(
const std::vector<Id>& ids, Id declarationId) const;
std::vector<std::pair<uint, uint>> getSnippetRangesForFile(TokenLocationFile* file, const uint lineRadius) const;
std::vector<CodeView::CodeSnippetParams> getSnippetsForFile(const TokenLocationFile* file) const;
std::vector<std::pair<uint, uint>> getSnippetRangesForFile(const TokenLocationFile* file) const;
GraphAccess* m_graphAccess;
LocationAccess* m_locationAccess;
@@ -56,6 +56,11 @@ void GraphController::handleMessage(MessageActivateTokens* message)
createDummyGraphForTokenIds(m_activeTokenIds);
}
void GraphController::handleMessage(MessageFinishedParsing* message)
{
getView()->clear();
}
void GraphController::handleMessage(MessageGraphNodeExpand* message)
{
DummyNode* node = findDummyNodeAccessRecursive(m_dummyNodes, message->tokenId, message->access);
@@ -153,10 +158,26 @@ DummyNode GraphController::createDummyNodeTopDown(Node* node)
Edge* edge = child->getMemberEdge();
TokenComponentAccess* access = edge->getComponent<TokenComponentAccess>();
TokenComponentAccess::AccessType accessType = TokenComponentAccess::ACCESS_NONE;
if (access)
{
TokenComponentAccess::AccessType accessType = access->getAccess();
accessType = access->getAccess();
}
else
{
if (node->isType(Node::NODE_CLASS | Node::NODE_STRUCT))
{
accessType = TokenComponentAccess::ACCESS_PUBLIC;
}
else
{
parent = &result;
}
}
if (accessType != TokenComponentAccess::ACCESS_NONE)
{
for (DummyNode& dummy : result.subNodes)
{
if (dummy.accessType == accessType)
@@ -178,10 +199,6 @@ DummyNode GraphController::createDummyNodeTopDown(Node* node)
}
}
}
else
{
parent = &result;
}
parent->subNodes.push_back(createDummyNodeTopDown(child));
}
@@ -5,6 +5,7 @@
#include "utility/messaging/MessageListener.h"
#include "utility/messaging/type/MessageActivateTokens.h"
#include "utility/messaging/type/MessageFinishedParsing.h"
#include "utility/messaging/type/MessageGraphNodeExpand.h"
#include "utility/messaging/type/MessageGraphNodeMove.h"
@@ -21,6 +22,7 @@ class Node;
class GraphController
: public Controller
, public MessageListener<MessageActivateTokens>
, public MessageListener<MessageFinishedParsing>
, public MessageListener<MessageGraphNodeExpand>
, public MessageListener<MessageGraphNodeMove>
{
@@ -47,6 +49,7 @@ public:
private:
virtual void handleMessage(MessageActivateTokens* message);
virtual void handleMessage(MessageFinishedParsing* message);
virtual void handleMessage(MessageGraphNodeExpand* message);
virtual void handleMessage(MessageGraphNodeMove* message);
@@ -32,6 +32,11 @@ void SearchController::handleMessage(MessageFind* message)
getView()->setFocus();
}
void SearchController::handleMessage(MessageFinishedParsing* message)
{
getView()->setText("");
}
void SearchController::handleMessage(MessageRefresh* message)
{
getView()->refreshView();
@@ -7,6 +7,7 @@
#include "utility/messaging/MessageListener.h"
#include "utility/messaging/type/MessageActivateTokens.h"
#include "utility/messaging/type/MessageFind.h"
#include "utility/messaging/type/MessageFinishedParsing.h"
#include "utility/messaging/type/MessageRefresh.h"
#include "utility/messaging/type/MessageSearch.h"
#include "utility/messaging/type/MessageSearchAutocomplete.h"
@@ -18,6 +19,7 @@ class SearchController
: public Controller
, public MessageListener<MessageActivateTokens>
, public MessageListener<MessageFind>
, public MessageListener<MessageFinishedParsing>
, public MessageListener<MessageRefresh>
, public MessageListener<MessageSearch>
, public MessageListener<MessageSearchAutocomplete>
@@ -29,6 +31,7 @@ public:
private:
virtual void handleMessage(MessageActivateTokens* message);
virtual void handleMessage(MessageFind* message);
virtual void handleMessage(MessageFinishedParsing* message);
virtual void handleMessage(MessageRefresh* message);
virtual void handleMessage(MessageSearch* message);
virtual void handleMessage(MessageSearchAutocomplete* message);
@@ -2,6 +2,9 @@
#include "component/view/StatusBarView.h"
#include <sstream>
#include <iomanip>
StatusBarController::StatusBarController()
: MessageListener<MessageError>(true)
, MessageListener<MessageFinishedParsing>(true)
@@ -23,7 +26,14 @@ StatusBarView* StatusBarController::getView()
void StatusBarController::handleMessage(MessageFinishedParsing* message)
{
setStatus("Parsing Finished");
std::stringstream ss;
ss << "Parsing Finished: ";
ss << std::setprecision(2) << message->parseTime << " seconds, ";
ss << message->errorCount << " error(s)";
bool hasErrors = message->errorCount > 0;
setStatus(ss.str(), hasErrors);
}
void StatusBarController::handleMessage(MessageStatus* message)