Fix enum comma parsing

This commit is contained in:
GriffinR 2024-08-28 16:13:10 -04:00
parent b1ad6d83f4
commit 5c9a1d4140
2 changed files with 8 additions and 3 deletions

View file

@ -99,8 +99,8 @@ private:
QString createErrorMessage(const QString &message, const QString &expression); QString createErrorMessage(const QString &message, const QString &expression);
struct ParsedDefines { struct ParsedDefines {
QMap<QString,QString> expressions; // Map of all define names->expressions encountered QMap<QString,QString> expressions; // Map of all define names encountered to their expressions
QStringList filteredNames; // Define names matching the search text in the order they were encountered in the file QStringList filteredNames; // List of define names that matched the search text, in the order that they were encountered
}; };
ParsedDefines readCDefines(const QString &filename, const QStringList &filterList, bool useRegex); ParsedDefines readCDefines(const QString &filename, const QStringList &filterList, bool useRegex);
QMap<QString, int> evaluateCDefines(const QString &filename, const QStringList &filterList, bool useRegex); QMap<QString, int> evaluateCDefines(const QString &filename, const QStringList &filterList, bool useRegex);

View file

@ -416,7 +416,11 @@ ParseUtil::ParsedDefines ParseUtil::readCDefines(const QString &filename, const
// Encountered an enum, extract the elements of the enum and give each an appropriate expression // Encountered an enum, extract the elements of the enum and give each an appropriate expression
int baseNum = 0; int baseNum = 0;
QString baseExpression = "0"; QString baseExpression = "0";
static const QRegularExpression re_enumElement("\\b(?<name>\\w+)\\b\\s*=?\\s*(?<expression>.+)?[,\\$]"); // TODO: Ignores terminal element lacking comma
// Note: We lazily consider an enum's expression to be any characters after the assignment up until the first comma or EOL.
// This would be a problem for e.g. NAME = MACRO(a, b), but we're currently unable to parse function-like macros anyway.
// If this changes then the regex below needs to be updated.
static const QRegularExpression re_enumElement("\\b(?<name>\\w+)\\b\\s*=?\\s*(?<expression>[^,]*)");
QRegularExpressionMatchIterator elementIter = re_enumElement.globalMatch(enumBody); QRegularExpressionMatchIterator elementIter = re_enumElement.globalMatch(enumBody);
while (elementIter.hasNext()) { while (elementIter.hasNext()) {
QRegularExpressionMatch elementMatch = elementIter.next(); QRegularExpressionMatch elementMatch = elementIter.next();
@ -462,6 +466,7 @@ QMap<QString, int> ParseUtil::evaluateCDefines(const QString &filename, const QS
filteredValues.insert(name, evaluateDefine(name, expression, &allValues, &defines.expressions)); filteredValues.insert(name, evaluateDefine(name, expression, &allValues, &defines.expressions));
logRecordedErrors(); // Only log errors for defines that Porymap is looking for logRecordedErrors(); // Only log errors for defines that Porymap is looking for
} }
return filteredValues; return filteredValues;
} }