diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp index 1a6d5011fb417dcd39b52429f36351cafc69aa32..d0a7b05bcbec271a88b938d21f5453af839a9dbf 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 diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h index 2fc12384f249e2501630861345f6c0cbc6001afe..ec40707613da10f481d046789bbd0a94f75e41c6 100644 --- a/src/shared/cplusplus/Parser.h +++ b/src/shared/cplusplus/Parser.h @@ -244,6 +244,7 @@ public: bool parseObjCSelector(unsigned &selector_token); bool parseObjCKeywordDeclaration(ObjCSelectorArgumentAST *&argument, ObjCMessageArgumentDeclarationAST *&node); bool parseObjCTypeQualifiers(unsigned &type_qualifier); + bool peekAtObjCContextKeyword(int kind); bool parseObjCContextKeyword(int kind, unsigned &in_token); bool lookAtObjCSelector() const;