Skip to content

Commit a20fb4f

Browse files
committed
GUI: Update results
1 parent 94d39f6 commit a20fb4f

9 files changed

Lines changed: 144 additions & 129 deletions

gui/csvreport.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ void CsvReport::WriteError(const ErrorItem &error)
5858
gui/test.cpp,23,error,Mismatching allocation and deallocation: k
5959
*/
6060

61-
const QString file = QDir::toNativeSeparators(error.files[error.files.size() - 1]);
62-
QString line = QString("%1,%2,").arg(file).arg(error.lines[error.lines.size() - 1]);
61+
const QString file = QDir::toNativeSeparators(error.errorPath.back().file);
62+
QString line = QString("%1,%2,").arg(file).arg(error.errorPath.back().line);
6363
line += QString("%1,%2").arg(GuiSeverity::toString(error.severity)).arg(error.summary);
6464

6565
mTxtWriter << line << endl;

gui/erroritem.cpp

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,55 @@
1818

1919
#include "erroritem.h"
2020

21+
QErrorPathItem::QErrorPathItem(const ErrorLogger::ErrorMessage::FileLocation &loc)
22+
: file(QString::fromStdString(loc.getfile(false)))
23+
, line(loc.line)
24+
, col(loc.col)
25+
, info(QString::fromStdString(loc.getinfo()))
26+
{
27+
}
28+
29+
QErrorPathItem::QErrorPathItem(const QErrorPathItem &e)
30+
: file(e.file)
31+
, line(e.line)
32+
, col(e.col)
33+
, info(e.info)
34+
{
35+
}
36+
2137
ErrorItem::ErrorItem()
2238
: severity(Severity::none)
2339
, inconclusive(false)
40+
, cwe(-1)
2441
{
2542
}
2643

27-
ErrorItem::ErrorItem(const ErrorLine &line)
28-
: file(line.file)
29-
, files(line.file)
30-
, errorId(line.errorId)
31-
, severity(line.severity)
32-
, inconclusive(line.inconclusive)
33-
, summary(line.summary)
34-
, message(line.message)
44+
ErrorItem::ErrorItem(const ErrorLogger::ErrorMessage &errmsg)
45+
: errorId(QString::fromStdString(errmsg._id))
46+
, severity(errmsg._severity)
47+
, inconclusive(errmsg._inconclusive)
48+
, summary(QString::fromStdString(errmsg.shortMessage()))
49+
, message(QString::fromStdString(errmsg.verboseMessage()))
50+
, cwe(errmsg._cwe.id)
3551
{
36-
lines.append(line.line);
52+
for (std::list<ErrorLogger::ErrorMessage::FileLocation>::const_iterator loc = errmsg._callStack.begin();
53+
loc != errmsg._callStack.end();
54+
++loc) {
55+
errorPath << QErrorPathItem(*loc);
56+
}
3757
}
3858

59+
3960
QString ErrorItem::ToString() const
4061
{
41-
QString str = file + " - " + errorId + " - ";
62+
QString str = errorPath.back().file + " - " + errorId + " - ";
4263
if (inconclusive)
4364
str += "inconclusive ";
4465
str += GuiSeverity::toString(severity) +"\n";
4566
str += summary + "\n";
4667
str += message + "\n";
47-
for (int i = 0; i < files.size(); i++) {
48-
str += " " + files[i] + ": " + QString::number(lines[i]) + "\n";
68+
for (int i = 0; i < errorPath.size(); i++) {
69+
str += " " + errorPath[i].file + ": " + QString::number(errorPath[i].line) + "\n";
4970
}
5071
return str;
5172
}

gui/erroritem.h

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,20 @@ class GuiSeverity {
4646
}
4747
};
4848

