TetraIF migration and Unittest Implementation for it

Entire-Checkpoint: 14d1fef0cf36
This commit is contained in:
berrux-dev committed 2026-09-12 13:54:34 +02:00
1 parent a86f9b5bac
commit ba212f9dce
78 files changed
+1611 -640

No files matched your search

@@ -6,6 +6,7 @@
#include <QtCore/QFile>
#include <QtCore/QVector>
#include <QtCore/QStringView>
namespace N_LogView
{
@@ -87,29 +88,29 @@ bool LogViewTetraTelegramsParser::parse(const QString &filename)
const QString content = QString::fromUtf8(f.readAll());
f.close();
const QVector<QStringRef> lines = content.splitRef(QLatin1Char('\n'));
QVector<QStringRef> linesTrimmed;
const QList<QStringView> lines = QStringView(content).split(QLatin1Char('\n'));
QList<QStringView> linesTrimmed;
linesTrimmed.reserve(lines.size());
for (const QStringRef &line : lines)
for (QStringView line : lines)
linesTrimmed += line.trimmed();
int i = 0;
while (i < linesTrimmed.size())
{
const QStringRef &line = linesTrimmed.at(i);
if (line.startsWith(QLatin1String("struct")))
const QStringView line = linesTrimmed.at(i);
if (line.startsWith(QStringLiteral("struct")))
{
i = parseStruct(linesTrimmed, i);
if (i < 0)
return false;
}
else if (line.startsWith(QLatin1String("enum")))
else if (line.startsWith(QStringLiteral("enum")))
{
i = parseEnum(linesTrimmed, i, QString());
if (i < 0)
return false;
}
else if (line.startsWith(QLatin1String("template <> struct Constraints")))
else if (line.startsWith(QStringLiteral("template <> struct Constraints")))
{
i = parseConstraint(linesTrimmed, i);
if (i < 0)
@@ -136,12 +137,12 @@ void LogViewTetraTelegramsParser::insertPod(const QString &type, int byteLen, bo
}
int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, int iStartPos)
int LogViewTetraTelegramsParser::parseStruct(const QList<QStringView> &lines, int iStartPos)
{
const QVector<QStringRef> tokens = tokenize(lines.at(iStartPos));
const QList<QStringView> tokens = tokenize(lines.at(iStartPos));
if (tokens.size() < 2)
return -1;
const QStringRef &structType = tokens.at(1);
const QStringView structType = tokens.at(1);
if (structType.endsWith(QLatin1Char(';')))
return iStartPos;
@@ -149,7 +150,7 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
si.type = structType.toString();
if (tokens.size() > 2)
{
if (tokens.at(2) != QLatin1String(":"))
if (tokens.at(2) != QStringLiteral(":"))
{
WARNING_LOG(m_logger) << "Could not parse struct: '" << lines.at(iStartPos).toString() << "', line: " << iStartPos + 1;
return -1;
@@ -162,10 +163,10 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
WARNING_LOG(m_logger) << "Could not parse struct: '" << lines.at(iStartPos).toString() << "', line: " << iStartPos + 1;
return -1;
}
QStringRef base = tokens.at(i);
if (base == QLatin1String("public") ||
base == QLatin1String("protected") ||
base == QLatin1String("private"))
QStringView base = tokens.at(i);
if (base == QStringLiteral("public") ||
base == QStringLiteral("protected") ||
base == QStringLiteral("private"))
continue;
if (base.endsWith(QLatin1Char(',')))
base.chop(1);
@@ -181,15 +182,15 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
int i = iStartPos + 1;
while (i < lines.size())
{
const QVector<QStringRef> tokens = tokenize(lines.at(i));
const QList<QStringView> tokens = tokenize(lines.at(i));
if (!validStructTokens(tokens))
{
++i;
continue;
}
if (tokens.at(0) == QLatin1String("};"))
if (tokens.at(0) == QStringLiteral("};"))
break;
if (tokens.at(0) == QLatin1String("enum"))
if (tokens.at(0) == QStringLiteral("enum"))
{
i = parseEnum(lines, i, si.type, &si);
if (i < 0)
@@ -201,35 +202,35 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
MemberInformation mi;
if (tokens.size() > 2)
{
const int parserCommentPos = tokens.at(2) == QLatin1String("=") ? 4 : 2;
const int parserCommentPos = tokens.at(2) == QStringLiteral("=") ? 4 : 2;
if (tokens.size() > parserCommentPos)
{
const QStringRef &comment = tokens.at(parserCommentPos);
const QStringView comment = tokens.at(parserCommentPos);
DEBUG_LOG(m_logger) << "comment: " << comment.toString();
if (comment.startsWith(QLatin1String("//@array: ")))
if (comment.startsWith(QStringLiteral("//@array: ")))
{
const QStringRef hint = comment.mid(QLatin1String("//@array: ").size());
QString structStr = QLatin1String("struct ") + si.type + QLatin1String("::") + tokens.at(0).toString() + QLatin1Char('\n') + hint.toString();
structStr.replace(QLatin1Char(';'), QLatin1String(";\n"));
const QStringView hint = comment.mid(QStringLiteral("//@array: ").size());
QString structStr = QStringLiteral("struct ") + si.type + QStringLiteral("::") + tokens.at(0).toString() + QLatin1Char('\n') + hint.toString();
structStr.replace(QLatin1Char(';'), QStringLiteral(";\n"));
DEBUG_LOG(m_logger) << "structStr: " << structStr;
parseStruct(structStr.splitRef(QLatin1Char('\n')), 0);
parseStruct(QStringView(structStr).split(QLatin1Char('\n')), 0);
mi.type = si.type + QLatin1String("::") + tokens.at(0).toString();
mi.type = si.type + QStringLiteral("::") + tokens.at(0).toString();
mi.isArray = true;
}
if (comment == QLatin1String("//@invisible"))
if (comment == QStringLiteral("//@invisible"))
mi.isVisible = false;
}
}
QStringRef name = tokens.at(1);
QStringView name = tokens.at(1);
if (name.endsWith(QLatin1Char(';')))
name.chop(1);
if (mi.type.isEmpty())
mi.type += tokens.at(0).toString();
categorizeMember(mi);
mi.name = name.toString();
if (mi.isEnum && !mi.type.contains(QLatin1String("::")))
if (mi.isEnum && !mi.type.contains(QStringLiteral("::")))
{
for (const auto &ei : std::as_const(m_enums))
@@ -237,7 +238,7 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
if (ei.type == mi.type)
{
if (!ei.ns.isEmpty())
mi.type = ei.ns + QLatin1String("::") + mi.type;
mi.type = ei.ns + QStringLiteral("::") + mi.type;
break;
}
}
@@ -265,13 +266,13 @@ int LogViewTetraTelegramsParser::parseStruct(const QVector<QStringRef> &lines, i
return i;
}
int LogViewTetraTelegramsParser::parseEnum(const QVector<QStringRef> &lines, int iStartPos, const QString &ns, StructInformation *si)
int LogViewTetraTelegramsParser::parseEnum(const QList<QStringView> &lines, int iStartPos, const QString &ns, StructInformation *si)
{
const QVector<QStringRef> tokens = tokenize(lines.at(iStartPos));
const QList<QStringView> tokens = tokenize(lines.at(iStartPos));
if (tokens.size() < 2)
return -1;
QStringRef enumName = tokens.at(1);
if (enumName == QLatin1String("class"))
QStringView enumName = tokens.at(1);
if (enumName == QStringLiteral("class"))
{
if (tokens.size() < 3)
return -1;
@@ -287,19 +288,19 @@ int LogViewTetraTelegramsParser::parseEnum(const QVector<QStringRef> &lines, int
int i = iStartPos + 1;
while (i < lines.size())
{
const QVector<QStringRef> tokens = tokenize(lines.at(i).split(QStringLiteral("//")).first());
const QList<QStringView> tokens = tokenize(lines.at(i).split(QStringLiteral("//")).first());
if (tokens.isEmpty() ||
(tokens.at(0) == QLatin1String("{")))
(tokens.at(0) == QStringLiteral("{")))
{
++i;
continue;
}
if (tokens.at(0) == QLatin1String("};"))
if (tokens.at(0) == QStringLiteral("};"))
break;
if ((tokens.size() != 1 && tokens.size() != 3) ||
(tokens.size() == 3 && tokens.at(1) != QLatin1String("=")))
(tokens.size() == 3 && tokens.at(1) != QStringLiteral("=")))
{
if (tokens.size() == 4 && tokens.at(0) == QLatin1String("}") && tokens.at(3).endsWith(QLatin1Char(';')) && si)
if (tokens.size() == 4 && tokens.at(0) == QStringLiteral("}") && tokens.at(3).endsWith(QLatin1Char(';')) && si)
{
MemberInformation mi;
@@ -320,7 +321,7 @@ int LogViewTetraTelegramsParser::parseEnum(const QVector<QStringRef> &lines, int
ev.key = tokens.at(0).toString();
if (tokens.size() == 3)
{
QStringRef value = tokens.at(2);
QStringView value = tokens.at(2);
if (value.endsWith(QLatin1Char(',')))
value.chop(1);
ev.value = value.toInt();
@@ -338,7 +339,7 @@ int LogViewTetraTelegramsParser::parseEnum(const QVector<QStringRef> &lines, int
for (const EnumValue &ev : std::as_const(ei.values))
DEBUG_LOG(m_logger) << "Member[" << i << "]: " << ev.key << " = " << ev.value;
if (ei.type == QLatin1String("TelegramId"))
if (ei.type == QStringLiteral("TelegramId"))
m_telegramIdEnum = ei;
m_enums.push_back(std::move(ei));
@@ -346,49 +347,49 @@ int LogViewTetraTelegramsParser::parseEnum(const QVector<QStringRef> &lines, int
return i;
}
int LogViewTetraTelegramsParser::parseConstraint(const QVector<QStringRef> &lines, int iStartPos)
int LogViewTetraTelegramsParser::parseConstraint(const QList<QStringView> &lines, int iStartPos)
{
const QVector<QStringRef> tokens = tokenize(lines.at(iStartPos));
const QList<QStringView> tokens = tokenize(lines.at(iStartPos));
if (tokens.size() != 4)
{
WARNING_LOG(m_logger) << "Could not parse constraint: '" << lines.at(iStartPos).toString() << "'";
return -1;
}
const QStringRef &cs = tokens.at(3);
if (!cs.startsWith(QLatin1String("Constraints<")) || !cs.endsWith(QLatin1Char('>')))
const QStringView cs = tokens.at(3);
if (!cs.startsWith(QStringLiteral("Constraints<")) || !cs.endsWith(QLatin1Char('>')))
{
WARNING_LOG(m_logger) << "Could not parse constraint: '" << lines.at(iStartPos).toString() << "'";
return -1;
}
QStringRef structName = cs.mid(QLatin1String("Constraints<").size());
QStringView structName = cs.mid(QStringLiteral("Constraints<").size());
structName.chop(1);
DEBUG_LOG(m_logger) << "Constraint: " << structName.toString();
int i = iStartPos + 1;
while (i < lines.size())
{
const QVector<QStringRef> tokens = tokenize(lines.at(i));
const QList<QStringView> tokens = tokenize(lines.at(i));
if (tokens.isEmpty() ||
(tokens.at(0) == QLatin1String("{")))
(tokens.at(0) == QStringLiteral("{")))
{
++i;
continue;
}
if (tokens.at(0) == QLatin1String("};"))
if (tokens.at(0) == QStringLiteral("};"))
break;
if (tokens.size() != 8 || tokens.at(2) != QLatin1String("TelegramId"))
if (tokens.size() != 8 || tokens.at(2) != QStringLiteral("TelegramId"))
{
++i;
continue;
}
const QVector<QStringRef> parts = tokens.at(6).split(QLatin1String("::"));
const QList<QStringView> parts = tokens.at(6).split(QStringLiteral("::"));
if (parts.size() != 2)
{
WARNING_LOG(m_logger) << "Could not parse constraint: '" << lines.at(i).toString() << "'";
return -1;
}
QStringRef enumKey = parts.at(1);
QStringView enumKey = parts.at(1);
if (enumKey.endsWith(QLatin1Char(';')))
enumKey.chop(1);
bool bFound = false;
@@ -427,14 +428,14 @@ void LogViewTetraTelegramsParser::categorizeMember(MemberInformation &mi) const
{
mi.isPod = isPod(mi.type);
mi.isEnum = mi.isPod ? false : isEnum(mi.type);
if (mi.type.startsWith(QLatin1String("std::vector<")))
if (mi.type.startsWith(QStringLiteral("std::vector<")))
mi.isArray = true;
mi.isStruct = mi.isArray ? false : isStruct(mi.type);
mi.isString = (mi.type == QLatin1String("std::string") || mi.type == QLatin1String("QString"));
mi.isBinary = (mi.type == QLatin1String("std::vector<unsigned char>") || mi.type == QLatin1String("QByteArray"));
mi.isString = (mi.type == QStringLiteral("std::string") || mi.type == QStringLiteral("QString"));
mi.isBinary = (mi.type == QStringLiteral("std::vector<unsigned char>") || mi.type == QStringLiteral("QByteArray"));
}
static inline void bracketCount(const QStringRef &str, int &cntLt, int &cntGt)
static inline void bracketCount(QStringView str, int &cntLt, int &cntGt)
{
cntLt = 0;
cntGt = 0;
@@ -447,20 +448,20 @@ static inline void bracketCount(const QStringRef &str, int &cntLt, int &cntGt)
}
}
QVector<QStringRef> LogViewTetraTelegramsParser::tokenize(const QStringRef &line) const
QList<QStringView> LogViewTetraTelegramsParser::tokenize(QStringView line) const
{
QVector<QStringRef> ret = line.split(QLatin1Char(' '), QString::SkipEmptyParts);
QList<QStringView> ret = line.split(QLatin1Char(' '), Qt::SkipEmptyParts);
int i = 0;
while (i < ret.size())
{
const QStringRef &token = ret.at(i);
if (token.startsWith(QLatin1String("//")))
const QStringView token = ret.at(i);
if (token.startsWith(QStringLiteral("//")))
{
if (i == ret.size() - 1)
break;
const QStringRef &lastToken = ret.last();
const QStringRef newToken = QStringRef(token.string(), token.position(), lastToken.position() - token.position() + lastToken.size());
const QStringView lastToken = ret.last();
const QStringView newToken(token.data(), lastToken.data() - token.data() + lastToken.size());
DEBUG_LOG(m_logger) << "New Token: " << newToken.toString();
ret.resize(i + 1);
ret[i] = newToken;
@@ -476,8 +477,8 @@ QVector<QStringRef> LogViewTetraTelegramsParser::tokenize(const QStringRef &line
++i;
continue;
}
const QStringRef &nextToken = ret.at(i + 1);
const QStringRef newToken = QStringRef(token.string(), token.position(), nextToken.position() - token.position() + nextToken.size());
const QStringView nextToken = ret.at(i + 1);
const QStringView newToken(token.data(), nextToken.data() - token.data() + nextToken.size());
DEBUG_LOG(m_logger) << "New Token: " << newToken.toString();
ret.removeAt(i + 1);
ret[i] = newToken;
@@ -486,21 +487,21 @@ QVector<QStringRef> LogViewTetraTelegramsParser::tokenize(const QStringRef &line
return ret;
}
bool LogViewTetraTelegramsParser::validStructTokens(const QVector<QStringRef> &tokens)
bool LogViewTetraTelegramsParser::validStructTokens(const QList<QStringView> &tokens)
{
if (tokens.isEmpty() ||
(tokens.at(0) == QLatin1String("{")) ||
(tokens.at(0) == QLatin1String("{}")) ||
(tokens.at(0) == QLatin1String("}")) ||
(tokens.at(0) == QLatin1String(":")) ||
(tokens.at(0) == QLatin1String(",")) ||
(tokens.at(0) == QLatin1String("virtual")))
(tokens.at(0) == QStringLiteral("{")) ||
(tokens.at(0) == QStringLiteral("{}")) ||
(tokens.at(0) == QStringLiteral("}")) ||
(tokens.at(0) == QStringLiteral(":")) ||
(tokens.at(0) == QStringLiteral(",")) ||
(tokens.at(0) == QStringLiteral("virtual")))
return false;
if (tokens.at(0) == QLatin1String("};") || tokens.at(0) == QLatin1String("enum"))
if (tokens.at(0) == QStringLiteral("};") || tokens.at(0) == QStringLiteral("enum"))
return true;
const int len = tokens.last().startsWith(QLatin1String("//")) ? tokens.size() - 1 : tokens.size();
const int len = tokens.last().startsWith(QStringLiteral("//")) ? tokens.size() - 1 : tokens.size();
if (len == 2)
return true;
@@ -508,7 +509,7 @@ bool LogViewTetraTelegramsParser::validStructTokens(const QVector<QStringRef> &t
if (len < 4)
return false;
if (len >= 4 && tokens.at(2) == QLatin1String("="))
if (len >= 4 && tokens.at(2) == QStringLiteral("="))
return true;
return false;