From 4f383f77b42fe6a0f7a2768b4c1103a68295ce3a Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Mon, 20 Apr 2015 17:13:45 +0200 Subject: [PATCH] Tasks: Make the linking of compile output to Tasks more robust Clicking on error messages is supposed to jump to the editor. And "Show Output" on the task is supposed to select the error in the output. The old code just registered the task for the last line of output. This broke for every parser that allowed for error messages that spanned multiple lines. And was obviously also incorrect for tasks that weren't generated due to compile output. Fix both of those issues by giving the IOutputParsers more control on which lines are linked to a task. Task-number: QTCREATORBUG-14136 Change-Id: I095922c9875620dabfb7d406f6b152c8a9b25b62 Reviewed-by: Tobias Hunger Reviewed-by: Daniel Teske --- src/plugins/android/javaparser.cpp | 2 +- .../cmakeprojectmanager/cmakeparser.cpp | 6 +++- src/plugins/cmakeprojectmanager/cmakeparser.h | 1 + .../projectexplorer/abstractprocessstep.cpp | 4 +-- .../projectexplorer/abstractprocessstep.h | 2 +- src/plugins/projectexplorer/buildmanager.cpp | 12 +++---- src/plugins/projectexplorer/buildmanager.h | 2 +- src/plugins/projectexplorer/buildstep.h | 7 +++- .../projectexplorer/compileoutputwindow.cpp | 31 +++++++++++++---- .../projectexplorer/compileoutputwindow.h | 5 +-- src/plugins/projectexplorer/customparser.cpp | 4 ++- src/plugins/projectexplorer/gccparser.cpp | 6 +++- src/plugins/projectexplorer/gccparser.h | 1 + src/plugins/projectexplorer/gnumakeparser.cpp | 13 +++---- src/plugins/projectexplorer/gnumakeparser.h | 2 +- src/plugins/projectexplorer/ioutputparser.cpp | 12 +++---- src/plugins/projectexplorer/ioutputparser.h | 4 +-- src/plugins/projectexplorer/ldparser.cpp | 17 +++++----- .../projectexplorer/linuxiccparser.cpp | 6 ++-- src/plugins/projectexplorer/linuxiccparser.h | 1 + src/plugins/projectexplorer/msvcparser.cpp | 9 ++++- src/plugins/projectexplorer/msvcparser.h | 1 + .../projectexplorer/outputparser_test.cpp | 4 ++- .../projectexplorer/outputparser_test.h | 2 +- .../projectexplorer/xcodebuildparser.cpp | 2 +- .../qbsprojectmanager/qbsbuildstep.cpp | 7 ++-- .../qbsprojectmanager/qbscleanstep.cpp | 8 +++-- .../qbsprojectmanager/qbsinstallstep.cpp | 7 ++-- src/plugins/qbsprojectmanager/qbsparser.cpp | 4 +-- src/plugins/qbsprojectmanager/qbsparser.h | 2 +- .../qmakeprojectmanager/qmakeparser.cpp | 34 +++++++++++-------- .../qnx/blackberryabstractdeploystep.cpp | 5 +-- .../qnx/blackberrycheckdevicestatusstep.cpp | 10 +++--- src/plugins/qnx/blackberryprocessparser.cpp | 2 +- src/plugins/qtsupport/qtparser.cpp | 4 +-- .../remotelinux/abstractpackagingstep.cpp | 10 +++--- .../abstractremotelinuxdeploystep.cpp | 10 +++--- .../winrt/winrtpackagedeploymentstep.cpp | 10 +++--- 38 files changed, 168 insertions(+), 101 deletions(-) diff --git a/src/plugins/android/javaparser.cpp b/src/plugins/android/javaparser.cpp index 65a979e2ddb..05673790b89 100644 --- a/src/plugins/android/javaparser.cpp +++ b/src/plugins/android/javaparser.cpp @@ -95,7 +95,7 @@ void JavaParser::parse(const QString &line) file /* filename */, lineno, Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.cpp b/src/plugins/cmakeprojectmanager/cmakeparser.cpp index 354fb70681b..4802eef763a 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeparser.cpp @@ -71,15 +71,18 @@ void CMakeParser::stdError(const QString &line) if (m_commonError.indexIn(trimmedLine) != -1) { m_lastTask = Task(Task::Error, QString(), Utils::FileName::fromUserInput(m_commonError.cap(1)), m_commonError.cap(2).toInt(), Constants::TASK_CATEGORY_BUILDSYSTEM); + m_lines = 1; return; } else if (m_nextSubError.indexIn(trimmedLine) != -1) { m_lastTask = Task(Task::Error, QString(), Utils::FileName::fromUserInput(m_nextSubError.cap(1)), -1, Constants::TASK_CATEGORY_BUILDSYSTEM); + m_lines = 1; return; } else if (trimmedLine.startsWith(QLatin1String(" ")) && !m_lastTask.isNull()) { if (!m_lastTask.description.isEmpty()) m_lastTask.description.append(QLatin1Char(' ')); m_lastTask.description.append(trimmedLine.trimmed()); + ++m_lines; return; } @@ -92,7 +95,8 @@ void CMakeParser::doFlush() return; Task t = m_lastTask; m_lastTask.clear(); - emit addTask(t); + emit addTask(t, m_lines, 1); + m_lines = 0; } #ifdef WITH_TESTS diff --git a/src/plugins/cmakeprojectmanager/cmakeparser.h b/src/plugins/cmakeprojectmanager/cmakeparser.h index 48148609f93..f0432b93dae 100644 --- a/src/plugins/cmakeprojectmanager/cmakeparser.h +++ b/src/plugins/cmakeprojectmanager/cmakeparser.h @@ -53,6 +53,7 @@ private: QRegExp m_commonError; QRegExp m_nextSubError; bool m_skippedFirstEmptyLine; + int m_lines = 0; }; } // namespace CMakeProjectManager diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index a3620fdadbd..29b5e901849 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -391,7 +391,7 @@ void AbstractProcessStep::checkForCancel() } } -void AbstractProcessStep::taskAdded(const Task &task) +void AbstractProcessStep::taskAdded(const Task &task, int linkedOutputLines, int skipLines) { // Do not bother to report issues if we do not care about the results of // the buildstep anyway: @@ -443,7 +443,7 @@ void AbstractProcessStep::taskAdded(const Task &task) qWarning() << "Could not find absolute location of file " << filePath; } } - emit addTask(editable); + emit addTask(editable, linkedOutputLines, skipLines); } void AbstractProcessStep::outputAdded(const QString &string, BuildStep::OutputFormat format) diff --git a/src/plugins/projectexplorer/abstractprocessstep.h b/src/plugins/projectexplorer/abstractprocessstep.h index f8841a19c74..a79ebd2db5e 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.h +++ b/src/plugins/projectexplorer/abstractprocessstep.h @@ -90,7 +90,7 @@ private slots: void cleanUp(); - void taskAdded(const Task &task); + void taskAdded(const Task &task, int linkedOutputLines = 0, int skipLines = 0); void outputAdded(const QString &string, BuildStep::OutputFormat format); diff --git a/src/plugins/projectexplorer/buildmanager.cpp b/src/plugins/projectexplorer/buildmanager.cpp index 9cff3972d93..4d8db4520f7 100644 --- a/src/plugins/projectexplorer/buildmanager.cpp +++ b/src/plugins/projectexplorer/buildmanager.cpp @@ -341,10 +341,10 @@ void BuildManager::showBuildResults() //toggleTaskWindow(); } -void BuildManager::addToTaskWindow(const Task &task) +void BuildManager::addToTaskWindow(const Task &task, int linkedOutputLines, int skipLines) { - d->m_outputWindow->registerPositionOf(task); // Distribute to all others + d->m_outputWindow->registerPositionOf(task, linkedOutputLines, skipLines); TaskHub::addTask(task); } @@ -496,8 +496,8 @@ bool BuildManager::buildQueueAppend(QList steps, QStringList names, int i = 0; for (; i < count; ++i) { BuildStep *bs = steps.at(i); - connect(bs, SIGNAL(addTask(ProjectExplorer::Task)), - m_instance, SLOT(addToTaskWindow(ProjectExplorer::Task))); + connect(bs, SIGNAL(addTask(ProjectExplorer::Task, int, int)), + m_instance, SLOT(addToTaskWindow(ProjectExplorer::Task, int, int))); connect(bs, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat,ProjectExplorer::BuildStep::OutputNewlineSetting)), m_instance, SLOT(addToOutputWindow(QString,ProjectExplorer::BuildStep::OutputFormat,ProjectExplorer::BuildStep::OutputNewlineSetting))); if (bs->enabled()) { @@ -657,8 +657,8 @@ void BuildManager::decrementActiveBuildSteps(BuildStep *bs) void BuildManager::disconnectOutput(BuildStep *bs) { - disconnect(bs, SIGNAL(addTask(ProjectExplorer::Task)), - m_instance, SLOT(addToTaskWindow(ProjectExplorer::Task))); + disconnect(bs, SIGNAL(addTask(ProjectExplorer::Task, int, int)), + m_instance, SLOT(addToTaskWindow(ProjectExplorer::Task, int, int))); disconnect(bs, SIGNAL(addOutput(QString, ProjectExplorer::BuildStep::OutputFormat, ProjectExplorer::BuildStep::OutputNewlineSetting)), m_instance, SLOT(addToOutputWindow(QString, ProjectExplorer::BuildStep::OutputFormat, diff --git a/src/plugins/projectexplorer/buildmanager.h b/src/plugins/projectexplorer/buildmanager.h index 0752fa0f5e0..518185d72d5 100644 --- a/src/plugins/projectexplorer/buildmanager.h +++ b/src/plugins/projectexplorer/buildmanager.h @@ -86,7 +86,7 @@ signals: void tasksCleared(); private slots: - static void addToTaskWindow(const ProjectExplorer::Task &task); + static void addToTaskWindow(const ProjectExplorer::Task &task, int linkedOutputLines, int skipLines); static void addToOutputWindow(const QString &string, ProjectExplorer::BuildStep::OutputFormat, ProjectExplorer::BuildStep::OutputNewlineSetting = BuildStep::DoAppendNewline); diff --git a/src/plugins/projectexplorer/buildstep.h b/src/plugins/projectexplorer/buildstep.h index 867fc15f4d0..bfd0dfd6167 100644 --- a/src/plugins/projectexplorer/buildstep.h +++ b/src/plugins/projectexplorer/buildstep.h @@ -84,8 +84,13 @@ public: enum OutputNewlineSetting { DoAppendNewline, DontAppendNewline }; signals: - void addTask(const ProjectExplorer::Task &task); + /// Adds a \p task to the Issues pane. + /// Do note that for linking compile output with tasks, you should first emit the task + /// and then emit the output. \p linkedOutput lines will be linked. And the last \p skipLines will + /// be skipped. + void addTask(const ProjectExplorer::Task &task, int linkedOutputLines = 0, int skipLines = 0); + /// Adds \p string to the compile output view, formatted in \p format void addOutput(const QString &string, ProjectExplorer::BuildStep::OutputFormat format, ProjectExplorer::BuildStep::OutputNewlineSetting newlineSetting = DoAppendNewline) const; diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index c20f813a617..47a11cff514 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -257,14 +257,21 @@ bool CompileOutputWindow::canNavigate() const return false; } -void CompileOutputWindow::registerPositionOf(const Task &task) +void CompileOutputWindow::registerPositionOf(const Task &task, int linkedOutputLines, int skipLines) { - int blocknumber = m_outputWindow->blockCount(); + if (linkedOutputLines <= 0) + return; + int blocknumber = m_outputWindow->document()->blockCount(); if (blocknumber > MAX_LINECOUNT) return; - m_taskPositions.insert(task.taskId, blocknumber); - m_outputWindow->addTask(task, blocknumber); + const int startLine = blocknumber - linkedOutputLines + 1 - skipLines; + const int endLine = blocknumber - skipLines; + + m_taskPositions.insert(task.taskId, qMakePair(startLine, endLine)); + + for (int i = startLine; i <= endLine; ++i) + m_outputWindow->addTask(task, i); } bool CompileOutputWindow::knowsPositionOf(const Task &task) @@ -274,10 +281,20 @@ bool CompileOutputWindow::knowsPositionOf(const Task &task) void CompileOutputWindow::showPositionOf(const Task &task) { - int position = m_taskPositions.value(task.taskId); - QTextCursor newCursor(m_outputWindow->document()->findBlockByNumber(position)); - newCursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::KeepAnchor); + QPair position = m_taskPositions.value(task.taskId); + QTextCursor newCursor(m_outputWindow->document()->findBlockByNumber(position.second)); + + // Move cursor to end of last line of interest: + newCursor.movePosition(QTextCursor::EndOfBlock, QTextCursor::MoveAnchor); m_outputWindow->setTextCursor(newCursor); + + // Move cursor and select lines: + newCursor.setPosition(m_outputWindow->document()->findBlockByNumber(position.first).position(), + QTextCursor::KeepAnchor); + m_outputWindow->setTextCursor(newCursor); + + // Center cursor now: + m_outputWindow->centerCursor(); } void CompileOutputWindow::flush() diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index 12e294d0ff0..1df5a05ca8e 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -35,6 +35,7 @@ #include #include +#include QT_BEGIN_NAMESPACE class QPlainTextEdit; @@ -79,7 +80,7 @@ public: void goToPrev(); bool canNavigate() const; - void registerPositionOf(const Task &task); + void registerPositionOf(const Task &task, int linkedOutputLines, int skipLines); bool knowsPositionOf(const Task &task); void showPositionOf(const Task &task); @@ -90,7 +91,7 @@ private slots: private: CompileOutputTextEdit *m_outputWindow; - QHash m_taskPositions; + QHash> m_taskPositions; ShowOutputTaskHandler * m_handler; QToolButton *m_cancelBuildButton; Utils::AnsiEscapeCodeHandler *m_escapeCodeHandler; diff --git a/src/plugins/projectexplorer/customparser.cpp b/src/plugins/projectexplorer/customparser.cpp index 9eee9ff2ca4..d7d3f913389 100644 --- a/src/plugins/projectexplorer/customparser.cpp +++ b/src/plugins/projectexplorer/customparser.cpp @@ -31,6 +31,7 @@ #include "customparser.h" #include "task.h" #include "projectexplorerconstants.h" +#include "buildmanager.h" #include @@ -143,7 +144,8 @@ bool CustomParser::parseLine(const QString &rawLine) const int lineNumber = m_errorRegExp.cap(m_lineNumberCap).toInt(); const QString message = m_errorRegExp.cap(m_messageCap); - emit addTask(Task(Task::Error, message, fileName, lineNumber, Constants::TASK_CATEGORY_COMPILE)); + Task task = Task(Task::Error, message, fileName, lineNumber, Constants::TASK_CATEGORY_COMPILE); + emit addTask(task, 1); return true; } diff --git a/src/plugins/projectexplorer/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp index 61dadc78330..edd09bb1595 100644 --- a/src/plugins/projectexplorer/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -32,6 +32,7 @@ #include "ldparser.h" #include "task.h" #include "projectexplorerconstants.h" +#include "buildmanager.h" #include #include @@ -152,6 +153,7 @@ void GccParser::newTask(const Task &task) { doFlush(); m_currentTask = task; + m_lines = 1; } void GccParser::doFlush() @@ -160,7 +162,8 @@ void GccParser::doFlush() return; Task t = m_currentTask; m_currentTask.clear(); - emit addTask(t); + emit addTask(t, m_lines, 1); + m_lines = 0; } void GccParser::amendDescription(const QString &desc, bool monospaced) @@ -178,6 +181,7 @@ void GccParser::amendDescription(const QString &desc, bool monospaced) fr.format.setFontStyleHint(QFont::Monospace); m_currentTask.formats.append(fr); } + ++m_lines; return; } diff --git a/src/plugins/projectexplorer/gccparser.h b/src/plugins/projectexplorer/gccparser.h index c4fe2e21ff7..cf478bfab10 100644 --- a/src/plugins/projectexplorer/gccparser.h +++ b/src/plugins/projectexplorer/gccparser.h @@ -61,6 +61,7 @@ private: QRegularExpression m_regExpGccNames; Task m_currentTask; + int m_lines = 0; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index 9416cd46eda..c6adc9fb7f1 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -128,7 +128,7 @@ void GnuMakeParser::stdError(const QString &line) taskAdded(Task(res.type, res.description, Utils::FileName::fromUserInput(match.captured(1)) /* filename */, match.captured(4).toInt(), /* line */ - Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)), 1, 0); } return; } @@ -138,9 +138,10 @@ void GnuMakeParser::stdError(const QString &line) if (res.isFatal) ++m_fatalErrorCount; if (!m_suppressIssues) { - taskAdded(Task(res.type, res.description, - Utils::FileName() /* filename */, -1, /* line */ - Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM))); + Task task = Task(res.type, res.description, + Utils::FileName() /* filename */, -1, /* line */ + Core::Id(Constants::TASK_CATEGORY_BUILDSYSTEM)); + taskAdded(task, 1, 0); } return; } @@ -160,7 +161,7 @@ void GnuMakeParser::removeDirectory(const QString &dir) m_directories.removeOne(dir); } -void GnuMakeParser::taskAdded(const Task &task) +void GnuMakeParser::taskAdded(const Task &task, int linkedLines, int skippedLines) { Task editable(task); @@ -187,7 +188,7 @@ void GnuMakeParser::taskAdded(const Task &task) // identify the file! } - IOutputParser::taskAdded(editable); + IOutputParser::taskAdded(editable, linkedLines, skippedLines); } #if defined WITH_TESTS diff --git a/src/plugins/projectexplorer/gnumakeparser.h b/src/plugins/projectexplorer/gnumakeparser.h index 26d3bf4503d..cf34bf68a5c 100644 --- a/src/plugins/projectexplorer/gnumakeparser.h +++ b/src/plugins/projectexplorer/gnumakeparser.h @@ -55,7 +55,7 @@ public: bool hasFatalErrors() const; public slots: - void taskAdded(const ProjectExplorer::Task &task); + void taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skippedLines); private: void addDirectory(const QString &dir); diff --git a/src/plugins/projectexplorer/ioutputparser.cpp b/src/plugins/projectexplorer/ioutputparser.cpp index 283a06a9778..420e77043e4 100644 --- a/src/plugins/projectexplorer/ioutputparser.cpp +++ b/src/plugins/projectexplorer/ioutputparser.cpp @@ -149,8 +149,8 @@ void IOutputParser::appendOutputParser(IOutputParser *parser) m_parser = parser; connect(parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)), this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat)), Qt::DirectConnection); - connect(parser, SIGNAL(addTask(ProjectExplorer::Task)), - this, SLOT(taskAdded(ProjectExplorer::Task)), Qt::DirectConnection); + connect(parser, SIGNAL(addTask(ProjectExplorer::Task, int, int)), + this, SLOT(taskAdded(ProjectExplorer::Task, int, int)), Qt::DirectConnection); } IOutputParser *IOutputParser::takeOutputParserChain() @@ -158,8 +158,8 @@ IOutputParser *IOutputParser::takeOutputParserChain() IOutputParser *parser = m_parser; disconnect(parser, SIGNAL(addOutput(QString,ProjectExplorer::BuildStep::OutputFormat)), this, SLOT(outputAdded(QString,ProjectExplorer::BuildStep::OutputFormat))); - disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task)), - this, SLOT(taskAdded(ProjectExplorer::Task))); + disconnect(parser, SIGNAL(addTask(ProjectExplorer::Task, int, int)), + this, SLOT(taskAdded(ProjectExplorer::Task, int, int))); m_parser = 0; return parser; } @@ -193,9 +193,9 @@ void IOutputParser::outputAdded(const QString &string, BuildStep::OutputFormat f emit addOutput(string, format); } -void IOutputParser::taskAdded(const Task &task) +void IOutputParser::taskAdded(const Task &task, int linkedOutputLines, int skipLines) { - emit addTask(task); + emit addTask(task, linkedOutputLines, skipLines); } void IOutputParser::doFlush() diff --git a/src/plugins/projectexplorer/ioutputparser.h b/src/plugins/projectexplorer/ioutputparser.h index bb93af8518f..840ce0d5527 100644 --- a/src/plugins/projectexplorer/ioutputparser.h +++ b/src/plugins/projectexplorer/ioutputparser.h @@ -67,11 +67,11 @@ public: signals: void addOutput(const QString &string, ProjectExplorer::BuildStep::OutputFormat format); - void addTask(const ProjectExplorer::Task &task); + void addTask(const ProjectExplorer::Task &task, int linkedOutputLines = 0, int skipLines = 0); public slots: virtual void outputAdded(const QString &string, ProjectExplorer::BuildStep::OutputFormat format); - virtual void taskAdded(const ProjectExplorer::Task &task); + virtual void taskAdded(const ProjectExplorer::Task &task, int linkedOutputLines = 0, int skipLines = 0); private: virtual void doFlush(); diff --git a/src/plugins/projectexplorer/ldparser.cpp b/src/plugins/projectexplorer/ldparser.cpp index 696583c47e4..ea3eb618ffd 100644 --- a/src/plugins/projectexplorer/ldparser.cpp +++ b/src/plugins/projectexplorer/ldparser.cpp @@ -71,11 +71,12 @@ void LdParser::stdError(const QString &line) } if (lne.startsWith(QLatin1String("collect2:"))) { - emit addTask(Task(Task::Error, - lne /* description */, - Utils::FileName() /* filename */, - -1 /* linenumber */, - Constants::TASK_CATEGORY_COMPILE)); + Task task = Task(Task::Error, + lne /* description */, + Utils::FileName() /* filename */, + -1 /* linenumber */, + Constants::TASK_CATEGORY_COMPILE); + emit addTask(task, 1); return; } @@ -85,7 +86,7 @@ void LdParser::stdError(const QString &line) Task task(Task::Warning, description, Utils::FileName(), -1, Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } @@ -101,7 +102,7 @@ void LdParser::stdError(const QString &line) } Task task(type, description, Utils::FileName() /* filename */, -1 /* line */, Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } @@ -131,7 +132,7 @@ void LdParser::stdError(const QString &line) description = description.mid(9); } Task task(type, description, filename, lineno, Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } diff --git a/src/plugins/projectexplorer/linuxiccparser.cpp b/src/plugins/projectexplorer/linuxiccparser.cpp index 640ea0cdae3..55d3748072a 100644 --- a/src/plugins/projectexplorer/linuxiccparser.cpp +++ b/src/plugins/projectexplorer/linuxiccparser.cpp @@ -90,6 +90,7 @@ void LinuxIccParser::stdError(const QString &line) m_firstLine.cap(2).toInt(), Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; m_expectFirstLine = false; } else if (!m_expectFirstLine && m_caretLine.indexIn(line) != -1) { // Format the last line as code @@ -106,7 +107,7 @@ void LinuxIccParser::stdError(const QString &line) m_temporary.formats.append(fr2); } else if (!m_expectFirstLine && line.trimmed().isEmpty()) { // last Line m_expectFirstLine = true; - emit addTask(m_temporary); + emit addTask(m_temporary, m_lines); m_temporary = Task(); } else if (!m_expectFirstLine && m_continuationLines.indexIn(line) != -1) { m_temporary.description.append(QLatin1Char('\n')); @@ -114,6 +115,7 @@ void LinuxIccParser::stdError(const QString &line) while (m_indent < line.length() && line.at(m_indent).isSpace()) m_indent++; m_temporary.description.append(m_continuationLines.cap(1).trimmed()); + ++m_lines; } else { IOutputParser::stdError(line); } @@ -125,7 +127,7 @@ void LinuxIccParser::doFlush() return; Task t = m_temporary; m_temporary.clear(); - emit addTask(t); + emit addTask(t, m_lines, 1); } #ifdef WITH_TESTS diff --git a/src/plugins/projectexplorer/linuxiccparser.h b/src/plugins/projectexplorer/linuxiccparser.h index 1414ac38ec1..f160f02e790 100644 --- a/src/plugins/projectexplorer/linuxiccparser.h +++ b/src/plugins/projectexplorer/linuxiccparser.h @@ -58,6 +58,7 @@ private: bool m_expectFirstLine; int m_indent; Task m_temporary; + int m_lines = 0; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp index a472827ed52..1c5037650b9 100644 --- a/src/plugins/projectexplorer/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -30,6 +30,7 @@ #include "msvcparser.h" #include "projectexplorerconstants.h" +#include "buildmanager.h" #include #include @@ -100,6 +101,7 @@ void MsvcParser::stdOutput(const QString &line) } else { m_lastTask.formats[0].length = m_lastTask.description.length() - m_lastTask.formats[0].start; } + ++m_lines; return; } @@ -111,6 +113,7 @@ void MsvcParser::stdOutput(const QString &line) Utils::FileName(), /* fileName */ -1, /* linenumber */ Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; return; } if (line.startsWith(QLatin1String("Warning:"))) { @@ -119,6 +122,7 @@ void MsvcParser::stdOutput(const QString &line) Utils::FileName(), /* fileName */ -1, /* linenumber */ Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; return; } if (match.hasMatch()) { @@ -130,6 +134,7 @@ void MsvcParser::stdOutput(const QString &line) Utils::FileName::fromUserInput(match.captured(2)), /* fileName */ match.captured(3).toInt(), /* linenumber */ Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; return; } IOutputParser::stdOutput(line); @@ -146,6 +151,7 @@ void MsvcParser::stdError(const QString &line) Utils::FileName(), /* fileName */ -1, /* linenumber */ Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; return; } IOutputParser::stdError(line); @@ -167,6 +173,7 @@ bool MsvcParser::processCompileLine(const QString &line) m_lastTask = Task(type, match.captured(4).trimmed() /* description */, position.first, position.second, Constants::TASK_CATEGORY_COMPILE); + m_lines = 1; return true; } return false; @@ -179,7 +186,7 @@ void MsvcParser::doFlush() Task t = m_lastTask; m_lastTask.clear(); - emit addTask(t); + emit addTask(t, m_lines, 1); } // Unit tests: diff --git a/src/plugins/projectexplorer/msvcparser.h b/src/plugins/projectexplorer/msvcparser.h index a00e1bf0975..34795e45d68 100644 --- a/src/plugins/projectexplorer/msvcparser.h +++ b/src/plugins/projectexplorer/msvcparser.h @@ -57,6 +57,7 @@ private: QRegularExpression m_additionalInfoRegExp; Task m_lastTask; + int m_lines = 0; }; } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/outputparser_test.cpp b/src/plugins/projectexplorer/outputparser_test.cpp index bd5112f71a4..f39a67f75d0 100644 --- a/src/plugins/projectexplorer/outputparser_test.cpp +++ b/src/plugins/projectexplorer/outputparser_test.cpp @@ -142,8 +142,10 @@ void OutputParserTester::outputAdded(const QString &line, BuildStep::OutputForma m_receivedOutput.append(line); } -void OutputParserTester::taskAdded(const Task &task) +void OutputParserTester::taskAdded(const Task &task, int linkedLines, int skipLines) { + Q_UNUSED(linkedLines); + Q_UNUSED(skipLines); m_receivedTasks.append(task); } diff --git a/src/plugins/projectexplorer/outputparser_test.h b/src/plugins/projectexplorer/outputparser_test.h index 69d042c4dc4..ffd57e0fb6e 100644 --- a/src/plugins/projectexplorer/outputparser_test.h +++ b/src/plugins/projectexplorer/outputparser_test.h @@ -75,7 +75,7 @@ signals: private slots: void outputAdded(const QString &string, ProjectExplorer::BuildStep::OutputFormat format); - void taskAdded(const ProjectExplorer::Task &task); + void taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skipLines); private: void reset(); diff --git a/src/plugins/projectexplorer/xcodebuildparser.cpp b/src/plugins/projectexplorer/xcodebuildparser.cpp index 0f1fbe4a64d..1dd13d243cd 100644 --- a/src/plugins/projectexplorer/xcodebuildparser.cpp +++ b/src/plugins/projectexplorer/xcodebuildparser.cpp @@ -84,7 +84,7 @@ void XcodebuildParser::stdOutput(const QString &line) Utils::FileName::fromString(m_replacingSignatureRe.cap(1)), /* filename */ -1, /* line */ Constants::TASK_CATEGORY_COMPILE); - taskAdded(task); + taskAdded(task, 1); return; } IOutputParser::stdError(line); diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 5c88e2a70b9..116a625494e 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -322,9 +322,10 @@ void QbsBuildStep::handleProcessResultReport(const qbs::ProcessResult &result) void QbsBuildStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QString &message, const QString &file, int line) { - emit addTask(ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, - ProjectExplorer::Constants::TASK_CATEGORY_COMPILE)); + ProjectExplorer::Task task = ProjectExplorer::Task(type, message, + Utils::FileName::fromString(file), line, + ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); + emit addTask(task, 1); emit addOutput(message, NormalOutput); } diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index a93572130a7..0d4a46d479f 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -39,6 +39,7 @@ #include #include #include +#include #include #include @@ -211,9 +212,10 @@ void QbsCleanStep::handleProgress(int value) void QbsCleanStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QString &message, const QString &file, int line) { - emit addTask(ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, - ProjectExplorer::Constants::TASK_CATEGORY_COMPILE)); + ProjectExplorer::Task task = ProjectExplorer::Task(type, message, + Utils::FileName::fromString(file), line, + ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); + emit addTask(task, 1); emit addOutput(message, NormalOutput); } diff --git a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp index 98712f1a8c7..76aba0fd3b1 100644 --- a/src/plugins/qbsprojectmanager/qbsinstallstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsinstallstep.cpp @@ -222,9 +222,10 @@ void QbsInstallStep::handleProgress(int value) void QbsInstallStep::createTaskAndOutput(ProjectExplorer::Task::TaskType type, const QString &message, const QString &file, int line) { - emit addTask(ProjectExplorer::Task(type, message, - Utils::FileName::fromString(file), line, - ProjectExplorer::Constants::TASK_CATEGORY_COMPILE)); + ProjectExplorer::Task task = ProjectExplorer::Task(type, message, + Utils::FileName::fromString(file), line, + ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); + emit addTask(task, 1); emit addOutput(message, NormalOutput); } diff --git a/src/plugins/qbsprojectmanager/qbsparser.cpp b/src/plugins/qbsprojectmanager/qbsparser.cpp index e9a12ab8942..a5475141f40 100644 --- a/src/plugins/qbsprojectmanager/qbsparser.cpp +++ b/src/plugins/qbsprojectmanager/qbsparser.cpp @@ -50,7 +50,7 @@ void QbsParser::setWorkingDirectory(const QString &workingDirectory) IOutputParser::setWorkingDirectory(workingDirectory); } -void QbsParser::taskAdded(const ProjectExplorer::Task &task) +void QbsParser::taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skipLines) { ProjectExplorer::Task editable(task); @@ -59,7 +59,7 @@ void QbsParser::taskAdded(const ProjectExplorer::Task &task) if (!filePath.isEmpty()) editable.file = Utils::FileName::fromUserInput(m_workingDirectory.absoluteFilePath(filePath)); - IOutputParser::taskAdded(editable); + IOutputParser::taskAdded(editable, linkedLines, skipLines); } } // namespace Internal diff --git a/src/plugins/qbsprojectmanager/qbsparser.h b/src/plugins/qbsprojectmanager/qbsparser.h index 28d49977eec..e4b977237e3 100644 --- a/src/plugins/qbsprojectmanager/qbsparser.h +++ b/src/plugins/qbsprojectmanager/qbsparser.h @@ -50,7 +50,7 @@ public: void setWorkingDirectory(const QString &workingDirectory); public slots: - void taskAdded(const ProjectExplorer::Task &task); + void taskAdded(const ProjectExplorer::Task &task, int linkedLines, int skipLines); private: QDir m_workingDirectory; diff --git a/src/plugins/qmakeprojectmanager/qmakeparser.cpp b/src/plugins/qmakeprojectmanager/qmakeparser.cpp index 93423ac1ee9..c14ae2e525f 100644 --- a/src/plugins/qmakeprojectmanager/qmakeparser.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeparser.cpp @@ -32,6 +32,7 @@ #include #include +#include using namespace QmakeProjectManager; using ProjectExplorer::Task; @@ -47,20 +48,22 @@ void QMakeParser::stdError(const QString &line) QString lne = rightTrimmed(line); if (lne.startsWith(QLatin1String("Project ERROR:"))) { const QString description = lne.mid(15); - emit addTask(Task(Task::Error, - description, - Utils::FileName() /* filename */, - -1 /* linenumber */, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Task task = Task(Task::Error, + description, + Utils::FileName() /* filename */, + -1 /* linenumber */, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + emit addTask(task, 1); return; } if (lne.startsWith(QLatin1String("Project WARNING:"))) { const QString description = lne.mid(17); - emit addTask(Task(Task::Warning, - description, - Utils::FileName() /* filename */, - -1 /* linenumber */, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Task task = Task(Task::Warning, + description, + Utils::FileName() /* filename */, + -1 /* linenumber */, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + emit addTask(task, 1); return; } if (m_error.indexIn(lne) > -1) { @@ -72,11 +75,12 @@ void QMakeParser::stdError(const QString &line) } else if (fileName.startsWith(QLatin1String("ERROR: "))) { fileName = fileName.mid(7); } - emit addTask(Task(type, - m_error.cap(3) /* description */, - Utils::FileName::fromUserInput(fileName), - m_error.cap(2).toInt() /* line */, - Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + Task task = Task(type, + m_error.cap(3) /* description */, + Utils::FileName::fromUserInput(fileName), + m_error.cap(2).toInt() /* line */, + Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); + emit addTask(task, 1); return; } IOutputParser::stdError(line); diff --git a/src/plugins/qnx/blackberryabstractdeploystep.cpp b/src/plugins/qnx/blackberryabstractdeploystep.cpp index c572a09b0b9..05d41eeb6d9 100644 --- a/src/plugins/qnx/blackberryabstractdeploystep.cpp +++ b/src/plugins/qnx/blackberryabstractdeploystep.cpp @@ -188,9 +188,10 @@ void BlackBerryAbstractDeployStep::emitOutputInfo(const ProjectExplorer::Process void BlackBerryAbstractDeployStep::raiseError(const QString &errorMessage) { + ProjectExplorer::Task task = ProjectExplorer::Task(ProjectExplorer::Task::Error, errorMessage, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); emit addOutput(errorMessage, BuildStep::ErrorMessageOutput); - emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error, errorMessage, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT)); } void BlackBerryAbstractDeployStep::processReadyReadStdOutput() diff --git a/src/plugins/qnx/blackberrycheckdevicestatusstep.cpp b/src/plugins/qnx/blackberrycheckdevicestatusstep.cpp index e2faf7e7ed8..4b15dfb4f82 100644 --- a/src/plugins/qnx/blackberrycheckdevicestatusstep.cpp +++ b/src/plugins/qnx/blackberrycheckdevicestatusstep.cpp @@ -238,16 +238,18 @@ ProjectExplorer::BuildStepConfigWidget *BlackBerryCheckDeviceStatusStep::createC void BlackBerryCheckDeviceStatusStep::raiseError(const QString &errorMessage) { + ProjectExplorer::Task task = ProjectExplorer::Task(ProjectExplorer::Task::Error, errorMessage, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); emit addOutput(errorMessage, BuildStep::ErrorMessageOutput); - emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Error, errorMessage, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT)); } void BlackBerryCheckDeviceStatusStep::raiseWarning(const QString &warningMessage) { + ProjectExplorer::Task task = ProjectExplorer::Task(ProjectExplorer::Task::Warning, warningMessage, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); emit addOutput(warningMessage, BuildStep::ErrorOutput); - emit addTask(ProjectExplorer::Task(ProjectExplorer::Task::Warning, warningMessage, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT)); } diff --git a/src/plugins/qnx/blackberryprocessparser.cpp b/src/plugins/qnx/blackberryprocessparser.cpp index fd393c111fb..49a6b2c34bb 100644 --- a/src/plugins/qnx/blackberryprocessparser.cpp +++ b/src/plugins/qnx/blackberryprocessparser.cpp @@ -96,7 +96,7 @@ void BlackBerryProcessParser::parseErrorAndWarningMessage(const QString &line, b Utils::FileName(), -1, Core::Id(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM)); - emit addTask(task); + emit addTask(task, 1); } void BlackBerryProcessParser::parseProgress(const QString &line) diff --git a/src/plugins/qtsupport/qtparser.cpp b/src/plugins/qtsupport/qtparser.cpp index 79b031abe72..7ceb11ac6e4 100644 --- a/src/plugins/qtsupport/qtparser.cpp +++ b/src/plugins/qtsupport/qtparser.cpp @@ -66,7 +66,7 @@ void QtParser::stdError(const QString &line) Utils::FileName::fromUserInput(m_mocRegExp.cap(1)) /* filename */, lineno, ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } if (m_translationRegExp.indexIn(lne) > -1) { @@ -77,7 +77,7 @@ void QtParser::stdError(const QString &line) Utils::FileName::fromUserInput(m_translationRegExp.cap(3)) /* filename */, -1, ProjectExplorer::Constants::TASK_CATEGORY_COMPILE); - emit addTask(task); + emit addTask(task, 1); return; } IOutputParser::stdError(line); diff --git a/src/plugins/remotelinux/abstractpackagingstep.cpp b/src/plugins/remotelinux/abstractpackagingstep.cpp index e41486ed797..c4babae8290 100644 --- a/src/plugins/remotelinux/abstractpackagingstep.cpp +++ b/src/plugins/remotelinux/abstractpackagingstep.cpp @@ -170,16 +170,18 @@ void AbstractPackagingStep::setDeploymentDataModified() void AbstractPackagingStep::raiseError(const QString &errorMessage) { + Task task = Task(Task::Error, errorMessage, Utils::FileName(), -1, + Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task); emit addOutput(errorMessage, BuildStep::ErrorOutput); - emit addTask(Task(Task::Error, errorMessage, Utils::FileName(), -1, - Constants::TASK_CATEGORY_DEPLOYMENT)); } void AbstractPackagingStep::raiseWarning(const QString &warningMessage) { + Task task = Task(Task::Warning, warningMessage, Utils::FileName(), -1, + Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task); emit addOutput(warningMessage, ErrorMessageOutput); - emit addTask(Task(Task::Warning, warningMessage, Utils::FileName(), -1, - Constants::TASK_CATEGORY_DEPLOYMENT)); } } // namespace RemoteLinux diff --git a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp index 2c4365ac80b..c1f4d03e13f 100644 --- a/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp +++ b/src/plugins/remotelinux/abstractremotelinuxdeploystep.cpp @@ -131,17 +131,19 @@ void AbstractRemoteLinuxDeployStep::handleProgressMessage(const QString &message void AbstractRemoteLinuxDeployStep::handleErrorMessage(const QString &message) { + ProjectExplorer::Task task = Task(Task::Error, message, Utils::FileName(), -1, + Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); // TODO correct? emit addOutput(message, ErrorMessageOutput); - emit addTask(Task(Task::Error, message, Utils::FileName(), -1, - Constants::TASK_CATEGORY_DEPLOYMENT)); d->hasError = true; } void AbstractRemoteLinuxDeployStep::handleWarningMessage(const QString &message) { + ProjectExplorer::Task task = Task(Task::Warning, message, Utils::FileName(), -1, + Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); // TODO correct? emit addOutput(message, ErrorMessageOutput); - emit addTask(Task(Task::Warning, message, Utils::FileName(), -1, - Constants::TASK_CATEGORY_DEPLOYMENT)); } void AbstractRemoteLinuxDeployStep::handleFinished() diff --git a/src/plugins/winrt/winrtpackagedeploymentstep.cpp b/src/plugins/winrt/winrtpackagedeploymentstep.cpp index 4d0fca6e9df..c93adbe80e1 100644 --- a/src/plugins/winrt/winrtpackagedeploymentstep.cpp +++ b/src/plugins/winrt/winrtpackagedeploymentstep.cpp @@ -243,16 +243,18 @@ QString WinRtPackageDeploymentStep::defaultWinDeployQtArguments() const void WinRtPackageDeploymentStep::raiseError(const QString &errorMessage) { + ProjectExplorer::Task task = Task(Task::Error, errorMessage, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); emit addOutput(errorMessage, BuildStep::ErrorMessageOutput); - emit addTask(Task(Task::Error, errorMessage, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT)); } void WinRtPackageDeploymentStep::raiseWarning(const QString &warningMessage) { + ProjectExplorer::Task task = Task(Task::Warning, warningMessage, Utils::FileName(), -1, + ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT); + emit addTask(task, 1); emit addOutput(warningMessage, BuildStep::MessageOutput); - emit addTask(Task(Task::Warning, warningMessage, Utils::FileName(), -1, - ProjectExplorer::Constants::TASK_CATEGORY_DEPLOYMENT)); } bool WinRtPackageDeploymentStep::fromMap(const QVariantMap &map)