moc: Handle include in enum, take 2

The existing logic broke down when we reentered the enumerator parsing
loop, and encountered a INCLUDE_MOC_END token in the first handleInclude
call. Fix this by restarting the loop in that case.
Amends d8a2456fbf18f60e2d1950585d93aa530df077bf.

Fixes: QTBUG-88125
Pick-to: 5.15
Change-Id: I87acaa986a81de53730eddc40bc7d48c15328aba
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
This commit is contained in:
Fabian Kosmale 2020-11-03 11:41:06 +01:00
parent ca85d3370f
commit d3ed7dac8a
2 changed files with 21 additions and 4 deletions

View File

@ -240,6 +240,12 @@ Type Moc::parseType()
return type;
}
enum class IncludeState {
IncludeBegin,
IncludeEnd,
NoInclude,
};
bool Moc::parseEnum(EnumDef *def)
{
bool isTypdefEnum = false; // typedef enum { ... } Foo;
@ -260,18 +266,28 @@ bool Moc::parseEnum(EnumDef *def)
}
if (!test(LBRACE))
return false;
auto handleInclude = [this]() {
if (test(MOC_INCLUDE_BEGIN))
auto handleInclude = [this]() -> IncludeState {
bool hadIncludeBegin = false;
if (test(MOC_INCLUDE_BEGIN)) {
currentFilenames.push(symbol().unquotedLexem());
// we do not return early to handle empty headers in one go
hadIncludeBegin = true;
}
if (test(NOTOKEN)) {
next(MOC_INCLUDE_END);
currentFilenames.pop();
return IncludeState::IncludeEnd;
}
if (hadIncludeBegin)
return IncludeState::IncludeBegin;
else
return IncludeState::NoInclude;
};
do {
if (lookup() == RBRACE) // accept trailing comma
break;
handleInclude();
if ( handleInclude() == IncludeState::IncludeEnd)
continue;
next(IDENTIFIER);
def->values += lexem();
handleInclude();

View File

@ -1 +1,2 @@
parcel
parcel = 42,
part = 12,