From d3ed7dac8aa2f4ede0c409254b9dd44842086be0 Mon Sep 17 00:00:00 2001 From: Fabian Kosmale Date: Tue, 3 Nov 2020 11:41:06 +0100 Subject: 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 --- src/tools/moc/moc.cpp | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'src/tools/moc/moc.cpp') diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 15c35234c9..494adbda00 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -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(); -- cgit v1.2.3