forked from qt-creator/qt-creator
Added @synchronized parsing for Objective-C.
This commit is contained in:
@@ -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
|
||||||
|
@@ -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
|
||||||
|
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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;
|
||||||
|
@@ -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
|
||||||
|
@@ -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)
|
||||||
|
@@ -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);
|
||||||
|
Reference in New Issue
Block a user