From a262fce6d0577db8c3675bd918ce52e60c89daa4 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Thu, 16 Jul 2009 12:18:05 +0200
Subject: [PATCH] Added ObjC protocol expressions.

---
 src/shared/cplusplus/AST.cpp      | 19 +++++++++++++++++++
 src/shared/cplusplus/AST.h        | 21 +++++++++++++++++++++
 src/shared/cplusplus/ASTClone.cpp | 10 ++++++++++
 src/shared/cplusplus/ASTVisit.cpp |  9 +++++++++
 src/shared/cplusplus/ASTVisitor.h |  2 ++
 src/shared/cplusplus/ASTfwd.h     |  1 +
 src/shared/cplusplus/Parser.cpp   | 13 +++++++------
 7 files changed, 69 insertions(+), 6 deletions(-)

diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 6a72e3b90a7..eca2e200961 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -2104,4 +2104,23 @@ unsigned ObjCMessageArgumentAST::lastToken() const
     return parameter_key_identifier + 1;
 }
 
+unsigned ObjCProtocolExpressionAST::firstToken() const
+{
+    return protocol_token;
+}
+
+unsigned ObjCProtocolExpressionAST::lastToken() const
+{
+    if (rparen_token)
+        return rparen_token + 1;
+
+    if (identifier_token)
+        return identifier_token + 1;
+
+    if (lparen_token)
+        return lparen_token + 1;
+
+    return protocol_token + 1;
+}
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 393126c9d47..981bb29b159 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -2653,6 +2653,27 @@ protected:
     virtual void accept0(ASTVisitor *visitor);
 };
 
+class CPLUSPLUS_EXPORT ObjCProtocolExpressionAST: public ExpressionAST
+{
+public:
+    unsigned protocol_token;
+    unsigned lparen_token;
+    unsigned identifier_token;
+    unsigned rparen_token;
+
+public:
+    virtual ObjCProtocolExpressionAST *asObjCProtocolExpression()
+    { return this; }
+
+    virtual unsigned firstToken() const;
+    virtual unsigned lastToken() const;
+
+    virtual ObjCProtocolExpressionAST *clone(MemoryPool *pool) const;
+
+protected:
+    virtual void accept0(ASTVisitor *visitor);
+};
+
 CPLUSPLUS_END_NAMESPACE
 CPLUSPLUS_END_HEADER
 
diff --git a/src/shared/cplusplus/ASTClone.cpp b/src/shared/cplusplus/ASTClone.cpp
index 5065cfdd230..e12967651da 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -1311,4 +1311,14 @@ ObjCMessageArgumentAST *ObjCMessageArgumentAST::clone(MemoryPool *pool) const
     return ast;
 }
 
+ObjCProtocolExpressionAST *ObjCProtocolExpressionAST::clone(MemoryPool *pool) const
+{
+    ObjCProtocolExpressionAST *ast = new (pool) ObjCProtocolExpressionAST;
+    ast->protocol_token = protocol_token;
+    ast->lparen_token = lparen_token;
+    ast->identifier_token = identifier_token;
+    ast->rparen_token = rparen_token;
+    return ast;
+}
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 0f2052127d8..1980ec78f9f 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -1234,4 +1234,13 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
     visitor->endVisit(this);
 }
 
+void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor)
+{
+    if (visitor->visit(this)) {
+        // visit ObjCProtocolExpressionAST
+        // visit ExpressionAST
+    }
+    visitor->endVisit(this);
+}
+
 CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 4b0672cbc1d..6509235f44e 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -206,6 +206,7 @@ public:
     virtual bool visit(ObjCMessageExpressionAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentListAST *) { return true; }
     virtual bool visit(ObjCMessageArgumentAST *) { return true; }
+    virtual bool visit(ObjCProtocolExpressionAST *) { return true; }
 
     virtual bool visit(DeclarationListAST *) { return true; }
     virtual void endVisit(DeclarationListAST *) { }
@@ -323,6 +324,7 @@ public:
     virtual void endVisit(ObjCMessageExpressionAST *) { }
     virtual void endVisit(ObjCMessageArgumentListAST *) { }
     virtual void endVisit(ObjCMessageArgumentAST *) { }
+    virtual void endVisit(ObjCProtocolExpressionAST *) { }
 
 private:
     Control *_control;
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index e12393df6a8..a70ad55da5d 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -179,6 +179,7 @@ class ObjCProtocolRefsAST;
 class ObjCMessageExpressionAST;
 class ObjCMessageArgumentListAST;
 class ObjCMessageArgumentAST;
+class ObjCProtocolExpressionAST;
 
 CPLUSPLUS_END_NAMESPACE
 CPLUSPLUS_END_HEADER
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ba705f9551b..6ba6541068d 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2849,16 +2849,17 @@ bool Parser::parseObjCEncodeExpression(ExpressionAST *&)
     return true;
 }
 
-bool Parser::parseObjCProtocolExpression(ExpressionAST *&)
+bool Parser::parseObjCProtocolExpression(ExpressionAST *&node)
 {
     if (LA() != T_AT_PROTOCOL)
         return false;
 
-    /*unsigned protocol_token = */ consumeToken();
-    unsigned lparen_token = 0, identifier_token = 0, rparen_token = 0;
-    match(T_LPAREN, &lparen_token);
-    match(T_IDENTIFIER, &identifier_token);
-    match(T_RPAREN, &rparen_token);
+    ObjCProtocolExpressionAST *ast = new (_pool) ObjCProtocolExpressionAST;
+    ast->protocol_token = consumeToken();
+    match(T_LPAREN, &(ast->lparen_token));
+    match(T_IDENTIFIER, &(ast->identifier_token));
+    match(T_RPAREN, &(ast->rparen_token));
+    node = ast;
     return true;
 }
 
-- 
GitLab