summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp19
-rw-r--r--src/shared/cplusplus/AST.h21
-rw-r--r--src/shared/cplusplus/ASTClone.cpp10
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp9
-rw-r--r--src/shared/cplusplus/ASTVisitor.h2
-rw-r--r--src/shared/cplusplus/ASTfwd.h1
-rw-r--r--src/shared/cplusplus/Parser.cpp13
7 files changed, 69 insertions, 6 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 6a72e3b90a..eca2e20096 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 393126c9d4..981bb29b15 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 5065cfdd23..e12967651d 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 0f2052127d..1980ec78f9 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 4b0672cbc1..6509235f44 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 e12393df6a..a70ad55da5 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 ba705f9551..6ba6541068 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;
}