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 d8a2456fbf.
Fixes: QTBUG-88125
Pick-to: 5.15
Change-Id: I87acaa986a81de53730eddc40bc7d48c15328aba
Reviewed-by: Lars Knoll <lars.knoll@qt.io>
bb10
parent
ca85d3370f
commit
d3ed7dac8a
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -1 +1,2 @@
|
|||
parcel
|
||||
parcel = 42,
|
||||
part = 12,
|
||||
|
|
|
|||
Loading…
Reference in New Issue