summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus/Parser.cpp
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2009-07-29 10:39:27 +0200
committerErik Verbruggen <erik.verbruggen@nokia.com>2009-07-29 10:39:27 +0200
commit83e35eb9fbc07af32c8dbff163eec143f4ba7579 (patch)
treef54166787c53b543351a9b39dd936aad195465ed /src/shared/cplusplus/Parser.cpp
parent123e2f6349071ad43506d3750741db6c559cff54 (diff)
downloadqt-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.cpp26
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