forked from qt-creator/qt-creator
AST additions for ObjC send_msg.
This commit is contained in:
@@ -2057,11 +2057,51 @@ unsigned ObjCMessageExpressionAST::firstToken() const
|
||||
|
||||
unsigned ObjCMessageExpressionAST::lastToken() const
|
||||
{
|
||||
if (rbracket_token) return rbracket_token + 1;
|
||||
if (rbracket_token)
|
||||
return rbracket_token + 1;
|
||||
|
||||
// FIXME: TODO
|
||||
if (receiver_expression)
|
||||
return receiver_expression->lastToken();
|
||||
|
||||
if (argument_list)
|
||||
return argument_list->lastToken();
|
||||
|
||||
return lbracket_token + 1;
|
||||
}
|
||||
|
||||
unsigned ObjCMessageArgumentListAST::firstToken() const
|
||||
{
|
||||
if (arg)
|
||||
return arg->firstToken();
|
||||
// ### assert?
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned ObjCMessageArgumentListAST::lastToken() const
|
||||
{
|
||||
for (const ObjCMessageArgumentListAST *it = this; it; it = it->next) {
|
||||
if (! it->next && it->arg) {
|
||||
return it->arg->lastToken();
|
||||
}
|
||||
}
|
||||
// ### assert?
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned ObjCMessageArgumentAST::firstToken() const
|
||||
{
|
||||
return parameter_key_identifier;
|
||||
}
|
||||
|
||||
unsigned ObjCMessageArgumentAST::lastToken() const
|
||||
{
|
||||
if (parameter_value_expression)
|
||||
return parameter_value_expression->lastToken();
|
||||
|
||||
if (colon_token)
|
||||
return colon_token + 1;
|
||||
|
||||
return parameter_key_identifier + 1;
|
||||
}
|
||||
|
||||
CPLUSPLUS_END_NAMESPACE
|
||||
|
||||
@@ -2593,11 +2593,51 @@ protected:
|
||||
virtual void accept0(ASTVisitor *visitor);
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCMessageArgumentAST: public AST
|
||||
{
|
||||
public:
|
||||
unsigned parameter_key_identifier;
|
||||
unsigned colon_token;
|
||||
ExpressionAST *parameter_value_expression;
|
||||
|
||||
public:
|
||||
virtual ObjCMessageArgumentAST *asObjCMessageArgument()
|
||||
{ return this; }
|
||||
|
||||
virtual unsigned firstToken() const;
|
||||
virtual unsigned lastToken() const;
|
||||
|
||||
virtual ObjCMessageArgumentAST *clone(MemoryPool *pool) const;
|
||||
|
||||
protected:
|
||||
virtual void accept0(ASTVisitor *visitor);
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCMessageArgumentListAST: public AST
|
||||
{
|
||||
public:
|
||||
ObjCMessageArgumentAST *arg;
|
||||
ObjCMessageArgumentListAST *next;
|
||||
|
||||
public:
|
||||
virtual ObjCMessageArgumentListAST *asObjCMessageArgumentList()
|
||||
{ return this; }
|
||||
|
||||
virtual unsigned firstToken() const;
|
||||
virtual unsigned lastToken() const;
|
||||
|
||||
virtual ObjCMessageArgumentListAST *clone(MemoryPool *pool) const;
|
||||
|
||||
protected:
|
||||
virtual void accept0(ASTVisitor *visitor);
|
||||
};
|
||||
|
||||
class CPLUSPLUS_EXPORT ObjCMessageExpressionAST: public ExpressionAST
|
||||
{
|
||||
public:
|
||||
unsigned lbracket_token;
|
||||
// ..
|
||||
ExpressionAST *receiver_expression;
|
||||
ObjCMessageArgumentListAST *argument_list;
|
||||
unsigned rbracket_token;
|
||||
|
||||
public:
|
||||
|
||||
@@ -1288,9 +1288,27 @@ ObjCMessageExpressionAST *ObjCMessageExpressionAST::clone(MemoryPool *pool) cons
|
||||
{
|
||||
ObjCMessageExpressionAST *ast = new (pool) ObjCMessageExpressionAST;
|
||||
ast->lbracket_token = lbracket_token;
|
||||
// FIXME: TODO
|
||||
if (receiver_expression) ast->receiver_expression = receiver_expression->clone(pool);
|
||||
if (argument_list) ast->argument_list = argument_list->clone(pool);
|
||||
ast->rbracket_token = rbracket_token;
|
||||
return ast;
|
||||
}
|
||||
|
||||
ObjCMessageArgumentListAST *ObjCMessageArgumentListAST::clone(MemoryPool *pool) const
|
||||
{
|
||||
ObjCMessageArgumentListAST *ast = new (pool) ObjCMessageArgumentListAST;
|
||||
if (arg) ast->arg = arg->clone(pool);
|
||||
if (next) ast->next = next->clone(pool);
|
||||
return ast;
|
||||
}
|
||||
|
||||
ObjCMessageArgumentAST *ObjCMessageArgumentAST::clone(MemoryPool *pool) const
|
||||
{
|
||||
ObjCMessageArgumentAST *ast = new (pool) ObjCMessageArgumentAST;
|
||||
ast->parameter_key_identifier = parameter_key_identifier;
|
||||
ast->colon_token = colon_token;
|
||||
if (parameter_value_expression) ast->parameter_value_expression = parameter_value_expression->clone(pool);
|
||||
return ast;
|
||||
}
|
||||
|
||||
CPLUSPLUS_END_NAMESPACE
|
||||
|
||||
@@ -1200,7 +1200,36 @@ void ObjCProtocolRefsAST::accept0(ASTVisitor *visitor)
|
||||
void ObjCMessageExpressionAST::accept0(ASTVisitor *visitor)
|
||||
{
|
||||
if (visitor->visit(this)) {
|
||||
// FIXME: TODO
|
||||
// visit ObjCMessageExpressionAST
|
||||
if (receiver_expression)
|
||||
accept(receiver_expression, visitor);
|
||||
if (argument_list)
|
||||
accept(argument_list, visitor);
|
||||
// visit ExpressionAST
|
||||
}
|
||||
visitor->endVisit(this);
|
||||
}
|
||||
|
||||
void ObjCMessageArgumentListAST::accept0(ASTVisitor *visitor)
|
||||
{
|
||||
if (visitor->visit(this)) {
|
||||
// visit ObjCMessageArgumentListAST
|
||||
if (arg)
|
||||
accept(arg, visitor);
|
||||
if (next)
|
||||
accept(next, visitor);
|
||||
// visit AST
|
||||
}
|
||||
visitor->endVisit(this);
|
||||
}
|
||||
|
||||
void ObjCMessageArgumentAST::accept0(ASTVisitor *visitor)
|
||||
{
|
||||
if (visitor->visit(this)) {
|
||||
// visit ObjCMessageArgumentAST
|
||||
if (parameter_value_expression)
|
||||
accept(parameter_value_expression, visitor);
|
||||
// visit AST
|
||||
}
|
||||
visitor->endVisit(this);
|
||||
}
|
||||
|
||||
@@ -204,6 +204,8 @@ public:
|
||||
virtual bool visit(ObjCProtocolDefinitionAST *) { return true; }
|
||||
virtual bool visit(ObjCProtocolRefsAST *) { return true; }
|
||||
virtual bool visit(ObjCMessageExpressionAST *) { return true; }
|
||||
virtual bool visit(ObjCMessageArgumentListAST *) { return true; }
|
||||
virtual bool visit(ObjCMessageArgumentAST *) { return true; }
|
||||
|
||||
virtual bool visit(DeclarationListAST *) { return true; }
|
||||
virtual void endVisit(DeclarationListAST *) { }
|
||||
@@ -319,6 +321,8 @@ public:
|
||||
virtual void endVisit(ObjCProtocolDefinitionAST *) { }
|
||||
virtual void endVisit(ObjCProtocolRefsAST *) { }
|
||||
virtual void endVisit(ObjCMessageExpressionAST *) { }
|
||||
virtual void endVisit(ObjCMessageArgumentListAST *) { }
|
||||
virtual void endVisit(ObjCMessageArgumentAST *) { }
|
||||
|
||||
private:
|
||||
Control *_control;
|
||||
|
||||
@@ -177,6 +177,8 @@ class ObjCClassInterfaceDeclarationAST;
|
||||
class ObjCCategoryInterfaceDeclarationAST;
|
||||
class ObjCProtocolRefsAST;
|
||||
class ObjCMessageExpressionAST;
|
||||
class ObjCMessageArgumentListAST;
|
||||
class ObjCMessageArgumentAST;
|
||||
|
||||
CPLUSPLUS_END_NAMESPACE
|
||||
CPLUSPLUS_END_HEADER
|
||||
|
||||
@@ -2914,21 +2914,20 @@ bool Parser::parseObjCMessageExpression(ExpressionAST *&node)
|
||||
ObjCMessageExpressionAST *ast = new (_pool) ObjCMessageExpressionAST;
|
||||
ast->lbracket_token = consumeToken();
|
||||
|
||||
parseObjCMessageReceiver();
|
||||
parseObjCMessageArguments();
|
||||
parseObjCMessageReceiver(ast->receiver_expression);
|
||||
parseObjCMessageArguments(ast->argument_list);
|
||||
|
||||
match(T_RBRACKET, &(ast->rbracket_token));
|
||||
node = ast;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool Parser::parseObjCMessageReceiver()
|
||||
bool Parser::parseObjCMessageReceiver(ExpressionAST *&node)
|
||||
{
|
||||
ExpressionAST *expression = 0;
|
||||
return parseExpression(expression);
|
||||
return parseExpression(node);
|
||||
}
|
||||
|
||||
bool Parser::parseObjCMessageArguments()
|
||||
bool Parser::parseObjCMessageArguments(ObjCMessageArgumentListAST *& /*node*/)
|
||||
{
|
||||
if (LA() == T_RBRACKET)
|
||||
return false; // nothing to do.
|
||||
|
||||
@@ -225,8 +225,8 @@ public:
|
||||
bool parseObjCStringLiteral(ExpressionAST *&node);
|
||||
bool parseObjCMethodSignature();
|
||||
bool parseObjCMessageExpression(ExpressionAST *&node);
|
||||
bool parseObjCMessageReceiver();
|
||||
bool parseObjCMessageArguments();
|
||||
bool parseObjCMessageReceiver(ExpressionAST *&node);
|
||||
bool parseObjCMessageArguments(ObjCMessageArgumentListAST *&node);
|
||||
bool parseObjCSelectorArgs();
|
||||
bool parseObjCMethodDefinitionList();
|
||||
bool parseObjCMethodDefinition();
|
||||
|
||||
Reference in New Issue
Block a user