diff options
author | Denis Shienkov <denis.shienkov@gmail.com> | 2019-10-25 12:20:38 +0300 |
---|---|---|
committer | Denis Shienkov <denis.shienkov@gmail.com> | 2019-10-28 09:43:23 +0000 |
commit | 0a7b9db9b43fc1647a7d7f277c6bebafa9115e5b (patch) | |
tree | 7ed15840f185a96187e2658b4010dc58729d7f0d /src | |
parent | 83c6a4d9220dbd1c34ec38b37139471ab279935c (diff) | |
download | qt-creator-0a7b9db9b43fc1647a7d7f277c6bebafa9115e5b.tar.gz |
BareMetal: Handle missed stdout error generated by IAR linker
Change-Id: I767363697dc56d9314ff6c34605a907807975864
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/plugins/baremetal/iarewparser.cpp | 33 | ||||
-rw-r--r-- | src/plugins/baremetal/iarewparser.h | 1 |
2 files changed, 33 insertions, 1 deletions
diff --git a/src/plugins/baremetal/iarewparser.cpp b/src/plugins/baremetal/iarewparser.cpp index 93e97ac056..039e32aa8d 100644 --- a/src/plugins/baremetal/iarewparser.cpp +++ b/src/plugins/baremetal/iarewparser.cpp @@ -179,6 +179,22 @@ bool IarParser::parseErrorInCommandLineMessage(const QString &lne) return true; } +bool IarParser::parseErrorMessage1(const QString &lne) +{ + const QRegularExpression re("^(Error)\\[(.+)\\]:\\s(.+)$"); + const QRegularExpressionMatch match = re.match(lne); + if (!match.hasMatch()) + return false; + enum CaptureIndex { MessageTypeIndex = 1, MessageCodeIndex, DescriptionIndex }; + const Task::TaskType type = taskType(match.captured(MessageTypeIndex)); + const QString descr = QString("[%1]: %2").arg(match.captured(MessageCodeIndex), + match.captured(DescriptionIndex)); + // This task has not a file path and line number (as it is a linker message) + const Task task(type, descr, {}, -1, Constants::TASK_CATEGORY_COMPILE); + newTask(task); + return true; +} + void IarParser::stdError(const QString &line) { IOutputParser::stdError(line); @@ -225,7 +241,10 @@ void IarParser::stdOutput(const QString &line) const QString lne = rightTrimmed(line); - if (!parseErrorInCommandLineMessage(lne)) + // The call sequence has the meaning! + const bool leastOneParsed = parseErrorInCommandLineMessage(lne) + || parseErrorMessage1(lne); + if (!leastOneParsed) return; doFlush(); @@ -297,6 +316,18 @@ void BareMetalPlugin::testIarOutputParsers_data() categoryCompile)) << QString(); + QTest::newRow("Linker error") + << QString::fromLatin1("Error[e46]: Some error") + << OutputParserTester::STDOUT + << QString::fromLatin1("Error[e46]: Some error\n") + << QString() + << (Tasks() << Task(Task::Error, + QLatin1String("[e46]: Some error"), + Utils::FilePath(), + -1, + categoryCompile)) + << QString(); + // For std error. QTest::newRow("No details warning") << QString::fromLatin1("\"c:\\foo\\main.c\",63 Warning[Pe223]:\n" diff --git a/src/plugins/baremetal/iarewparser.h b/src/plugins/baremetal/iarewparser.h index d3fc2d1454..28cd89960f 100644 --- a/src/plugins/baremetal/iarewparser.h +++ b/src/plugins/baremetal/iarewparser.h @@ -50,6 +50,7 @@ private: bool parseErrorOrFatalErrorDetailsMessage2(const QString &lne); bool parseWarningOrErrorOrFatalErrorDetailsMessage1(const QString &lne); bool parseErrorInCommandLineMessage(const QString &lne); + bool parseErrorMessage1(const QString &lne); void stdError(const QString &line) final; void stdOutput(const QString &line) final; |