Added ObjC protocol expressions.

This commit is contained in:
Erik Verbruggen
2009-07-16 12:18:05 +02:00
parent d34bf41a37
commit a262fce6d0
7 changed files with 69 additions and 6 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -179,6 +179,7 @@ class ObjCProtocolRefsAST;
class ObjCMessageExpressionAST;
class ObjCMessageArgumentListAST;
class ObjCMessageArgumentAST;
class ObjCProtocolExpressionAST;
CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER

View File

@@ -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;
}