From 83e35eb9fbc07af32c8dbff163eec143f4ba7579 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Wed, 29 Jul 2009 10:39:27 +0200 Subject: Another fix for ObjC fast-enum parsing. --- src/shared/cplusplus/Parser.cpp | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) (limited to 'src/shared/cplusplus/Parser.cpp') 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 #include #include - +#include 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 -- cgit v1.2.1