From ca34b0ca1c57a0ec0f8f61ad1b0dd4f8bfc9b554 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Wed, 5 Aug 2009 17:14:08 +0200
Subject: [PATCH] Cleaned the ObjC AST up.

---
 src/shared/cplusplus/AST.cpp              | 128 +++++-----------------
 src/shared/cplusplus/AST.h                | 115 ++++---------------
 src/shared/cplusplus/ASTClone.cpp         |  69 +++---------
 src/shared/cplusplus/ASTVisit.cpp         |  51 ++-------
 src/shared/cplusplus/ASTVisitor.h         |  14 +--
 src/shared/cplusplus/ASTfwd.h             |   7 +-
 src/shared/cplusplus/CheckDeclaration.cpp |  12 +-
 src/shared/cplusplus/CheckDeclaration.h   |   4 +-
 src/shared/cplusplus/Parser.cpp           | 103 ++++++++++-------
 src/shared/cplusplus/Parser.h             |   2 +-
 src/shared/cplusplus/Symbols.cpp          |  36 +-----
 src/shared/cplusplus/Symbols.h            |  24 +---
 src/shared/cplusplus/Type.cpp             |   6 -
 src/shared/cplusplus/Type.h               |   6 -
 src/shared/cplusplus/TypeVisitor.h        |   2 -
 15 files changed, 155 insertions(+), 424 deletions(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 266d49c999a..3f417543dc8 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -1924,14 +1924,14 @@ unsigned IdentifierListAST::lastToken() const
 }
 
 
-unsigned ObjCClassDeclarationAST::firstToken() const
+unsigned ObjCClassForwardDeclarationAST::firstToken() const
 {
     if (attributes)
         return attributes->firstToken();
     return class_token;
 }
 
-unsigned ObjCClassDeclarationAST::lastToken() const
+unsigned ObjCClassForwardDeclarationAST::lastToken() const
 {
     if (semicolon_token)
         return semicolon_token + 1;
@@ -1941,22 +1941,17 @@ unsigned ObjCClassDeclarationAST::lastToken() const
             return it->name->lastToken();
     }
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
     return class_token + 1;
 }
 
-unsigned ObjCProtocolDeclarationAST::firstToken() const
+unsigned ObjCProtocolForwardDeclarationAST::firstToken() const
 {
     if (attributes)
         return attributes->firstToken();
     return protocol_token;
 }
 
-unsigned ObjCProtocolDeclarationAST::lastToken() const
+unsigned ObjCProtocolForwardDeclarationAST::lastToken() const
 {
     if (semicolon_token)
         return semicolon_token + 1;
@@ -1966,69 +1961,52 @@ unsigned ObjCProtocolDeclarationAST::lastToken() const
             return it->name->lastToken();
     }
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
     return protocol_token + 1;
 }
 
-unsigned ObjCClassInterfaceDefinitionAST::firstToken() const
+unsigned ObjCClassDeclarationAST::firstToken() const
 {
     if (attributes)
         return attributes->firstToken();
-    return interface_token;
+
+    if (interface_token)
+        return interface_token;
+    else
+        return implementation_token;
 }
 
