forked from qt-creator/qt-creator
C++: Add parser support for @throw statements.
Change-Id: I366733ec821ee264f182f4d4a3cf69cdada20cfc Reviewed-by: Nikolai Kosjar <nikolai.kosjar@digia.com>
This commit is contained in:
committed by
Nikolai Kosjar
parent
a32343b96e
commit
c2d2173934
23
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
23
src/libs/3rdparty/cplusplus/Parser.cpp
vendored
@@ -335,6 +335,7 @@ bool Parser::skipUntilStatement()
|
|||||||
|
|
||||||
case T_AT_TRY:
|
case T_AT_TRY:
|
||||||
case T_AT_SYNCHRONIZED:
|
case T_AT_SYNCHRONIZED:
|
||||||
|
case T_AT_THROW:
|
||||||
if (objCEnabled())
|
if (objCEnabled())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@@ -3113,6 +3114,9 @@ bool Parser::parseStatement(StatementAST *&node)
|
|||||||
case T_AT_SYNCHRONIZED:
|
case T_AT_SYNCHRONIZED:
|
||||||
return objCEnabled() && parseObjCSynchronizedStatement(node);
|
return objCEnabled() && parseObjCSynchronizedStatement(node);
|
||||||
|
|
||||||
|
case T_AT_THROW:
|
||||||
|
return objCEnabled() && parseObjCThrowStatement(node);
|
||||||
|
|
||||||
case T_Q_D:
|
case T_Q_D:
|
||||||
case T_Q_Q: {
|
case T_Q_Q: {
|
||||||
QtMemberDeclarationAST *ast = new (_pool) QtMemberDeclarationAST;
|
QtMemberDeclarationAST *ast = new (_pool) QtMemberDeclarationAST;
|
||||||
@@ -4452,6 +4456,8 @@ bool Parser::parseObjCTryStatement(StatementAST *& /*node*/)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// objc-synchronized-statement:
|
||||||
|
/// @synchronized expression ;
|
||||||
bool Parser::parseObjCSynchronizedStatement(StatementAST *&node)
|
bool Parser::parseObjCSynchronizedStatement(StatementAST *&node)
|
||||||
{
|
{
|
||||||
DEBUG_THIS_RULE();
|
DEBUG_THIS_RULE();
|
||||||
@@ -4470,6 +4476,23 @@ bool Parser::parseObjCSynchronizedStatement(StatementAST *&node)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// objc-throw-statement:
|
||||||
|
/// @ throw expression ;
|
||||||
|
bool Parser::parseObjCThrowStatement(StatementAST *&/*node*/)
|
||||||
|
{
|
||||||
|
DEBUG_THIS_RULE();
|
||||||
|
if (LA() != T_AT_THROW)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*throw_token =*/ consumeToken();
|
||||||
|
ExpressionAST *thrown_expression;
|
||||||
|
parseExpression(thrown_expression);
|
||||||
|
unsigned semicolon_token;
|
||||||
|
match(T_SEMICOLON, &semicolon_token);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
|
bool Parser::parseObjCEncodeExpression(ExpressionAST *&node)
|
||||||
{
|
{
|
||||||
DEBUG_THIS_RULE();
|
DEBUG_THIS_RULE();
|
||||||
|
|||||||
1
src/libs/3rdparty/cplusplus/Parser.h
vendored
1
src/libs/3rdparty/cplusplus/Parser.h
vendored
@@ -224,6 +224,7 @@ public:
|
|||||||
|
|
||||||
bool parseObjCTryStatement(StatementAST *&node);
|
bool parseObjCTryStatement(StatementAST *&node);
|
||||||
bool parseObjCSynchronizedStatement(StatementAST *&node);
|
bool parseObjCSynchronizedStatement(StatementAST *&node);
|
||||||
|
bool parseObjCThrowStatement(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);
|
||||||
|
|||||||
@@ -162,6 +162,7 @@ private slots:
|
|||||||
void objc_try_statement_1();
|
void objc_try_statement_1();
|
||||||
void objc_try_statement_2();
|
void objc_try_statement_2();
|
||||||
void objc_try_statement_3();
|
void objc_try_statement_3();
|
||||||
|
void objc_throw_statement();
|
||||||
|
|
||||||
// expressions with (square) brackets
|
// expressions with (square) brackets
|
||||||
void normal_array_access();
|
void normal_array_access();
|
||||||
@@ -1437,6 +1438,22 @@ void tst_AST::objc_try_statement_3()
|
|||||||
QCOMPARE(diag.errorCount, 0);
|
QCOMPARE(diag.errorCount, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tst_AST::objc_throw_statement()
|
||||||
|
{
|
||||||
|
QSharedPointer<TranslationUnit> unit(
|
||||||
|
parseDeclaration(
|
||||||
|
"void tst() {\n"
|
||||||
|
" NSException *up = [NSException exceptionWithName:@\"NoException\"\n"
|
||||||
|
" reason:@\"No Reason :-)\"\n"
|
||||||
|
" userInfo:nil];\n"
|
||||||
|
" @throw up;\n"
|
||||||
|
"}\n"
|
||||||
|
));
|
||||||
|
AST *ast = unit->ast();
|
||||||
|
QVERIFY(ast);
|
||||||
|
QCOMPARE(diag.errorCount, 0);
|
||||||
|
}
|
||||||
|
|
||||||
void tst_AST::normal_array_access()
|
void tst_AST::normal_array_access()
|
||||||
{
|
{
|
||||||
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
|
QSharedPointer<TranslationUnit> unit(parseDeclaration("\n"
|
||||||
|
|||||||
Reference in New Issue
Block a user