TetraIF migration and Unittest Implementation for it
Entire-Checkpoint: 14d1fef0cf36
This commit is contained in:
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;
|
||||
|
||||
Reference in new issue
Block a user