-unsigned ObjCClassInterfaceDefinitionAST::lastToken() const
+unsigned ObjCClassDeclarationAST::lastToken() const
 {
     if (end_token)                   return end_token + 1;
     if (member_declarations)         return member_declarations->lastToken();
     if (inst_vars_decl)              return inst_vars_decl->lastToken();
-    if (superclass_identifier_token) return superclass_identifier_token + 1;
+    if (protocol_refs)
+        return protocol_refs->lastToken();
+    if (superclass)
+        return superclass->lastToken();
     if (colon_token)                 return colon_token + 1;
+    if (rparen_token)
+        return rparen_token + 1;
+    if (category_name)
+        return category_name->lastToken();
+    if (lparen_token)
+        return lparen_token + 1;
     if (class_name)                  return class_name->lastToken();
 
-    for (SpecifierAST *it = attributes; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
-    return interface_token + 1;
-}
-
-unsigned ObjCCategoryInterfaceDeclarationAST::firstToken() const
-{
-    if (attributes)
-        return attributes->firstToken();
+    if (interface_token)
+        return interface_token + 1;
     else
-        return interface_token;
+        return implementation_token + 1;
 }
 
-unsigned ObjCCategoryInterfaceDeclarationAST::lastToken() const
-{
-    if (end_token)
-        return end_token + 1;
-
-    if (member_declarations)
-        return member_declarations->lastToken();
-
-    if (rparen_token)              return rparen_token + 1;
-    if (category_identifier_token) return category_identifier_token + 1;
-    if (lparen_token)              return lparen_token + 1;
-    if (class_identifier_token)    return class_identifier_token + 1;
-    return interface_token + 1;
-}
-
-unsigned ObjCProtocolDefinitionAST::firstToken() const
+unsigned ObjCProtocolDeclarationAST::firstToken() const
 {
     if (attributes)
         return attributes->firstToken();
     return protocol_token;
 }
 
-unsigned ObjCProtocolDefinitionAST::lastToken() const
+unsigned ObjCProtocolDeclarationAST::lastToken() const
 {
     if (end_token)
         return end_token + 1;
@@ -2403,60 +2381,6 @@ unsigned ObjCMethodDeclarationAST::lastToken() const
     return method_prototype->lastToken();
 }
 
-unsigned ObjCClassImplementationAST::firstToken() const
-{
-    return implementation_token;
-}
-
-unsigned ObjCClassImplementationAST::lastToken() const
-{
-    if (end_token)
-        return end_token + 1;
-
-    for (DeclarationListAST *it = declarations; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
-    if (inst_vars_decl)
-        return inst_vars_decl->lastToken();
-    if (super_class_identifier)
-        return super_class_identifier + 1;
-    if (colon_token)
-        return colon_token + 1;
-    if (class_identifier)
-        return class_identifier + 1;
-
-    return implementation_token + 1;
-}
-
-unsigned ObjCCategoryImplementationAST::firstToken() const
-{
-    return implementation_token;
-}
-
-unsigned ObjCCategoryImplementationAST::lastToken() const
-{
-    if (end_token)
-        return end_token + 1;
-
-    for (DeclarationListAST *it = declarations; it; it = it->next) {
-        if (! it->next)
-            return it->lastToken();
-    }
-
-    if (rparen_token)
-        return rparen_token + 1;
-    if (category_name_token)
-        return category_name_token + 1;
-    if (lparen_token)
-        return lparen_token + 1;
-    if (class_identifier)
-        return class_identifier + 1;
-
-    return implementation_token + 1;
-}
-
 unsigned ObjCSynthesizedPropertyAST::firstToken() const
 {
     if (property_identifier)
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index f7e483f8818..48e2ea934ca 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -197,9 +197,10 @@ public:
     virtual WhileStatementAST *asWhileStatement() { return 0; }
     virtual IdentifierListAST *asIdentifierList() { return 0; }
 
+    virtual ObjCClassForwardDeclarationAST *asObjCClassForwarDeclaration() { return 0; }
     virtual ObjCClassDeclarationAST *asObjCClassDeclaration() { return 0; }
+    virtual ObjCProtocolForwardDeclarationAST *asObjCProtocolForwardDeclaration() { return 0; }
     virtual ObjCProtocolDeclarationAST *asObjCProtocolDeclaration() { return 0; }
-    virtual ObjCProtocolDefinitionAST *asObjCProtocolDefinition() { return 0; }
     virtual ObjCProtocolRefsAST *asObjCProtocolRefs() { return 0; }
     virtual ObjCMessageArgumentAST *asObjCMessageArgument() { return 0; }
     virtual ObjCMessageArgumentListAST *asObjCMessageArgumentList() { return 0; }
@@ -222,8 +223,6 @@ public:
     virtual ObjCMessageArgumentDeclarationListAST *asObjCMessageArgumentDeclarationList() { return 0; }
     virtual ObjCMethodPrototypeAST *asObjCMethodPrototype() { return 0; }
     virtual ObjCMethodDeclarationAST *asObjCMethodDeclaration() { return 0; }
-    virtual ObjCClassImplementationAST *asObjCClassImplementation() { return 0; }
-    virtual ObjCCategoryImplementationAST *asObjCCategoryImplementation() { return 0; }
     virtual ObjCSynthesizedPropertyAST *asObjCSynthesizedProperty() { return 0; }
     virtual ObjCSynthesizedPropertyListAST *asObjCSynthesizedPropertyList() { return 0; }
     virtual ObjCSynthesizedPropertiesDeclarationAST *asObjCSynthesizedPropertiesDeclaration() { return 0; }
@@ -2474,7 +2473,7 @@ protected:
 class CPLUSPLUS_EXPORT IdentifierListAST: public AST
 {
 public:
-    SimpleNameAST *name;
+    NameAST *name;
     unsigned comma_token;
     IdentifierListAST *next;
 
@@ -2491,7 +2490,7 @@ protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST
+class CPLUSPLUS_EXPORT ObjCClassForwardDeclarationAST: public DeclarationAST
 {
 public:
     SpecifierAST *attributes;
@@ -2503,26 +2502,30 @@ public: // annotations
     List<ObjCForwardClassDeclaration *> *symbols;
 
 public:
-    virtual ObjCClassDeclarationAST *asObjCClassDeclaration()
+    virtual ObjCClassForwardDeclarationAST *asObjCClassForwardDeclaration()
     { return this; }
 
     virtual unsigned firstToken() const;
     virtual unsigned lastToken() const;
 
-    virtual ObjCClassDeclarationAST *clone(MemoryPool *pool) const;
+    virtual ObjCClassForwardDeclarationAST *clone(MemoryPool *pool) const;
 
 protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCClassInterfaceDefinitionAST: public DeclarationAST
+class CPLUSPLUS_EXPORT ObjCClassDeclarationAST: public DeclarationAST
 {
 public:
     SpecifierAST *attributes;
     unsigned interface_token;
-    SimpleNameAST *class_name;
+    unsigned implementation_token;
+    NameAST *class_name;
+    unsigned lparen_token;
+    NameAST *category_name;
+    unsigned rparen_token;
     unsigned colon_token;
-    unsigned superclass_identifier_token;
+    NameAST *superclass;
     ObjCProtocolRefsAST *protocol_refs;
     ObjCInstanceVariablesDeclarationAST *inst_vars_decl;
     DeclarationListAST *member_declarations;
@@ -2532,45 +2535,19 @@ public: // annotations
     ObjCClass *symbol;
 
 public:
-    virtual ObjCClassInterfaceDefinitionAST *asObjCClassInterfaceDefinition()
-    { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-    virtual ObjCClassInterfaceDefinitionAST *clone(MemoryPool *pool) const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-};
-
-class CPLUSPLUS_EXPORT ObjCCategoryInterfaceDeclarationAST: public DeclarationAST
-{
-public:
-    SpecifierAST *attributes;
-    unsigned interface_token;
-    unsigned class_identifier_token;
-    unsigned lparen_token;
-    unsigned category_identifier_token;
-    unsigned rparen_token;
-    ObjCProtocolRefsAST *protocol_refs;
-    DeclarationListAST *member_declarations;
-    unsigned end_token;
-
-public:
-    virtual ObjCCategoryInterfaceDeclarationAST *asObjCCategoryInterfaceDeclaration()
+    virtual ObjCClassDeclarationAST *asObjCClassDeclaration()
     { return this; }
 
     virtual unsigned firstToken() const;
     virtual unsigned lastToken() const;
 
-    virtual ObjCCategoryInterfaceDeclarationAST *clone(MemoryPool *pool) const;
+    virtual ObjCClassDeclarationAST *clone(MemoryPool *pool) const;
 
 protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCProtocolDeclarationAST: public DeclarationAST
+class CPLUSPLUS_EXPORT ObjCProtocolForwardDeclarationAST: public DeclarationAST
 {
 public:
     SpecifierAST *attributes;
@@ -2582,24 +2559,24 @@ public: // annotations
     List<ObjCForwardProtocolDeclaration *> *symbols;
 
 public:
-    virtual ObjCProtocolDeclarationAST *asObjCProtocolDeclaration()
+    virtual ObjCProtocolForwardDeclarationAST *asObjCProtocolForwardDeclaration()
     { return this; }
 
     virtual unsigned firstToken() const;
     virtual unsigned lastToken() const;
 
-    virtual ObjCProtocolDeclarationAST *clone(MemoryPool *pool) const;
+    virtual ObjCProtocolForwardDeclarationAST *clone(MemoryPool *pool) const;
 
 protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCProtocolDefinitionAST: public DeclarationAST
+class CPLUSPLUS_EXPORT ObjCProtocolDeclarationAST: public DeclarationAST
 {
 public:
     SpecifierAST *attributes;
     unsigned protocol_token;
-    SimpleNameAST *name;
+    NameAST *name;
     ObjCProtocolRefsAST *protocol_refs;
     DeclarationListAST *member_declarations;
     unsigned end_token;
@@ -2608,13 +2585,13 @@ public: // annotations
     ObjCProtocol *symbol;
 
 public:
-    virtual ObjCProtocolDefinitionAST *asObjCProtocolDefinition()
+    virtual ObjCProtocolDeclarationAST *asObjCProtocolDeclaration()
     { return this; }
 
     virtual unsigned firstToken() const;
     virtual unsigned lastToken() const;
 
-    virtual ObjCProtocolDefinitionAST *clone(MemoryPool *pool) const;
+    virtual ObjCProtocolDeclarationAST *clone(MemoryPool *pool) const;
 
 protected:
     virtual void accept0(ASTVisitor *visitor);
@@ -3055,54 +3032,6 @@ protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
-class CPLUSPLUS_EXPORT ObjCClassImplementationAST: public DeclarationAST
-{
-public:
-    unsigned implementation_token;
-    unsigned class_identifier;
-    unsigned colon_token;
-    unsigned super_class_identifier;
-    ObjCInstanceVariablesDeclarationAST *inst_vars_decl;
-    DeclarationListAST *declarations;
-    unsigned end_token;
-
-public:
-    virtual ObjCClassImplementationAST *asObjCClassImplementation()
-    { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-    virtual ObjCClassImplementationAST *clone(MemoryPool *pool) const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-};
-
-class CPLUSPLUS_EXPORT ObjCCategoryImplementationAST: public DeclarationAST
-{
-public:
-    unsigned implementation_token;
-    unsigned class_identifier;
-    unsigned lparen_token;
-    unsigned category_name_token;
-    unsigned rparen_token;
-    DeclarationListAST *declarations;
-    unsigned end_token;
-
-public:
-    virtual ObjCCategoryImplementationAST *asObjCCategoryImplementation()
-    { return this; }
-
-    virtual unsigned firstToken() const;
-    virtual unsigned lastToken() const;
-
-    virtual ObjCCategoryImplementationAST *clone(MemoryPool *pool) const;
-
-protected:
-    virtual void accept0(ASTVisitor *visitor);
-};
-
 class CPLUSPLUS_EXPORT ObjCSynthesizedPropertyAST: public AST
 {
 public:
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index de0be8287da..0bc5caa9ee4 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -1213,11 +1213,11 @@ IdentifierListAST *IdentifierListAST::clone(MemoryPool *pool) const
     return ast;
 }
 
-ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
+ObjCClassForwardDeclarationAST *ObjCClassForwardDeclarationAST::clone(MemoryPool *pool) const
 {
-    ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
+    ObjCClassForwardDeclarationAST *ast = new (pool) ObjCClassForwardDeclarationAST;
     // copy DeclarationAST
-    // copy ObjCClassDeclarationAST
+    // copy ObjCClassForwardDeclarationAST
     if (attributes) ast->attributes = attributes->clone(pool);
     ast->class_token = class_token;
     if (identifier_list) ast->identifier_list = identifier_list->clone(pool);
@@ -1225,16 +1225,20 @@ ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
     return ast;
 }
 
-ObjCClassInterfaceDefinitionAST *ObjCClassInterfaceDefinitionAST::clone(MemoryPool *pool) const
+ObjCClassDeclarationAST *ObjCClassDeclarationAST::clone(MemoryPool *pool) const
 {
-    ObjCClassInterfaceDefinitionAST *ast = new (pool) ObjCClassInterfaceDefinitionAST;
+    ObjCClassDeclarationAST *ast = new (pool) ObjCClassDeclarationAST;
     // copy DeclarationAST
-    // copy ObjCClassInterfaceDeclarationAST
+    // copy ObjCClassDeclarationAST
     if (attributes) ast->attributes = attributes->clone(pool);
     ast->interface_token = interface_token;
+    ast->implementation_token = implementation_token;
     if (class_name) ast->class_name = class_name->clone(pool);
+    ast->lparen_token = lparen_token;
+    if (category_name) ast->category_name = category_name->clone(pool);
+    ast->rparen_token = rparen_token;
     ast->colon_token = colon_token;
-    ast->superclass_identifier_token = superclass_identifier_token;
+    if (superclass) ast->superclass = superclass->clone(pool);
     if (protocol_refs) ast->protocol_refs = protocol_refs->clone(pool);
     if (inst_vars_decl) ast->inst_vars_decl = inst_vars_decl->clone(pool);
     if (member_declarations) ast->member_declarations = member_declarations->clone(pool);
@@ -1242,26 +1246,9 @@ ObjCClassInterfaceDefinitionAST *ObjCClassInterfaceDefinitionAST::clone(MemoryPo
     return ast;
 }
 
-ObjCCategoryInterfaceDeclarationAST *ObjCCategoryInterfaceDeclarationAST::clone(MemoryPool *pool) const
+ObjCProtocolForwardDeclarationAST *ObjCProtocolForwardDeclarationAST::clone(MemoryPool *pool) const
 {
-    ObjCCategoryInterfaceDeclarationAST *ast = new (pool) ObjCCategoryInterfaceDeclarationAST;
-    // copy DeclarationAST
-    // copy ObjCCategoryInterfaceDeclarationAST
-    if (attributes) ast->attributes = attributes->clone(pool);
-    ast->interface_token = interface_token;
-    ast->class_identifier_token = class_identifier_token;
-    if (protocol_refs) ast->protocol_refs = protocol_refs->clone(pool);
-    ast->lparen_token = lparen_token;
-    ast->category_identifier_token = category_identifier_token;
-    ast->rparen_token = rparen_token;
-    if (member_declarations) ast->member_declarations = member_declarations->clone(pool);
-    ast->end_token = end_token;
-    return ast;
-}
-
-ObjCProtocolDeclarationAST *ObjCProtocolDeclarationAST::clone(MemoryPool *pool) const
-{
-    ObjCProtocolDeclarationAST *ast = new (pool) ObjCProtocolDeclarationAST;
+    ObjCProtocolForwardDeclarationAST *ast = new (pool) ObjCProtocolForwardDeclarationAST;
     if (attributes) ast->attributes = attributes->clone(pool);
     ast->protocol_token = protocol_token;
     if (identifier_list) ast->identifier_list = identifier_list;
@@ -1269,9 +1256,9 @@ ObjCProtocolDeclarationAST *ObjCProtocolDeclarationAST::clone(MemoryPool *pool)
     return ast;
 }
 
-ObjCProtocolDefinitionAST *ObjCProtocolDefinitionAST::clone(MemoryPool *pool) const
+ObjCProtocolDeclarationAST *ObjCProtocolDeclarationAST::clone(MemoryPool *pool) const
 {
-    ObjCProtocolDefinitionAST *ast = new (pool) ObjCProtocolDefinitionAST;
+    ObjCProtocolDeclarationAST *ast = new (pool) ObjCProtocolDeclarationAST;
     if (attributes) ast->attributes = attributes->clone(pool);
     ast->protocol_token = protocol_token;
     if (name) ast->name = name->clone(pool);
@@ -1466,32 +1453,6 @@ ObjCMethodDeclarationAST *ObjCMethodDeclarationAST::clone(MemoryPool *pool) cons
     return ast;
 }
 
-ObjCClassImplementationAST *ObjCClassImplementationAST::clone(MemoryPool *pool) const
-{
-    ObjCClassImplementationAST *ast = new (pool) ObjCClassImplementationAST;
-    ast->implementation_token = implementation_token;
-    ast->class_identifier = class_identifier;
-    ast->colon_token = colon_token;
-    ast->super_class_identifier = super_class_identifier;
-    if (inst_vars_decl) ast->inst_vars_decl = inst_vars_decl->clone(pool);
-    if (declarations) ast->declarations = declarations->clone(pool);
-    ast->end_token = end_token;
-    return ast;
-}
-
-ObjCCategoryImplementationAST *ObjCCategoryImplementationAST::clone(MemoryPool *pool) const
-{
-    ObjCCategoryImplementationAST *ast = new (pool) ObjCCategoryImplementationAST;
-    ast->implementation_token = implementation_token;
-    ast->class_identifier = class_identifier;
-    ast->lparen_token = lparen_token;
-    ast->category_name_token = category_name_token;
-    ast->rparen_token = rparen_token;
-    if (declarations) ast->declarations = declarations->clone(pool);
-    ast->end_token = end_token;
-    return ast;
-}
-
 ObjCSynthesizedPropertyAST *ObjCSynthesizedPropertyAST::clone(MemoryPool *pool) const
 {
     ObjCSynthesizedPropertyAST *ast = new (pool) ObjCSynthesizedPropertyAST;
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 2d4b4c2cc2b..67fa442b275 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -1127,10 +1127,10 @@ void IdentifierListAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
+void ObjCClassForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCClassDeclarationAST
+        // visit ObjCClassForwardDeclarationAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         for (IdentifierListAST *it = identifier_list; it; it = it->next)
@@ -1140,13 +1140,15 @@ void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCClassInterfaceDefinitionAST::accept0(ASTVisitor *visitor)
+void ObjCClassDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         // visit ObjCClassInterfaceDefinitionAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(class_name, visitor);
+        accept(category_name, visitor);
+        accept(superclass, visitor);
         accept(protocol_refs, visitor);
         accept(inst_vars_decl, visitor);
         for (DeclarationListAST *it = member_declarations; it; it = it->next)
@@ -1156,21 +1158,7 @@ void ObjCClassInterfaceDefinitionAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCCategoryInterfaceDeclarationAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        // visit ObjCCategoryInterfaceDeclarationAST
-        for (SpecifierAST *it = attributes; it; it = it->next)
-            accept(it, visitor);
-        accept(protocol_refs, visitor);
-        for (DeclarationListAST *it = member_declarations; it; it = it->next)
-            accept(it, visitor);
-        // visit DeclarationAST
-    }
-    visitor->endVisit(this);
-}
-
-void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
+void ObjCProtocolForwardDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
         // visit ObjCProtocolDeclarationAST
@@ -1183,10 +1171,10 @@ void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCProtocolDefinitionAST::accept0(ASTVisitor *visitor)
+void ObjCProtocolDeclarationAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
-        // visit ObjCProtocolDefinitionAST
+        // visit ObjCProtocolDeclarationAST
         for (SpecifierAST *it = attributes; it; it = it->next)
             accept(it, visitor);
         accept(name, visitor);
@@ -1412,29 +1400,6 @@ void ObjCMethodDeclarationAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
-void ObjCClassImplementationAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        // visit ObjCClassImplementationAST
-        accept(inst_vars_decl, visitor);
-        for (DeclarationListAST *it = declarations; it; it = it->next)
-            accept(it, visitor);
-        // visit DeclarationAST
-    }
-    visitor->endVisit(this);
-}
-
-void ObjCCategoryImplementationAST::accept0(ASTVisitor *visitor)
-{
-    if (visitor->visit(this)) {
-        // visit ObjCCategoryImplementationAST
-        for (DeclarationListAST *it = declarations; it; it = it->next)
-            accept(it, visitor);
-        // visit DeclarationAST
-    }
-    visitor->endVisit(this);
-}
-
 void ObjCSynthesizedPropertyAST::accept0(ASTVisitor *visitor)
 {
     if (visitor->visit(this)) {
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 661874cc073..031eca036c2 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -198,10 +198,9 @@ public:
     // ObjC++
     virtual bool visit(IdentifierListAST *) { return true; }
     virtual bool visit(ObjCClassDeclarationAST *) { return true; }
-    virtual bool visit(ObjCClassInterfaceDefinitionAST *) { return true; }
-    virtual bool visit(ObjCCategoryInterfaceDeclarationAST *) { return true; }
+    virtual bool visit(ObjCClassForwardDeclarationAST *) { return true; }
     virtual bool visit(ObjCProtocolDeclarationAST *) { return true; }
-    virtual bool visit(ObjCProtocolDefinitionAST *) { return true; }
+    virtual bool visit(ObjCProtocolForwardDeclarationAST *) { return true; }
     virtual bool visit(ObjCProtocolRefsAST *) { return true; }
     virtual bool visit(ObjCMessageExpressionAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentListAST *) { return true; }
@@ -223,8 +222,6 @@ public:
     virtual bool visit(ObjCMethodDeclarationAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentDeclarationListAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentDeclarationAST *) { return true; }
-    virtual bool visit(ObjCClassImplementationAST *) { return true; }
-    virtual bool visit(ObjCCategoryImplementationAST *) { return true; }
     virtual bool visit(ObjCSynthesizedPropertyAST *) { return true; }
     virtual bool visit(ObjCSynthesizedPropertyListAST *) { return true; }
     virtual bool visit(ObjCSynthesizedPropertiesDeclarationAST *) { return true; }
@@ -339,10 +336,9 @@ public:
     // ObjC++
     virtual void endVisit(IdentifierListAST *) { }
     virtual void endVisit(ObjCClassDeclarationAST *) { }
-    virtual void endVisit(ObjCClassInterfaceDefinitionAST *) { }
-    virtual void endVisit(ObjCCategoryInterfaceDeclarationAST *) { }
+    virtual void endVisit(ObjCClassForwardDeclarationAST *) { }
     virtual void endVisit(ObjCProtocolDeclarationAST *) { }
-    virtual void endVisit(ObjCProtocolDefinitionAST *) { }
+    virtual void endVisit(ObjCProtocolForwardDeclarationAST *) { }
     virtual void endVisit(ObjCProtocolRefsAST *) { }
     virtual void endVisit(ObjCMessageExpressionAST *) { }
     virtual void endVisit(ObjCMessageArgumentListAST *) { }
@@ -364,8 +360,6 @@ public:
     virtual void endVisit(ObjCMethodDeclarationAST *) { }
     virtual void endVisit(ObjCMessageArgumentDeclarationListAST *) { }
     virtual void endVisit(ObjCMessageArgumentDeclarationAST *) { }
-    virtual void endVisit(ObjCClassImplementationAST *) { }
-    virtual void endVisit(ObjCCategoryImplementationAST *) { }
     virtual void endVisit(ObjCSynthesizedPropertyAST *) { }
     virtual void endVisit(ObjCSynthesizedPropertyListAST *) { }
     virtual void endVisit(ObjCSynthesizedPropertiesDeclarationAST *) { }
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index c336650dae1..b661f1b7d47 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -170,11 +170,10 @@ class QtMethodAST;
 
 // ObjC++
 class IdentifierListAST;
+class ObjCClassForwardDeclarationAST;
 class ObjCClassDeclarationAST;
+class ObjCProtocolForwardDeclarationAST;
 class ObjCProtocolDeclarationAST;
-class ObjCProtocolDefinitionAST;
-class ObjCClassInterfaceDefinitionAST;
-class ObjCCategoryInterfaceDeclarationAST;
 class ObjCProtocolRefsAST;
 class ObjCMessageExpressionAST;
 class ObjCMessageArgumentListAST;
@@ -197,8 +196,6 @@ class ObjCMethodPrototypeAST;
 class ObjCMethodDeclarationAST;
 class ObjCMessageArgumentDeclarationListAST;
 class ObjCMessageArgumentDeclarationAST;
-class ObjCCategoryImplementationAST;
-class ObjCClassImplementationAST;
 class ObjCSynthesizedPropertyAST;
 class ObjCSynthesizedPropertyListAST;
 class ObjCSynthesizedPropertiesDeclarationAST;
diff --git a/src/shared/cplusplus/CheckDeclaration.cpp b/src/shared/cplusplus/CheckDeclaration.cpp
index f82394548c4..95439730554 100644
--- a/src/shared/cplusplus/CheckDeclaration.cpp
+++ b/src/shared/cplusplus/CheckDeclaration.cpp
@@ -464,7 +464,7 @@ bool CheckDeclaration::visit(UsingDirectiveAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
+bool CheckDeclaration::visit(ObjCProtocolForwardDeclarationAST *ast)
 {
     const unsigned sourceLocation = ast->firstToken();
 
@@ -491,7 +491,7 @@ bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(ObjCProtocolDefinitionAST *ast)
+bool CheckDeclaration::visit(ObjCProtocolDeclarationAST *ast)
 {
     unsigned sourceLocation;
     if (ast->name)
@@ -511,7 +511,7 @@ bool CheckDeclaration::visit(ObjCProtocolDefinitionAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
+bool CheckDeclaration::visit(ObjCClassForwardDeclarationAST *ast)
 {
     const unsigned sourceLocation = ast->firstToken();
 
@@ -538,7 +538,7 @@ bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
     return false;
 }
 
-bool CheckDeclaration::visit(ObjCClassInterfaceDefinitionAST *ast)
+bool CheckDeclaration::visit(ObjCClassDeclarationAST *ast)
 {
     unsigned sourceLocation;
     if (ast->class_name)
@@ -552,7 +552,7 @@ bool CheckDeclaration::visit(ObjCClassInterfaceDefinitionAST *ast)
     klass->setEndOffset(tokenAt(ast->lastToken()).offset);
     ast->symbol = klass;
 
-    // TODO: walk super-class, and protocols (EV)
+    // TODO: walk category name, super-class, and protocols (EV)
     _scope->enterSymbol(klass);
 
     int previousObjCVisibility = semantic()->switchObjCVisibility(Function::Protected);
@@ -563,6 +563,8 @@ bool CheckDeclaration::visit(ObjCClassInterfaceDefinitionAST *ast)
         }
     }
 
+    (void) semantic()->switchObjCVisibility(Function::Public);
+
     for (DeclarationListAST *it = ast->member_declarations; it; it = it->next) {
         semantic()->check(it->declaration, klass->members());
     }
diff --git a/src/shared/cplusplus/CheckDeclaration.h b/src/shared/cplusplus/CheckDeclaration.h
index 97c4d5ff449..7e47be11034 100644
--- a/src/shared/cplusplus/CheckDeclaration.h
+++ b/src/shared/cplusplus/CheckDeclaration.h
@@ -92,9 +92,9 @@ protected:
     virtual bool visit(UsingDirectiveAST *ast);
 
     virtual bool visit(ObjCProtocolDeclarationAST *ast);
-    virtual bool visit(ObjCProtocolDefinitionAST *ast);
+    virtual bool visit(ObjCProtocolForwardDeclarationAST *ast);
     virtual bool visit(ObjCClassDeclarationAST *ast);
-    virtual bool visit(ObjCClassInterfaceDefinitionAST *ast);
+    virtual bool visit(ObjCClassForwardDeclarationAST *ast);
     virtual bool visit(ObjCMethodDeclarationAST *ast);
     virtual bool visit(ObjCVisibilityDeclarationAST *ast);
 
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ee65f2c0090..ea8b0f98e82 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -414,7 +414,7 @@ bool Parser::parseDeclaration(DeclarationAST *&node)
 
     // ObjcC++
     case T_AT_CLASS:
-        return parseObjCClassDeclaration(node);
+        return parseObjCClassForwardDeclaration(node);
 
     case T_AT_INTERFACE:
         return parseObjCInterface(node);
@@ -3971,20 +3971,21 @@ bool Parser::lookAtObjCSelector() const
 
 // objc-class-declaraton ::= T_AT_CLASS (T_IDENTIFIER @ T_COMMA) T_SEMICOLON
 //
-bool Parser::parseObjCClassDeclaration(DeclarationAST *&node)
+bool Parser::parseObjCClassForwardDeclaration(DeclarationAST *&node)
 {
     if (LA() != T_AT_CLASS)
         return false;
 
-    ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
+    ObjCClassForwardDeclarationAST *ast = new (_pool) ObjCClassForwardDeclarationAST;
 
     ast->class_token = consumeToken();
     unsigned identifier_token = 0;
     match(T_IDENTIFIER, &identifier_token);
 
     ast->identifier_list = new (_pool) IdentifierListAST;
-    ast->identifier_list->name = new (_pool) SimpleNameAST;
-    ast->identifier_list->name->identifier_token = identifier_token;
+    SimpleNameAST *name = new (_pool) SimpleNameAST;
+    name->identifier_token = identifier_token;
+    ast->identifier_list->name = name;
     IdentifierListAST **nextId = &(ast->identifier_list->next);
 
     while (LA() == T_COMMA) {
@@ -3993,8 +3994,9 @@ bool Parser::parseObjCClassDeclaration(DeclarationAST *&node)
 
         *nextId = new (_pool) IdentifierListAST;
         (*nextId)->comma_token = comma_token;
-        (*nextId)->name = new (_pool) SimpleNameAST;
-        (*nextId)->name->identifier_token = identifier_token;
+        name = new (_pool) SimpleNameAST;
+        name->identifier_token = identifier_token;
+        (*nextId)->name = name;
         nextId = &((*nextId)->next);
     }
 
@@ -4041,14 +4043,19 @@ bool Parser::parseObjCInterface(DeclarationAST *&node,
             _translationUnit->error(attributes->firstToken(),
                                     "invalid attributes for category interface declaration");
 
-        ObjCCategoryInterfaceDeclarationAST *ast = new (_pool) ObjCCategoryInterfaceDeclarationAST;
+        ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
         ast->attributes = attributes;
         ast->interface_token = objc_interface_token;
-        ast->class_identifier_token = identifier_token;
+        SimpleNameAST *class_name = new (_pool) SimpleNameAST;
+        class_name->identifier_token= identifier_token;
+        ast->class_name = class_name;
 
         match(T_LPAREN, &(ast->lparen_token));
-        if (LA() == T_IDENTIFIER)
-            ast->category_identifier_token = consumeToken();
+        if (LA() == T_IDENTIFIER) {
+            SimpleNameAST *category_name = new (_pool) SimpleNameAST;
+            category_name->identifier_token = consumeToken();
+            ast->category_name = category_name;
+        }
 
         match(T_RPAREN, &(ast->rparen_token));
 
@@ -4068,15 +4075,18 @@ bool Parser::parseObjCInterface(DeclarationAST *&node,
         return true;
     } else {
         // a class interface declaration
-        ObjCClassInterfaceDefinitionAST *ast = new (_pool) ObjCClassInterfaceDefinitionAST;
+        ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
         ast->attributes = attributes;
         ast->interface_token = objc_interface_token;
-        ast->class_name = new (_pool) SimpleNameAST;
-        ast->class_name->identifier_token = identifier_token;
+        SimpleNameAST* class_name = new (_pool) SimpleNameAST;
+        class_name->identifier_token = identifier_token;
+        ast->class_name = class_name;
 
         if (LA() == T_COLON) {
             ast->colon_token = consumeToken();
-            match(T_IDENTIFIER, &(ast->superclass_identifier_token));
+            SimpleNameAST *superclass = new (_pool) SimpleNameAST;
+            match(T_IDENTIFIER, &(superclass->identifier_token));
+            ast->superclass = superclass;
         }
 
         parseObjCProtocolRefs(ast->protocol_refs);
@@ -4118,12 +4128,13 @@ bool Parser::parseObjCProtocol(DeclarationAST *&node,
     if (LA() == T_COMMA || LA() == T_SEMICOLON) {
         // a protocol forward declaration
 
-        ObjCProtocolDeclarationAST *ast = new (_pool) ObjCProtocolDeclarationAST;
+        ObjCProtocolForwardDeclarationAST *ast = new (_pool) ObjCProtocolForwardDeclarationAST;
         ast->attributes = attributes;
         ast->protocol_token = protocol_token;
         ast->identifier_list = new (_pool) IdentifierListAST;
-        ast->identifier_list->name = new (_pool) SimpleNameAST;
-        ast->identifier_list->name->identifier_token = identifier_token;
+        SimpleNameAST *name = new (_pool) SimpleNameAST;
+        name->identifier_token = identifier_token;
+        ast->identifier_list->name = name;
         IdentifierListAST **nextId = &(ast->identifier_list->next);
 
         while (LA() == T_COMMA) {
@@ -4132,8 +4143,9 @@ bool Parser::parseObjCProtocol(DeclarationAST *&node,
 
             *nextId = new (_pool) IdentifierListAST;
             (*nextId)->comma_token = comma_token;
-            (*nextId)->name = new (_pool) SimpleNameAST;
-            (*nextId)->name->identifier_token = identifier_token;
+            name = new (_pool) SimpleNameAST;
+            name->identifier_token = identifier_token;
+            (*nextId)->name = name;
             nextId = &((*nextId)->next);
         }
 
@@ -4142,11 +4154,12 @@ bool Parser::parseObjCProtocol(DeclarationAST *&node,
         return true;
     } else {
         // a protocol definition
-        ObjCProtocolDefinitionAST *ast = new (_pool) ObjCProtocolDefinitionAST;
+        ObjCProtocolDeclarationAST *ast = new (_pool) ObjCProtocolDeclarationAST;
         ast->attributes = attributes;
         ast->protocol_token = protocol_token;
-        ast->name = new (_pool) SimpleNameAST;
-        ast->name->identifier_token = identifier_token;
+        SimpleNameAST *name = new (_pool) SimpleNameAST;
+        name->identifier_token = identifier_token;
+        ast->name = name;
 
         parseObjCProtocolRefs(ast->protocol_refs);
 
@@ -4180,31 +4193,39 @@ bool Parser::parseObjCImplementation(DeclarationAST *&node)
 
     if (LA() == T_LPAREN) {
         // a category implementation
-        ObjCCategoryImplementationAST *ast = new (_pool) ObjCCategoryImplementationAST;
+        ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
         ast->implementation_token = implementation_token;
-        ast->class_identifier = identifier_token;
+        SimpleNameAST *class_name = new (_pool) SimpleNameAST;
+        class_name->identifier_token = identifier_token;
+        ast->class_name = class_name;
 
         match(T_LPAREN, &(ast->lparen_token));
-        match(T_IDENTIFIER, &(ast->category_name_token));
+        SimpleNameAST *category_name = new (_pool) SimpleNameAST;
+        match(T_IDENTIFIER, &(category_name->identifier_token));
+        ast->category_name = category_name;
         match(T_RPAREN, &(ast->rparen_token));
 
-        parseObjCMethodDefinitionList(ast->declarations);
+        parseObjCMethodDefinitionList(ast->member_declarations);
         match(T_AT_END, &(ast->end_token));
 
         node = ast;
     } else {
         // a class implementation
-        ObjCClassImplementationAST *ast = new (_pool) ObjCClassImplementationAST;
+        ObjCClassDeclarationAST *ast = new (_pool) ObjCClassDeclarationAST;
         ast->implementation_token = implementation_token;
-        ast->class_identifier = identifier_token;
+        SimpleNameAST *class_name = new (_pool) SimpleNameAST;
+        class_name->identifier_token = identifier_token;
+        ast->class_name = class_name;
 
         if (LA() == T_COLON) {
             ast->colon_token = consumeToken();
-            match(T_IDENTIFIER, &(ast->super_class_identifier));
+            SimpleNameAST *superclass = new (_pool) SimpleNameAST;
+            match(T_IDENTIFIER, &(superclass->identifier_token));
+            ast->superclass = superclass;
         }
 
         parseObjClassInstanceVariables(ast->inst_vars_decl);
-        parseObjCMethodDefinitionList(ast->declarations);
+        parseObjCMethodDefinitionList(ast->member_declarations);
         match(T_AT_END, &(ast->end_token));
 
         node = ast;
@@ -4272,16 +4293,18 @@ bool Parser::parseObjCMethodDefinitionList(DeclarationListAST *&node)
             ObjCDynamicPropertiesDeclarationAST *ast = new (_pool) ObjCDynamicPropertiesDeclarationAST;
             ast->dynamic_token = consumeToken();
             ast->property_identifiers = new (_pool) IdentifierListAST;
-            ast->property_identifiers->name = new (_pool) SimpleNameAST;
-            match(T_IDENTIFIER, &(ast->property_identifiers->name->identifier_token));
+            SimpleNameAST *name = new (_pool) SimpleNameAST;
+            match(T_IDENTIFIER, &(name->identifier_token));
+            ast->property_identifiers->name = name;
 
             IdentifierListAST *last = ast->property_identifiers;
             while (LA() == T_COMMA) {
                 last->comma_token = consumeToken();
                 last->next = new (_pool) IdentifierListAST;
                 last = last->next;
-                last->name = new (_pool) SimpleNameAST;
-                match(T_IDENTIFIER, &(last->name->identifier_token));
+                name = new (_pool) SimpleNameAST;
+                match(T_IDENTIFIER, &(name->identifier_token));
+                last->name = name;
             }
 
             match(T_SEMICOLON, &(ast->semicolon_token));
@@ -4350,8 +4373,9 @@ bool Parser::parseObjCProtocolRefs(ObjCProtocolRefsAST *&node)
     unsigned identifier_token = 0;
     match(T_IDENTIFIER, &identifier_token);
     ast->identifier_list = new (_pool) IdentifierListAST;
-    ast->identifier_list->name = new (_pool) SimpleNameAST;
-    ast->identifier_list->name->identifier_token = identifier_token;
+    SimpleNameAST *name = new (_pool) SimpleNameAST;
+    name->identifier_token = identifier_token;
+    ast->identifier_list->name = name;
     IdentifierListAST **nextId = &(ast->identifier_list->next);
 
     while (LA() == T_COMMA) {
@@ -4360,8 +4384,9 @@ bool Parser::parseObjCProtocolRefs(ObjCProtocolRefsAST *&node)
 
         *nextId = new (_pool) IdentifierListAST;
         (*nextId)->comma_token = comma_token;
-        (*nextId)->name = new (_pool) SimpleNameAST;
-        (*nextId)->name->identifier_token = identifier_token;
+        name = new (_pool) SimpleNameAST;
+        name->identifier_token = identifier_token;
+        (*nextId)->name = name;
         nextId = &((*nextId)->next);
     }
 
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index 15e11994ccb..efc2c60efe2 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -213,7 +213,7 @@ public:
 
     // ObjC++
     bool parseObjCExpression(ExpressionAST *&node);
-    bool parseObjCClassDeclaration(DeclarationAST *&node);
+    bool parseObjCClassForwardDeclaration(DeclarationAST *&node);
     bool parseObjCInterface(DeclarationAST *&node,
                             SpecifierAST *attributes = 0);
     bool parseObjCProtocol(DeclarationAST *&node,
diff --git a/src/shared/cplusplus/Symbols.cpp b/src/shared/cplusplus/Symbols.cpp
index 4946bb75f15..861c1cd3580 100644
--- a/src/shared/cplusplus/Symbols.cpp
+++ b/src/shared/cplusplus/Symbols.cpp
@@ -636,27 +636,11 @@ ObjCForwardClassDeclaration::~ObjCForwardClassDeclaration()
 {}
 
 FullySpecifiedType ObjCForwardClassDeclaration::type() const
-{ return FullySpecifiedType(const_cast<ObjCForwardClassDeclaration *>(this)); }
-
-bool ObjCForwardClassDeclaration::isEqualTo(const Type *other) const
-{
-    if (const ObjCForwardClassDeclaration *otherForward = other->asObjCForwardClassDeclarationType()) {
-        if (name() == otherForward->name())
-            return true;
-        else if (name() && otherForward->name())
-            return name()->isEqualTo(otherForward->name());
-
-        return false;
-    }
-    return false;
-}
+{ return FullySpecifiedType(); }
 
 void ObjCForwardClassDeclaration::visitSymbol0(SymbolVisitor *visitor)
 { visitor->visit(this); }
 
-void ObjCForwardClassDeclaration::accept0(TypeVisitor *visitor)
-{ visitor->visit(this); }
-
 ObjCForwardProtocolDeclaration::ObjCForwardProtocolDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name):
         Symbol(translationUnit, sourceLocation, name)
 {
@@ -666,25 +650,9 @@ ObjCForwardProtocolDeclaration::~ObjCForwardProtocolDeclaration()
 {}
 
 FullySpecifiedType ObjCForwardProtocolDeclaration::type() const
-{ return FullySpecifiedType(const_cast<ObjCForwardProtocolDeclaration *>(this)); }
-
-bool ObjCForwardProtocolDeclaration::isEqualTo(const Type *other) const
-{
-    if (const ObjCForwardProtocolDeclaration *otherForward = other->asObjCForwardProtocolDeclarationType()) {
-        if (name() == otherForward->name())
-            return true;
-        else if (name() && otherForward->name())
-            return name()->isEqualTo(otherForward->name());
-
-        return false;
-    }
-    return false;
-}
+{ return FullySpecifiedType(); }
 
 void ObjCForwardProtocolDeclaration::visitSymbol0(SymbolVisitor *visitor)
 { visitor->visit(this); }
 
-void ObjCForwardProtocolDeclaration::accept0(TypeVisitor *visitor)
-{ visitor->visit(this); }
-
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/Symbols.h b/src/shared/cplusplus/Symbols.h
index 7bf8de0c89f..3f621cde60e 100644
--- a/src/shared/cplusplus/Symbols.h
+++ b/src/shared/cplusplus/Symbols.h
@@ -463,7 +463,7 @@ private:
     Array<BaseClass *> _baseClasses;
 };
 
-class CPLUSPLUS_EXPORT ObjCForwardProtocolDeclaration: public Symbol, public Type
+class CPLUSPLUS_EXPORT ObjCForwardProtocolDeclaration: public Symbol
 {
 public:
     ObjCForwardProtocolDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name);
@@ -472,24 +472,14 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
-    // Type's interface
-    virtual bool isEqualTo(const Type *other) const;
-
     virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration() const
     { return this; }
 
     virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclaration()
     { return this; }
 
-    virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() const
-    { return this; }
-
-    virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType()
-    { return this; }
-
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
-    virtual void accept0(TypeVisitor *visitor);
 
 private:
 };
@@ -526,7 +516,7 @@ private:
     Array<ObjCProtocol *> _protocols;
 };
 
-class CPLUSPLUS_EXPORT ObjCForwardClassDeclaration: public Symbol, public Type
+class CPLUSPLUS_EXPORT ObjCForwardClassDeclaration: public Symbol
 {
 public:
     ObjCForwardClassDeclaration(TranslationUnit *translationUnit, unsigned sourceLocation, Name *name);
@@ -535,24 +525,14 @@ public:
     // Symbol's interface
     virtual FullySpecifiedType type() const;
 
-    // Type's interface
-    virtual bool isEqualTo(const Type *other) const;
-
     virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclaration() const
     { return this; }
 
     virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclaration()
     { return this; }
 
-    virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() const
-    { return this; }
-
-    virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType()
-    { return this; }
-
 protected:
     virtual void visitSymbol0(SymbolVisitor *visitor);
-    virtual void accept0(TypeVisitor *visitor);
 
 private:
 };
diff --git a/src/shared/cplusplus/Type.cpp b/src/shared/cplusplus/Type.cpp
index 8b41f36407e..ac490408059 100644
--- a/src/shared/cplusplus/Type.cpp
+++ b/src/shared/cplusplus/Type.cpp
@@ -104,15 +104,9 @@ bool Type::isForwardClassDeclarationType() const
 bool Type::isObjCClassType() const
 { return asObjCClassType() != 0; }
 
-bool Type::isObjCForwardClassDeclarationType() const
-{ return asObjCForwardClassDeclarationType() != 0; }
-
 bool Type::isObjCProtocolType() const
 { return asObjCProtocolType() != 0; }
 
-bool Type::isObjCForwardProtocolDeclarationType() const
-{ return asObjCForwardProtocolDeclarationType() != 0; }
-
 void Type::accept(TypeVisitor *visitor)
 {
     if (visitor->preVisit(this))
diff --git a/src/shared/cplusplus/Type.h b/src/shared/cplusplus/Type.h
index 1ddc67eb58a..ccd92251e6b 100644
--- a/src/shared/cplusplus/Type.h
+++ b/src/shared/cplusplus/Type.h
@@ -78,9 +78,7 @@ public:
     bool isEnumType() const;
     bool isForwardClassDeclarationType() const;
     bool isObjCClassType() const;
-    bool isObjCForwardClassDeclarationType() const;
     bool isObjCProtocolType() const;
-    bool isObjCForwardProtocolDeclarationType() const;
 
     virtual const VoidType *asVoidType() const { return 0; }
     virtual const IntegerType *asIntegerType() const { return 0; }
@@ -96,9 +94,7 @@ public:
     virtual const Enum *asEnumType() const { return 0; }
     virtual const ForwardClassDeclaration *asForwardClassDeclarationType() const { return 0; }
     virtual const ObjCClass *asObjCClassType() const { return 0; }
-    virtual const ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() const { return 0; }
     virtual const ObjCProtocol *asObjCProtocolType() const { return 0; }
-    virtual const ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() const { return 0; }
 
     virtual VoidType *asVoidType() { return 0; }
     virtual IntegerType *asIntegerType() { return 0; }
@@ -114,9 +110,7 @@ public:
     virtual Enum *asEnumType() { return 0; }
     virtual ForwardClassDeclaration *asForwardClassDeclarationType() { return 0; }
     virtual ObjCClass *asObjCClassType() { return 0; }
-    virtual ObjCForwardClassDeclaration *asObjCForwardClassDeclarationType() { return 0; }
     virtual ObjCProtocol *asObjCProtocoTypel() { return 0; }
-    virtual ObjCForwardProtocolDeclaration *asObjCForwardProtocolDeclarationType() { return 0; }
 
     void accept(TypeVisitor *visitor);
     static void accept(Type *type, TypeVisitor *visitor);
diff --git a/src/shared/cplusplus/TypeVisitor.h b/src/shared/cplusplus/TypeVisitor.h
index a0de7065570..005e9cdc795 100644
--- a/src/shared/cplusplus/TypeVisitor.h
+++ b/src/shared/cplusplus/TypeVisitor.h
@@ -83,8 +83,6 @@ public:
     virtual void visit(ForwardClassDeclaration *) {}
     virtual void visit(ObjCClass *) {}
     virtual void visit(ObjCProtocol *) {}
-    virtual void visit(ObjCForwardClassDeclaration *) {}
-    virtual void visit(ObjCForwardProtocolDeclaration *) {}
 };
 
 CPLUSPLUS_END_NAMESPACE
-- 
GitLab