Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -1225,6 +1225,24 @@ +
Matches Objective-C @catch statements. + +Example matches @catch + @try {} + @catch (...) {} +
Matches Objective-C @finally statements. + +Example matches @finally + @try {} + @finally {} +
Matches ObjectiveC Message invocation expressions. @@ -1236,6 +1254,23 @@
Matches Objective-C @try statements. + +Example matches @throw + @throw obj; +
Matches Objective-C @try statements. + +Example matches @try + @try {} + @catch (...) {} +
Matches opaque value expressions. They are used as helpers to reference another expressions and can be met Index: include/clang/ASTMatchers/ASTMatchers.h =================================================================== --- include/clang/ASTMatchers/ASTMatchers.h +++ include/clang/ASTMatchers/ASTMatchers.h @@ -1265,6 +1265,49 @@ Decl, ObjCPropertyDecl> objcPropertyDecl; +/// \brief Matches Objective-C @try statements. +/// +/// Example matches @throw +/// \code +/// @throw obj; +/// \endcode +const internal::VariadicDynCastAllOfMatcher< + Stmt, + ObjCAtThrowStmt> objcThrowStmt; + +/// \brief Matches Objective-C @try statements. +/// +/// Example matches @try +/// \code +/// @try {} +/// @catch (...) {} +/// \endcode +const internal::VariadicDynCastAllOfMatcher< + Stmt, + ObjCAtTryStmt> objcTryStmt; + +/// \brief Matches Objective-C @catch statements. +/// +/// Example matches @catch +/// \code +/// @try {} +/// @catch (...) {} +/// \endcode +const internal::VariadicDynCastAllOfMatcher< + Stmt, + ObjCAtCatchStmt> objcCatchStmt; + +/// \brief Matches Objective-C @finally statements. +/// +/// Example matches @finally +/// \code +/// @try {} +/// @finally {} +/// \endcode +const internal::VariadicDynCastAllOfMatcher< + Stmt, + ObjCAtFinallyStmt> objcFinallyStmt; + /// \brief Matches expressions that introduce cleanups to be run at the end /// of the sub-expression's evaluation. /// Index: lib/ASTMatchers/Dynamic/Registry.cpp =================================================================== --- lib/ASTMatchers/Dynamic/Registry.cpp +++ lib/ASTMatchers/Dynamic/Registry.cpp @@ -388,8 +388,10 @@ REGISTER_MATCHER(nullStmt); REGISTER_MATCHER(numSelectorArgs); REGISTER_MATCHER(ofClass); + REGISTER_MATCHER(objcCatchStmt); REGISTER_MATCHER(objcCategoryDecl); REGISTER_MATCHER(objcCategoryImplDecl); + REGISTER_MATCHER(objcFinallyStmt); REGISTER_MATCHER(objcImplementationDecl); REGISTER_MATCHER(objcInterfaceDecl); REGISTER_MATCHER(objcIvarDecl); @@ -398,6 +400,8 @@ REGISTER_MATCHER(objcObjectPointerType); REGISTER_MATCHER(objcPropertyDecl); REGISTER_MATCHER(objcProtocolDecl); + REGISTER_MATCHER(objcThrowStmt); + REGISTER_MATCHER(objcTryStmt); REGISTER_MATCHER(on); REGISTER_MATCHER(onImplicitObjectArgument); REGISTER_MATCHER(opaqueValueExpr); Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp =================================================================== --- unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -1639,5 +1639,28 @@ objcPropertyDecl(hasName("enabled")))); } +TEST(ObjCStmtMatcher, ExceptionStmts) { + std::string ObjCString = + "void f(id obj) {" + " @try {" + " @throw obj;" + " } @catch (...) {" + " } @finally {}" + "}"; + + EXPECT_TRUE(matchesObjC( + ObjCString, + objcTryStmt())); + EXPECT_TRUE(matchesObjC( + ObjCString, + objcThrowStmt())); + EXPECT_TRUE(matchesObjC( + ObjCString, + objcCatchStmt())); + EXPECT_TRUE(matchesObjC( + ObjCString, + objcFinallyStmt())); +} + } // namespace ast_matchers } // namespace clang