summaryrefslogtreecommitdiff
path: root/src/shared/cplusplus
diff options
context:
space:
mode:
Diffstat (limited to 'src/shared/cplusplus')
-rw-r--r--src/shared/cplusplus/AST.cpp51
-rw-r--r--src/shared/cplusplus/AST.h61
-rw-r--r--src/shared/cplusplus/ASTClone.cpp28
-rw-r--r--src/shared/cplusplus/ASTVisit.cpp31
-rw-r--r--src/shared/cplusplus/ASTVisitor.h6
-rw-r--r--src/shared/cplusplus/ASTfwd.h3
-rw-r--r--src/shared/cplusplus/Parser.cpp45
-rw-r--r--src/shared/cplusplus/Parser.h4
8 files changed, 207 insertions, 22 deletions
diff --git a/src/shared/cplusplus/AST.cpp b/src/shared/cplusplus/AST.cpp
index 6a72e3b90a..946ecf5cb5 100644
--- a/src/shared/cplusplus/AST.cpp
+++ b/src/shared/cplusplus/AST.cpp
@@ -2104,4 +2104,55 @@ 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;
+}
+
+unsigned ObjCTypeNameAST::firstToken() const
+{
+ return lparen_token;
+}
+
+unsigned ObjCTypeNameAST::lastToken() const
+{
+ if (rparen_token)
+ return rparen_token + 1;
+
+ if (type_id)
+ return type_id->lastToken();
+
+ if (type_qualifier)
+ return type_qualifier + 1;
+
+ return lparen_token + 1;
+}
+
+unsigned ObjCEncodeExpressionAST::firstToken() const
+{
+ return encode_token;
+}
+
+unsigned ObjCEncodeExpressionAST::lastToken() const
+{
+ if (type_name)
+ return type_name->lastToken();
+
+ return encode_token + 1;
+}
+
CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/AST.h b/src/shared/cplusplus/AST.h
index 393126c9d4..290a84324b 100644
--- a/src/shared/cplusplus/AST.h
+++ b/src/shared/cplusplus/AST.h
@@ -2653,6 +2653,67 @@ 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);
+};
+
+class CPLUSPLUS_EXPORT ObjCTypeNameAST: public AST
+{
+public:
+ unsigned lparen_token;
+ unsigned type_qualifier;
+ ExpressionAST *type_id;
+ unsigned rparen_token;
+
+public:
+ virtual ObjCTypeNameAST *asObjCTypeName()
+ { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual ObjCTypeNameAST *clone(MemoryPool *pool) const;
+
+protected:
+ virtual void accept0(ASTVisitor *visitor);
+};
+
+class CPLUSPLUS_EXPORT ObjCEncodeExpressionAST: public ExpressionAST
+{
+public:
+ unsigned encode_token;
+ ObjCTypeNameAST *type_name;
+
+public:
+ virtual ObjCEncodeExpressionAST *asObjCEncodeExpression()
+ { return this; }
+
+ virtual unsigned firstToken() const;
+ virtual unsigned lastToken() const;
+
+ virtual ObjCEncodeExpressionAST *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..abc89510a5 100644
--- a/src/shared/cplusplus/ASTClone.cpp
+++ b/src/shared/cplusplus/ASTClone.cpp
@@ -1311,4 +1311,32 @@ 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;
+}
+
+ObjCTypeNameAST *ObjCTypeNameAST::clone(MemoryPool *pool) const
+{
+ ObjCTypeNameAST *ast = new (pool) ObjCTypeNameAST;
+ ast->lparen_token = lparen_token;
+ ast->type_qualifier = type_qualifier;
+ if (type_id) ast->type_id = type_id->clone(pool);
+ ast->rparen_token = rparen_token;
+ return ast;
+}
+
+ObjCEncodeExpressionAST *ObjCEncodeExpressionAST::clone(MemoryPool *pool) const
+{
+ ObjCEncodeExpressionAST *ast = new (pool) ObjCEncodeExpressionAST;
+ ast->encode_token = encode_token;
+ if (type_name) ast->type_name = type_name->clone(pool);
+ return ast;
+}
+
CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/ASTVisit.cpp b/src/shared/cplusplus/ASTVisit.cpp
index 0f2052127d..02f1218afe 100644
--- a/src/shared/cplusplus/ASTVisit.cpp
+++ b/src/shared/cplusplus/ASTVisit.cpp
@@ -1234,4 +1234,35 @@ void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this);
}
+void ObjCProtocolExpressionAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ // visit ObjCProtocolExpressionAST
+ // visit ExpressionAST
+ }
+ visitor->endVisit(this);
+}
+
+void ObjCTypeNameAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ // visit ObjCTypeNameAST
+ if (type_id)
+ accept(type_id, visitor);
+ // visit AST
+ }
+ visitor->endVisit(this);
+}
+
+void ObjCEncodeExpressionAST::accept0(ASTVisitor *visitor)
+{
+ if (visitor->visit(this)) {
+ // visit ObjCEncodeExpressionAST
+ if (type_name)
+ accept(type_name, visitor);
+ // visit ExpressionAST
+ }
+ visitor->endVisit(this);
+}
+
CPLUSPLUS_END_NAMESPACE
diff --git a/src/shared/cplusplus/ASTVisitor.h b/src/shared/cplusplus/ASTVisitor.h
index 4b0672cbc1..130c666262 100644
--- a/src/shared/cplusplus/ASTVisitor.h
+++ b/src/shared/cplusplus/ASTVisitor.h
@@ -206,6 +206,9 @@ 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(ObjCTypeNameAST *) { return true; }
+ virtual bool visit(ObjCEncodeExpressionAST *) { return true; }
virtual bool visit(DeclarationListAST *) { return true; }
virtual void endVisit(DeclarationListAST *) { }
@@ -323,6 +326,9 @@ public:
virtual void endVisit(ObjCMessageExpressionAST *) { }
virtual void endVisit(ObjCMessageArgumentListAST *) { }
virtual void endVisit(ObjCMessageArgumentAST *) { }
+ virtual void endVisit(ObjCProtocolExpressionAST *) { }
+ virtual void endVisit(ObjCTypeNameAST *) { }
+ virtual void endVisit(ObjCEncodeExpressionAST *) { }
private:
Control *_control;
diff --git a/src/shared/cplusplus/ASTfwd.h b/src/shared/cplusplus/ASTfwd.h
index e12393df6a..f25e293282 100644
--- a/src/shared/cplusplus/ASTfwd.h
+++ b/src/shared/cplusplus/ASTfwd.h
@@ -179,6 +179,9 @@ class ObjCProtocolRefsAST;
class ObjCMessageExpressionAST;
class ObjCMessageArgumentListAST;
class ObjCMessageArgumentAST;
+class ObjCProtocolExpressionAST;
+class ObjCTypeNameAST;
+class ObjCEncodeExpressionAST;
CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER
diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index ba705f9551..571ceaa074 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -2839,26 +2839,29 @@ bool Parser::parseObjCStringLiteral(ExpressionAST *&node)
return true;
}
-bool Parser::parseObjCEncodeExpression(ExpressionAST *&)
+bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
{
if (LA() != T_AT_ENCODE)
return false;
- /*unsigned encode_token = */ consumeToken();
- parseObjCTypeName();
+ ObjCEncodeExpressionAST *ast = new (_pool) ObjCEncodeExpressionAST;
+ ast->encode_token = consumeToken();
+ parseObjCTypeName(ast->type_name);
+ node = ast;
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;
}
@@ -4348,7 +4351,8 @@ bool Parser::parseObjCMethodPrototype()
/*unsigned method_type_token = */ consumeToken();
- parseObjCTypeName();
+ ObjCTypeNameAST *type_name = 0;
+ parseObjCTypeName(type_name);
unsigned selector_token = 0;
@@ -4407,17 +4411,17 @@ bool Parser::parseObjCPropertyAttribute()
// objc-type-name ::= T_LPAREN objc-type-qualifiers-opt type-id T_RPAREN
//
-bool Parser::parseObjCTypeName()
+bool Parser::parseObjCTypeName(ObjCTypeNameAST *&node)
{
if (LA() != T_LPAREN)
return false;
- unsigned lparen_token = 0, rparen_token = 0;
- match(T_LPAREN, &lparen_token);
- parseObjCTypeQualifiers();
- ExpressionAST *type_id = 0;
- parseTypeId(type_id);
- match(T_RPAREN, &rparen_token);
+ ObjCTypeNameAST *ast = new (_pool) ObjCTypeNameAST;
+ match(T_LPAREN, &(ast->lparen_token));
+ parseObjCTypeQualifiers(ast->type_qualifier);
+ parseTypeId(ast->type_id);
+ match(T_RPAREN, &(ast->rparen_token));
+ node = ast;
return true;
}
@@ -4445,7 +4449,8 @@ bool Parser::parseObjCKeywordDeclaration()
unsigned colon_token = 0;
match(T_COLON, &colon_token);
- parseObjCTypeName();
+ ObjCTypeNameAST *type_name = 0;
+ parseObjCTypeName(type_name);
SpecifierAST *attributes = 0, **attr = &attributes;
while (parseAttributeSpecifier(*attr))
@@ -4457,7 +4462,7 @@ bool Parser::parseObjCKeywordDeclaration()
return true;
}
-bool Parser::parseObjCTypeQualifiers()
+bool Parser::parseObjCTypeQualifiers(unsigned &type_qualifier)
{
if (LA() != T_IDENTIFIER)
return false;
@@ -4466,7 +4471,7 @@ bool Parser::parseObjCTypeQualifiers()
const int k = classifyObjectiveCTypeQualifiers(id->chars(), id->size());
if (k == Token_identifier)
return false;
- consumeToken();
+ type_qualifier = consumeToken();
return true;
}
diff --git a/src/shared/cplusplus/Parser.h b/src/shared/cplusplus/Parser.h
index c81312d94f..2de07f1bea 100644
--- a/src/shared/cplusplus/Parser.h
+++ b/src/shared/cplusplus/Parser.h
@@ -240,10 +240,10 @@ public:
bool parseObjCImplementation(DeclarationAST *&node);
bool parseObjCMethodPrototype();
bool parseObjCPropertyAttribute();
- bool parseObjCTypeName();
+ bool parseObjCTypeName(ObjCTypeNameAST *&node);
bool parseObjCSelector(unsigned &selector_token);
bool parseObjCKeywordDeclaration();
- bool parseObjCTypeQualifiers();
+ bool parseObjCTypeQualifiers(unsigned &type_qualifier);
bool parseObjCEnd(DeclarationAST *&node);
bool lookAtObjCSelector() const;