BareMetal: Improve IAR parser code a bit

It is makes sense to move a handing code of each
regexp to the separate method to simplify maintenance.

Change-Id: I59d9c23ec1c1c4dabb8de8eb295353b4df072a33
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Denis Shienkov
2019-10-25 12:00:39 +03:00
parent d6b29a89ec
commit 83c6a4d922
2 changed files with 88 additions and 62 deletions

View File

@@ -101,73 +101,96 @@ void IarParser::amendFilePath()
m_expectFilePath = false;
}
bool IarParser::parseErrorOrFatalErrorDetailsMessage1(const QString &lne)
{
const QRegularExpression re("^(Error|Fatal error)\\[(.+)\\]:\\s(.+)\\s\\[(.+)$");
const QRegularExpressionMatch match = re.match(lne);
if (!match.hasMatch())
return false;
enum CaptureIndex { MessageTypeIndex = 1, MessageCodeIndex,
DescriptionIndex, FilepathBeginIndex };
const Task::TaskType type = taskType(match.captured(MessageTypeIndex));
const QString descr = QString("[%1]: %2").arg(match.captured(MessageCodeIndex),
match.captured(DescriptionIndex));
// This task has a file path, but this patch are split on
// some lines, which will be received later.
const Task task(type, descr, {}, -1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
// Prepare first part of a file path.
QString firstPart = match.captured(FilepathBeginIndex);
firstPart.remove("referenced from ");
m_filePathParts.push_back(firstPart);
m_expectFilePath = true;
m_expectSnippet = false;
return true;
}
bool IarParser::parseErrorOrFatalErrorDetailsMessage2(const QString &lne)
{
const QRegularExpression re("^.*(Error|Fatal 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. The description details
// will be received later on the next lines.
const Task task(type, descr, {}, -1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
m_expectSnippet = true;
m_expectFilePath = false;
m_expectDescription = false;
return true;
}
bool IarParser::parseWarningOrErrorOrFatalErrorDetailsMessage1(const QString &lne)
{
const QRegularExpression re("^\"(.+)\",(\\d+)?\\s+(Warning|Error|Fatal error)\\[(.+)\\].+$");
const QRegularExpressionMatch match = re.match(lne);
if (!match.hasMatch())
return false;
enum CaptureIndex { FilePathIndex = 1, LineNumberIndex,
MessageTypeIndex, MessageCodeIndex };
const Utils::FilePath fileName = Utils::FilePath::fromUserInput(
match.captured(FilePathIndex));
const int lineno = match.captured(LineNumberIndex).toInt();
const Task::TaskType type = taskType(match.captured(MessageTypeIndex));
// A full description will be received later on next lines.
const Task task(type, {}, fileName, lineno, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
const QString firstPart = QString("[%1]: ").arg(match.captured(MessageCodeIndex));
m_descriptionParts.append(firstPart);
m_expectDescription = true;
m_expectSnippet = false;
m_expectFilePath = false;
return true;
}
bool IarParser::parseErrorInCommandLineMessage(const QString &lne)
{
if (!lne.startsWith("Error in command line"))
return false;
const Task task(Task::TaskType::Error, lne.trimmed(), {},
-1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
return true;
}
void IarParser::stdError(const QString &line)
{
IOutputParser::stdError(line);
const QString lne = rightTrimmed(line);
QRegularExpression re;
QRegularExpressionMatch match;
re.setPattern("^(Error|Fatal error)\\[(.+)\\]:\\s(.+)\\s\\[(.+)$");
match = re.match(lne);
if (match.hasMatch()) {
enum CaptureIndex { MessageTypeIndex = 1, MessageCodeIndex,
DescriptionIndex, FilepathBeginIndex };
const Task::TaskType type = taskType(match.captured(MessageTypeIndex));
const QString descr = QString("[%1]: %2").arg(match.captured(MessageCodeIndex),
match.captured(DescriptionIndex));
// This task has a file path, but this patch are split on
// some lines, which will be received later.
const Task task(type, descr, {}, -1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
// Prepare first part of a file path.
QString firstPart = match.captured(FilepathBeginIndex);
firstPart.remove("referenced from ");
m_filePathParts.push_back(firstPart);
m_expectFilePath = true;
m_expectSnippet = false;
if (parseErrorOrFatalErrorDetailsMessage1(lne))
return;
}
re.setPattern("^.*(Error|Fatal error)\\[(.+)\\]:\\s(.+)$");
match = re.match(lne);
if (match.hasMatch()) {
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. The description details
// will be received later on the next lines.
const Task task(type, descr, {}, -1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
m_expectSnippet = true;
m_expectFilePath = false;
m_expectDescription = false;
if (parseErrorOrFatalErrorDetailsMessage2(lne))
return;
}
re.setPattern("^\"(.+)\",(\\d+)?\\s+(Warning|Error|Fatal error)\\[(.+)\\].+$");
match = re.match(lne);
if (match.hasMatch()) {
enum CaptureIndex { FilePathIndex = 1, LineNumberIndex,
MessageTypeIndex, MessageCodeIndex };
const Utils::FilePath fileName = Utils::FilePath::fromUserInput(
match.captured(FilePathIndex));
const int lineno = match.captured(LineNumberIndex).toInt();
const Task::TaskType type = taskType(match.captured(MessageTypeIndex));
// A full description will be received later on next lines.
const Task task(type, {}, fileName, lineno, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
const QString firstPart = QString("[%1]: ").arg(match.captured(MessageCodeIndex));
m_descriptionParts.append(firstPart);
m_expectDescription = true;
m_expectSnippet = false;
m_expectFilePath = false;
if (parseWarningOrErrorOrFatalErrorDetailsMessage1(lne))
return;
}
if (lne.isEmpty()) {
//
@@ -201,12 +224,10 @@ void IarParser::stdOutput(const QString &line)
IOutputParser::stdOutput(line);
const QString lne = rightTrimmed(line);
if (!lne.startsWith("Error in command line"))
if (!parseErrorInCommandLineMessage(lne))
return;
const Task task(Task::TaskType::Error, line.trimmed(), {},
-1, Constants::TASK_CATEGORY_COMPILE);
newTask(task);
doFlush();
}

View File

@@ -46,6 +46,11 @@ private:
void amendDescription();
void amendFilePath();
bool parseErrorOrFatalErrorDetailsMessage1(const QString &lne);
bool parseErrorOrFatalErrorDetailsMessage2(const QString &lne);
bool parseWarningOrErrorOrFatalErrorDetailsMessage1(const QString &lne);
bool parseErrorInCommandLineMessage(const QString &lne);
void stdError(const QString &line) final;
void stdOutput(const QString &line) final;
void doFlush() final;