49+
/**
50+
* @brief A class containing data for one error path item
51+
*/
52+
class QErrorPathItem {
53+
public:
54+
QErrorPathItem() : line(0), col(-1) {}
55+
explicit QErrorPathItem(const ErrorLogger::ErrorMessage::FileLocation &loc);
56+
explicit QErrorPathItem(const QErrorPathItem &e);
57+
QString file;
58+
unsigned int line;
59+
int col;
60+
QString info;
61+
};
62+
4963
/**
5064
* @brief A class containing error data for one error.
5165
*
@@ -57,23 +71,22 @@ class GuiSeverity {
5771
class ErrorItem {
5872
public:
5973
ErrorItem();
60-
explicit ErrorItem(const ErrorLine &line);
74+
explicit ErrorItem(const ErrorLogger::ErrorMessage &errmsg);
6175

6276
/**
6377
* @brief Convert error item to string.
6478
* @return Error item as string.
6579
*/
6680
QString ToString() const;
6781

68-
QString file;
69-
QStringList files;
7082
QString file0;
71-
QList<unsigned int> lines;
7283
QString errorId;
7384
Severity::SeverityType severity;
7485
bool inconclusive;
7586
QString summary;
7687
QString message;
88+
int cwe;
89+
QList<QErrorPathItem> errorPath;
7790
};
7891

