enum {
Tok_Eof, Tok_class, Tok_friend, Tok_namespace, Tok_using, Tok_return,
Tok_tr, Tok_trUtf8, Tok_translate, Tok_translateUtf8, Tok_trid,
- Tok_Q_OBJECT, Tok_Q_DECLARE_TR_FUNCTIONS,
+ Tok_Q_OBJECT, Tok_Q_DECLARE_TR_FUNCTIONS, Tok_Access,
Tok_Ident, Tok_Comment, Tok_String, Tok_Arrow, Tok_Colon, Tok_ColonColon,
Tok_Equals, Tok_LeftBracket, Tok_RightBracket,
Tok_LeftBrace, Tok_RightBrace, Tok_LeftParen, Tok_RightParen, Tok_Comma, Tok_Semicolon,
STRING(trUtf8);
STRING(translate);
STRING(using);
+STRING(private);
+STRING(protected);
+STRING(public);
+STRING(slots);
+STRING(signals);
+STRING(Q_SLOTS);
+STRING(Q_SIGNALS);
uint CppParser::getToken()
{
return Tok_translateUtf8;
if (yyWord == strQT_TRANSLATE_NOOP3_UTF8)
return Tok_translateUtf8;
+ if (yyWord == strQ_SLOTS || yyWord == strQ_SIGNALS)
+ return Tok_Access;
break;
case 'T':
// TR() for when all else fails
yyCh = getChar();
}
break;
+ case 'p':
+ if (yyWord == strpublic || yyWord == strprotected || yyWord == strprivate)
+ return Tok_Access;
+ break;
case 'q':
if (yyWord == strqtTrId)
return Tok_trid;
case 's':
if (yyWord == strstruct)
return Tok_class;
+ if (yyWord == strslots || yyWord == strsignals)
+ return Tok_Access;
break;
case 't':
if (yyWord == strtr)
yyTok = getToken();
break;
case Tok_class:
- yyTokColonSeen = false;
/*
Partial support for inlined functions.
*/
}
break;
case Tok_namespace:
- yyTokColonSeen = false;
yyTok = getToken();
if (yyTok == Tok_Ident) {
text = yyWord;
msgid.clear();
extra.clear();
}
- yyTokColonSeen = false;
yyTok = getToken();
break;
+ case Tok_Access:
+ // Eat access specifiers, so their colons are not mistaken for c'tor initializer list starts
+ do {
+ yyTok = getToken();
+ } while (yyTok == Tok_Access); // Multiple specifiers are possible, e.g. "public slots"
+ if (yyTok == Tok_Colon)
+ goto case_default;
+ break;
case Tok_Colon:
- yyTokColonSeen = true;
- // fallthrough
case Tok_Equals:
- if (!prospectiveContext.isEmpty()
- && yyBraceDepth == namespaceDepths.count() && yyParenDepth == 0) {
- pendingContext = prospectiveContext;
- prospectiveContext.clear();
+ if (yyBraceDepth == namespaceDepths.count() && yyParenDepth == 0) {
+ if (!prospectiveContext.isEmpty()) {
+ pendingContext = prospectiveContext;
+ prospectiveContext.clear();
+ }
+ if (yyTok == Tok_Colon)
+ yyTokColonSeen = true;
}
yyTok = getToken();
break;
pendingContext = prospectiveContext;
prospectiveContext.clear();
}
+ yyTokColonSeen = false;
// fallthrough
case Tok_LeftParen:
case Tok_RightParen:
- yyTokColonSeen = false;
yyTok = getToken();
break;
default: