Added @synchronized parsing for Objective-C.

This commit is contained in:
Erik Verbruggen
2009-07-31 16:53:05 +02:00
parent 4967280449
commit e205126774
8 changed files with 90 additions and 1 deletions

View File

@@ -2565,4 +2565,18 @@ unsigned ObjCFastEnumerationAST::lastToken() const
return for_token + 1; return for_token + 1;
} }
unsigned ObjCSynchronizedStatementAST::firstToken() const
{
return synchronized_token;
}
unsigned ObjCSynchronizedStatementAST::lastToken() const
{
if (statement) return statement->lastToken();
if (rparen_token) return rparen_token + 1;
if (synchronized_object) return synchronized_object->lastToken();
if (lparen_token) return lparen_token + 1;
return synchronized_token + 1;
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -3232,6 +3232,28 @@ protected:
virtual void accept0(ASTVisitor *visitor); virtual void accept0(ASTVisitor *visitor);
}; };
class CPLUSPLUS_EXPORT ObjCSynchronizedStatementAST: public StatementAST
{
public:
unsigned synchronized_token;
unsigned lparen_token;
ExpressionAST *synchronized_object;
unsigned rparen_token;
StatementAST *statement;
public:
virtual ObjCSynchronizedStatementAST *asObjCSynchronizedStatement()
{ return this; }
virtual unsigned firstToken() const;
virtual unsigned lastToken() const;
virtual ObjCSynchronizedStatementAST *clone(MemoryPool *pool) const;
protected:
virtual void accept0(ASTVisitor *visitor);
};
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER CPLUSPLUS_END_HEADER

View File

@@ -1550,4 +1550,16 @@ ObjCFastEnumerationAST *ObjCFastEnumerationAST::clone(MemoryPool *pool) const
return ast; return ast;
} }
ObjCSynchronizedStatementAST *ObjCSynchronizedStatementAST::clone(MemoryPool *pool) const
{
ObjCSynchronizedStatementAST *ast = new (pool) ObjCSynchronizedStatementAST;
ast->synchronized_token = synchronized_token;
ast->lparen_token = lparen_token;
if (synchronized_object) ast->synchronized_object = synchronized_object->clone(pool);
ast->rparen_token = rparen_token;
if (statement) ast->statement = statement->clone(pool);
return ast;
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -1527,4 +1527,17 @@ void ObjCFastEnumerationAST::accept0(ASTVisitor *visitor)
visitor->endVisit(this); visitor->endVisit(this);
} }
void ObjCSynchronizedStatementAST::accept0(ASTVisitor *visitor)
{
if (visitor->visit(this)) {
// visit ObjCSynchronizedStatementAST
if (synchronized_object)
accept(synchronized_object, visitor);
if (statement)
accept(statement, visitor);
// visit StatementAST
}
visitor->endVisit(this);
}
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE

View File

@@ -231,11 +231,11 @@ public:
virtual bool visit(ObjCSynthesizedPropertiesDeclarationAST *) { return true; } virtual bool visit(ObjCSynthesizedPropertiesDeclarationAST *) { return true; }
virtual bool visit(ObjCDynamicPropertiesDeclarationAST *) { return true; } virtual bool visit(ObjCDynamicPropertiesDeclarationAST *) { return true; }
virtual bool visit(ObjCFastEnumerationAST *) { return true; } virtual bool visit(ObjCFastEnumerationAST *) { return true; }
virtual bool visit(ObjCSynchronizedStatementAST *) { return true; }
virtual bool visit(DeclarationListAST *) { return true; } virtual bool visit(DeclarationListAST *) { return true; }
virtual void endVisit(DeclarationListAST *) { } virtual void endVisit(DeclarationListAST *) { }
virtual void endVisit(AccessDeclarationAST *) { } virtual void endVisit(AccessDeclarationAST *) { }
virtual void endVisit(ArrayAccessAST *) { } virtual void endVisit(ArrayAccessAST *) { }
virtual void endVisit(ArrayDeclaratorAST *) { } virtual void endVisit(ArrayDeclaratorAST *) { }
@@ -373,6 +373,7 @@ public:
virtual void endVisit(ObjCSynthesizedPropertiesDeclarationAST *) { } virtual void endVisit(ObjCSynthesizedPropertiesDeclarationAST *) { }
virtual void endVisit(ObjCDynamicPropertiesDeclarationAST *) { } virtual void endVisit(ObjCDynamicPropertiesDeclarationAST *) { }
virtual void endVisit(ObjCFastEnumerationAST *) { } virtual void endVisit(ObjCFastEnumerationAST *) { }
virtual void endVisit(ObjCSynchronizedStatementAST *) { }
private: private:
Control *_control; Control *_control;

View File

@@ -205,6 +205,7 @@ class ObjCSynthesizedPropertyListAST;
class ObjCSynthesizedPropertiesDeclarationAST; class ObjCSynthesizedPropertiesDeclarationAST;
class ObjCDynamicPropertiesDeclarationAST; class ObjCDynamicPropertiesDeclarationAST;
class ObjCFastEnumerationAST; class ObjCFastEnumerationAST;
class ObjCSynchronizedStatementAST;
CPLUSPLUS_END_NAMESPACE CPLUSPLUS_END_NAMESPACE
CPLUSPLUS_END_HEADER CPLUSPLUS_END_HEADER

View File

@@ -198,6 +198,10 @@ bool Parser::skipUntilStatement()
case T_USING: case T_USING:
return true; return true;
case T_AT_SYNCHRONIZED:
if (objCEnabled())
return true;
default: default:
consumeToken(); consumeToken();
} }
@@ -1932,6 +1936,10 @@ bool Parser::parseStatement(StatementAST *&node)
return true; return true;
} }
case T_AT_SYNCHRONIZED:
if (objCEnabled())
return parseObjCSynchronizedStatement(node);
default: default:
if (LA() == T_IDENTIFIER && LA(2) == T_COLON) if (LA() == T_IDENTIFIER && LA(2) == T_COLON)
return parseLabeledStatement(node); return parseLabeledStatement(node);
@@ -2894,6 +2902,23 @@ bool Parser::parseObjCStringLiteral(ExpressionAST *&node)
return true; return true;
} }
bool Parser::parseObjCSynchronizedStatement(StatementAST *&node)
{
if (LA() != T_AT_SYNCHRONIZED)
return false;
ObjCSynchronizedStatementAST *ast = new (_pool) ObjCSynchronizedStatementAST;
ast->synchronized_token = consumeToken();
match(T_LPAREN, &ast->lparen_token);
parseExpression(ast->synchronized_object);
match(T_RPAREN, &ast->rparen_token);
parseStatement(ast->statement);
node = ast;
return true;
}
bool Parser::parseObjCEncodeExpression(ExpressionAST *&node) bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
{ {
if (LA() != T_AT_ENCODE) if (LA() != T_AT_ENCODE)

View File

@@ -219,6 +219,7 @@ public:
bool parseObjCProtocol(DeclarationAST *&node, bool parseObjCProtocol(DeclarationAST *&node,
SpecifierAST *attributes = 0); SpecifierAST *attributes = 0);
bool parseObjCSynchronizedStatement(StatementAST *&node);
bool parseObjCEncodeExpression(ExpressionAST *&node); bool parseObjCEncodeExpression(ExpressionAST *&node);
bool parseObjCProtocolExpression(ExpressionAST *&node); bool parseObjCProtocolExpression(ExpressionAST *&node);
bool parseObjCSelectorExpression(ExpressionAST *&node); bool parseObjCSelectorExpression(ExpressionAST *&node);