diff options
author | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-07-29 10:39:27 +0200 |
---|---|---|
committer | Erik Verbruggen <erik.verbruggen@nokia.com> | 2009-07-29 10:39:27 +0200 |
commit | 83e35eb9fbc07af32c8dbff163eec143f4ba7579 (patch) | |
tree | f54166787c53b543351a9b39dd936aad195465ed /src/shared/cplusplus/Parser.cpp | |
parent | 123e2f6349071ad43506d3750741db6c559cff54 (diff) | |
download | qt-creator-83e35eb9fbc07af32c8dbff163eec143f4ba7579.tar.gz |
Another fix for ObjC fast-enum parsing.
Diffstat (limited to 'src/shared/cplusplus/Parser.cpp')
-rw-r--r-- | src/shared/cplusplus/Parser.cpp | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 1a6d5011fb..d0a7b05bcb 100644 --- a/src/shared/cplusplus/Parser.cpp +++ b/src/shared/cplusplus/Parser.cpp @@ -56,7 +56,7 @@ #include <cstdlib> #include <cstring> #include <cassert> - +#include <QDebug> CPLUSPLUS_BEGIN_NAMESPACE Parser::Parser(TranslationUnit *unit) @@ -2189,6 +2189,15 @@ bool Parser::parseForStatement(StatementAST *&node) if (parseTypeSpecifier(ast->type_specifiers)) parseDeclarator(ast->declarator); + if ((ast->type_specifiers || ast->declarator) && !peekAtObjCContextKeyword(Token_in)) { + // woops, probably parsed too much: "in" got parsed as a declarator. Let's redo it: + ast->type_specifiers = 0; + ast->declarator = 0; + + rewind(startOfTypeSpecifier); + parseDeclarator(ast->declarator); + } + if (! ast->type_specifiers || ! ast->declarator) { ast->type_specifiers = 0; ast->declarator = 0; @@ -4635,17 +4644,24 @@ bool Parser::parseObjCTypeQualifiers(unsigned &type_qualifier) return true; } -bool Parser::parseObjCContextKeyword(int kind, unsigned &in_token) +bool Parser::peekAtObjCContextKeyword(int kind) { if (LA() != T_IDENTIFIER) return false; Identifier *id = tok().identifier; const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size()); - if (k != kind) + return k == kind; +} + +bool Parser::parseObjCContextKeyword(int kind, unsigned &in_token) +{ + if (peekAtObjCContextKeyword(kind)) { + in_token = consumeToken(); + return true; + } else { return false; - in_token = consumeToken(); - return true; + } } CPLUSPLUS_END_NAMESPACE |