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