From e0eead09977fb2829e72485663e6eab8bbe495b4 Mon Sep 17 00:00:00 2001
From: Roberto Raggi <qtc-committer@nokia.com>
Date: Mon, 12 Jan 2009 15:20:24 +0100
Subject: [PATCH] Parse ObjC++ class and category implementations.

---
 shared/cplusplus/Parser.cpp | 37 +++++++++++++++++++++++++++++++++++++
 shared/cplusplus/Parser.h   |  1 +
 2 files changed, 38 insertions(+)

diff --git a/shared/cplusplus/Parser.cpp b/shared/cplusplus/Parser.cpp
index 6901b787e89..407cbc36fd8 100644
--- a/shared/cplusplus/Parser.cpp
+++ b/shared/cplusplus/Parser.cpp
@@ -413,6 +413,9 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
     case T_AT_PROTOCOL:
         return parseObjCProtocol(node);
 
+    case T_AT_IMPLEMENTATION:
+        return parseObjCImplementation(node);
+
     case T_AT_END:
         return parseObjCEnd(node);
 
@@ -3456,6 +3459,40 @@ bool Parser::parseObjCProtocol(DeclarationAST *&,
     return true;
 }
 
+// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER (T_COLON T_IDENTIFIER)?
+//                         objc-class-instance-variables-opt
+// objc-implementation ::= T_AT_IMPLEMENTAION T_IDENTIFIER T_LPAREN T_IDENTIFIER T_RPAREN
+//
+bool Parser::parseObjCImplementation(DeclarationAST *&)
+{
+    if (LA() != T_AT_IMPLEMENTATION)
+        return false;
+
+    consumeToken();
+
+    unsigned identifier_token = 0;
+    match(T_IDENTIFIER, &identifier_token);
+
+    if (LA() == T_LPAREN) {
+        // a category implementation
+        unsigned lparen_token = 0, rparen_token = 0;
+        unsigned category_name_token = 0;
+        match(T_LPAREN, &lparen_token);
+        match(T_IDENTIFIER, &category_name_token);
+        match(T_RPAREN, &rparen_token);
+        return true;
+    }
+
+    // a class implementation
+    if (LA() == T_COLON) {
+        consumeToken();
+        unsigned super_class_name_token = 0;
+        match(T_IDENTIFIER, &super_class_name_token);
+    }
+
+    parseObjClassInstanceVariables();
+    return true;
+}
 
 // objc-protocol-refs ::= T_LESS (T_IDENTIFIER @ T_COMMA) T_GREATER
 //
diff --git a/shared/cplusplus/Parser.h b/shared/cplusplus/Parser.h
index 5132ec5732f..84bf03e74e6 100644
--- a/shared/cplusplus/Parser.h
+++ b/shared/cplusplus/Parser.h
@@ -222,6 +222,7 @@ public:
     bool parseObjCInstanceVariableDeclaration(DeclarationAST *&node);
     bool parseObjCPropertyDeclaration(DeclarationAST *&node,
                                       SpecifierAST *attributes = 0);
+    bool parseObjCImplementation(DeclarationAST *&node);
     bool parseObjCMethodPrototype();
     bool parseObjCPropertyAttribute();
     bool parseObjCTypeName();
-- 
GitLab