7992
Q_DECLARE_METATYPE(ErrorItem);
@@ -84,8 +97,8 @@ Q_DECLARE_METATYPE(ErrorItem);
8497
class ErrorLine {
8598
public:
8699
QString file;
87-
QString file0;
88100
unsigned int line;
101+
QString file0;
89102
QString errorId;
90103
bool inconclusive;
91104
Severity::SeverityType severity;

gui/printablereport.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,8 @@ void PrintableReport::WriteFooter()
4545

4646
void PrintableReport::WriteError(const ErrorItem &error)
4747
{
48-
const QString file = QDir::toNativeSeparators(error.files[error.files.size() - 1]);
49-
QString line = QString("%1,%2,").arg(file).arg(error.lines[error.lines.size() - 1]);
48+
const QString file = QDir::toNativeSeparators(error.errorPath.back().file);
49+
QString line = QString("%1,%2,").arg(file).arg(error.errorPath.back().line);
5050
line += QString("%1,%2").arg(GuiSeverity::toString(error.severity)).arg(error.summary);
5151

5252
mFormattedReport += line;

gui/resultstree.cpp

Lines changed: 49 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,11 @@ QStandardItem *ResultsTree::CreateLineNumberItem(const QString &linenumber)
114114

115115
bool ResultsTree::AddErrorItem(const ErrorItem &item)
116116
{
117-
if (item.files.isEmpty()) {
117+
if (item.errorPath.isEmpty()) {
118118
return false;
119119
}
120120

121-
QString realfile = StripPath(item.files[0], false);
121+
QString realfile = StripPath(item.errorPath.back().file, false);
122122

123123
if (realfile.isEmpty()) {
124124
realfile = tr("Undefined file");
@@ -130,7 +130,7 @@ bool ResultsTree::AddErrorItem(const ErrorItem &item)
130130
if (!hide && !mFilter.isEmpty()) {
131131
if (!item.summary.contains(mFilter, Qt::CaseInsensitive) &&
132132
!item.message.contains(mFilter, Qt::CaseInsensitive) &&
133-
!item.file.contains(mFilter, Qt::CaseInsensitive) &&
133+
!item.errorPath.back().file.contains(mFilter, Qt::CaseInsensitive) &&
134134
!item.errorId.contains(mFilter, Qt::CaseInsensitive)) {
135135
hide = true;
136136
}
@@ -143,15 +143,15 @@ bool ResultsTree::AddErrorItem(const ErrorItem &item)
143143

144144
ErrorLine line;
145145
line.file = realfile;
146+
line.line = item.errorPath.back().line;
146147
line.errorId = item.errorId;
147148
line.inconclusive = item.inconclusive;
148-
line.line = item.lines[0];
149149
line.summary = item.summary;
150150
line.message = item.message;
151151
line.severity = item.severity;
152152
//Create the base item for the error and ensure it has a proper
153153
//file item as a parent
154-
QStandardItem* fileItem = EnsureFileItem(item.files[0], item.file0, hide);
154+
QStandardItem* fileItem = EnsureFileItem(item.errorPath.back().file, item.file0, hide);
155155
QStandardItem* stditem = AddBacktraceFiles(fileItem,
156156
line,
157157
hide,
@@ -167,34 +167,38 @@ bool ResultsTree::AddErrorItem(const ErrorItem &item)
167167
data["severity"] = ShowTypes::SeverityToShowType(item.severity);
168168
data["summary"] = item.summary;
169169
data["message"] = item.message;
170-
data["file"] = item.files[0];
171-
data["line"] = item.lines[0];
170+
data["file"] = item.errorPath.back().file;
171+
data["line"] = item.errorPath.back().line;
172172
data["id"] = item.errorId;
173173
data["inconclusive"] = item.inconclusive;
174174
data["file0"] = StripPath(item.file0, true);
175175
stditem->setData(QVariant(data));
176176

177177
//Add backtrace files as children
178-
for (int i = 1; i < item.files.size(); i++) {
179-
line.file = StripPath(item.files[i], false);
180-
line.line = item.lines[i];
181-
QStandardItem *child_item;
182-
child_item = AddBacktraceFiles(stditem,
183-
line,
184-
hide,
185-
":images/go-down.png",
186-
true);
187-
188-
//Add user data to that item
189-
QMap<QString, QVariant> child_data;
190-
child_data["severity"] = ShowTypes::SeverityToShowType(line.severity);
191-
child_data["summary"] = line.summary;
192-
child_data["message"] = line.message;
193-
child_data["file"] = item.files[i];
194-
child_data["line"] = line.line;
195-
child_data["id"] = line.errorId;
196-
child_data["inconclusive"] = line.inconclusive;
197-
child_item->setData(QVariant(child_data));
178+
if (item.errorPath.size() > 1U) {
179+
for (int i = 0; i < item.errorPath.size(); i++) {
180+
const QErrorPathItem &e = item.errorPath[i];
181+
line.file = e.file;
182+
line.line = e.line;
183+
line.message = line.summary = e.info;
184+
QStandardItem *child_item;
185+
child_item = AddBacktraceFiles(stditem,
186+
line,
187+
hide,
188+
":images/go-down.png",
189+
true);
190+
191+
//Add user data to that item
192+
QMap<QString, QVariant> child_data;
193+
child_data["severity"] = ShowTypes::SeverityToShowType(line.severity);
194+
child_data["summary"] = line.summary;
195+
child_data["message"] = line.message;
196+
child_data["file"] = e.file;
197+
child_data["line"] = e.line;
198+
child_data["id"] = line.errorId;
199+
child_data["inconclusive"] = line.inconclusive;
200+
child_item->setData(QVariant(child_data));
201+
}
198202
}
199203

200204
// Partially refresh the tree: Unhide file item if necessary
@@ -209,37 +213,21 @@ QStandardItem *ResultsTree::AddBacktraceFiles(QStandardItem *parent,
209213
const bool hide,
210214
const QString &icon,
211215
bool childOfMessage)
212-
213216
{
214217
if (!parent) {
215218
return 0;
216219
}
217220

218221
QList<QStandardItem*> list;
219222
// Ensure shown path is with native separators
220-
const QString file = QDir::toNativeSeparators(item.file);
221-
list << CreateNormalItem(file);
222-
if (childOfMessage)
223-
list << CreateNormalItem("");
224-
else {
225-
const QString severity = SeverityToTranslatedString(item.severity);
226-
list << CreateNormalItem(severity);
227-
}
228-
list << CreateLineNumberItem(QString("%1").arg(item.line));
229-
if (childOfMessage)
230-
list << CreateNormalItem("");
231-
else
232-
list << CreateNormalItem(item.errorId);
233-
if (childOfMessage)
234-
list << CreateNormalItem("");
235-
else
236-
list << CreateCheckboxItem(item.inconclusive);
223+
list << CreateNormalItem(QDir::toNativeSeparators(item.file))
224+
<< CreateNormalItem(childOfMessage ? tr("note") : SeverityToTranslatedString(item.severity))
225+
<< CreateLineNumberItem(QString::number(item.line))
226+
<< CreateNormalItem(childOfMessage ? QString() : item.errorId)
227+
<< (childOfMessage ? CreateNormalItem(QString()) : CreateCheckboxItem(item.inconclusive))
228+
<< CreateNormalItem(item.summary);
237229
//TODO message has parameter names so we'll need changes to the core
238230
//cppcheck so we can get proper translations
239-
if (childOfMessage)
240-
list << CreateNormalItem("");
241-
else
242-
list << CreateNormalItem(item.summary.toLatin1());
243231

244232
// Check for duplicate rows and don't add them if found
245233
for (int i = 0; i < parent->rowCount(); i++) {
@@ -1014,11 +1002,14 @@ void ResultsTree::SaveErrors(Report *report, QStandardItem *item) const
10141002
item.errorId = data["id"].toString();
10151003
item.inconclusive = data["inconclusive"].toBool();
10161004
item.file0 = data["file0"].toString();
1017-
QString file = StripPath(data["file"].toString(), true);
1018-
unsigned int line = data["line"].toUInt();
10191005

1020-
item.files << file;
1021-
item.lines << line;
1006+
if (error->rowCount() == 0) {
1007+
QErrorPathItem e;
1008+
e.file = StripPath(data["file"].toString(), true);
1009+
e.line = data["line"].toUInt();
1010+
e.info = data["message"].toString();
1011+
item.errorPath << e;
1012+
}
10221013

10231014
for (int j = 0; j < error->rowCount(); j++) {
10241015
QStandardItem *child_error = error->child(j, 0);
@@ -1027,11 +1018,11 @@ void ResultsTree::SaveErrors(Report *report, QStandardItem *item) const
10271018
//Convert it to QVariantMap
10281019
QVariantMap child_data = child_userdata.toMap();
10291020

1030-
file = StripPath(child_data["file"].toString(), true);
1031-
line = child_data["line"].toUInt();
1032-
1033-
item.files << file;
1034-
item.lines << line;
1021+
QErrorPathItem e;
1022+
e.file = StripPath(child_data["file"].toString(), true);
1023+
e.line = child_data["line"].toUInt();
1024+
e.info = child_data["message"].toString();
1025+
item.errorPath << e;
10351026
}
10361027

10371028
report->WriteError(item);

gui/threadresult.cpp

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -60,28 +60,7 @@ void ThreadResult::FileChecked(const QString &file)
6060
void ThreadResult::reportErr(const ErrorLogger::ErrorMessage &msg)
6161
{
6262
QMutexLocker locker(&mutex);
63-
64-
QList<unsigned int> lines;
65-
QStringList files;
66-
67-
for (std::list<ErrorLogger::ErrorMessage::FileLocation>::const_iterator tok = msg._callStack.begin();
68-
tok != msg._callStack.end();
69-
++tok) {
70-
files << QString::fromStdString((*tok).getfile(false));
71-
lines << (*tok).line;
72-
}
73-
74-
ErrorItem item;
75-
item.file = QString::fromStdString(callStackToString(msg._callStack));
76-
item.files = files;
77-
item.errorId = QString::fromStdString(msg._id);
78-
item.lines = lines;
79-
item.summary = QString::fromStdString(msg.shortMessage());
80-
item.message = QString::fromStdString(msg.verboseMessage());
81-
item.severity = msg._severity;
82-
item.inconclusive = msg._inconclusive;
83-
item.file0 = QString::fromStdString(msg.file0);
84-
63+
const ErrorItem item(msg);
8564
if (msg._severity != Severity::debug)
8665
emit Error(item);
8766
else

gui/txtreport.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,14 +56,14 @@ void TxtReport::WriteError(const ErrorItem &error)
5656

5757
QString line;
5858

59-
for (int i = 0; i < error.lines.size(); i++) {
60-
const QString file = QDir::toNativeSeparators(error.files[i]);
61-
line += QString("[%1:%2]").arg(file).arg(error.lines[i]);
62-
if (i < error.lines.size() - 1 && !error.lines.isEmpty()) {
59+
for (int i = 0; i < error.errorPath.size(); i++) {
60+
const QString file = QDir::toNativeSeparators(error.errorPath[i].file);
61+
line += QString("[%1:%2]").arg(file).arg(error.errorPath[i].line);
62+
if (i < error.errorPath.size() - 1 && !error.errorPath.isEmpty()) {
6363
line += " -> ";
6464
}
6565

66-
if (i == error.lines.size() - 1) {
66+
if (i == error.errorPath.size() - 1) {
6767
line += ": ";
6868
}
6969
}

0 commit comments

Comments
 (0)