Index: docs/LibASTMatchersReference.html =================================================================== --- docs/LibASTMatchersReference.html +++ docs/LibASTMatchersReference.html @@ -337,6 +337,15 @@ +
Matches Objective-C category declarations. + +Example matches Foo (Additions) + @interface Foo (Additions) + @end +
Matches Objective-C interface declarations. @@ -346,6 +355,50 @@
Matches Objective-C instance variable declarations.
+
+Example matches _enabled
+ @implementation Foo {
+ BOOL _enabled;
+ }
+ @end
+Matches Objective-C method declarations.
+
+Example matches both declaration and definition of -[Foo method]
+ @interface Foo
+ - (void)method;
+ @end
+
+ @implementation Foo
+ - (void)method {}
+ @end
+Matches Objective-C property declarations. + +Example matches enabled + @interface Foo + @property BOOL enabled; + @end +
Matches Objective-C protocol declarations. + +Example matches FooDelegate + @protocol FooDelegate + @end +
Matches parameter variable declarations.
Index: include/clang/ASTMatchers/ASTMatchers.h
===================================================================
--- include/clang/ASTMatchers/ASTMatchers.h
+++ include/clang/ASTMatchers/ASTMatchers.h
@@ -1118,6 +1118,69 @@
Decl,
ObjCInterfaceDecl> objcInterfaceDecl;
+/// \brief Matches Objective-C protocol declarations.
+///
+/// Example matches FooDelegate
+/// \code
+/// @protocol FooDelegate
+/// @end
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Decl,
+ ObjCProtocolDecl> objcProtocolDecl;
+
+/// \brief Matches Objective-C category declarations.
+///
+/// Example matches Foo (Additions)
+/// \code
+/// @interface Foo (Additions)
+/// @end
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Decl,
+ ObjCCategoryDecl> objcCategoryDecl;
+
+/// \brief Matches Objective-C method declarations.
+///
+/// Example matches both declaration and definition of -[Foo method]
+/// \code
+/// @interface Foo
+/// - (void)method;
+/// @end
+///
+/// @implementation Foo
+/// - (void)method {}
+/// @end
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Decl,
+ ObjCMethodDecl> objcMethodDecl;
+
+/// \brief Matches Objective-C instance variable declarations.
+///
+/// Example matches _enabled
+/// \code
+/// @implementation Foo {
+/// BOOL _enabled;
+/// }
+/// @end
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Decl,
+ ObjCIvarDecl> objcIvarDecl;
+
+/// \brief Matches Objective-C property declarations.
+///
+/// Example matches enabled
+/// \code
+/// @interface Foo
+/// @property BOOL enabled;
+/// @end
+/// \endcode
+const internal::VariadicDynCastAllOfMatcher<
+ Decl,
+ ObjCPropertyDecl> objcPropertyDecl;
+
/// \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
@@ -360,6 +360,11 @@
REGISTER_MATCHER(numSelectorArgs);
REGISTER_MATCHER(ofClass);
REGISTER_MATCHER(objcInterfaceDecl);
+ REGISTER_MATCHER(objcProtocolDecl);
+ REGISTER_MATCHER(objcCategoryDecl);
+ REGISTER_MATCHER(objcMethodDecl);
+ REGISTER_MATCHER(objcIvarDecl);
+ REGISTER_MATCHER(objcPropertyDecl);
REGISTER_MATCHER(objcMessageExpr);
REGISTER_MATCHER(objcObjectPointerType);
REGISTER_MATCHER(on);
Index: unittests/ASTMatchers/ASTMatchersNodeTest.cpp
===================================================================
--- unittests/ASTMatchers/ASTMatchersNodeTest.cpp
+++ unittests/ASTMatchers/ASTMatchersNodeTest.cpp
@@ -1498,7 +1498,9 @@
// don't find ObjCMessageExpr where none are present
EXPECT_TRUE(notMatchesObjC("", objcMessageExpr(anything())));
- std::string Objc1String =
+ std::string ObjCString =
+ "#pragma clang diagnostic ignored \"-Wobjc-root-class\"\n"
+ "#pragma clang diagnostic ignored \"-Wobjc-method-access\"\n"
"@interface Str "
" - (Str *)uppercaseString:(Str *)str;"
"@end "
@@ -1513,32 +1515,73 @@
"} "
"@end ";
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(anything())));
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(hasSelector("contents"))));
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(matchesSelector("cont*"))));
EXPECT_FALSE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(matchesSelector("?cont*"))));
EXPECT_TRUE(notMatchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(hasSelector("contents"), hasNullSelector())));
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(hasSelector("contents"), hasUnarySelector())));
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(hasSelector("contents"), numSelectorArgs(0))));
EXPECT_TRUE(matchesObjC(
- Objc1String,
+ ObjCString,
objcMessageExpr(matchesSelector("uppercase*"),
argumentCountIs(0)
)));
}
+TEST(ObjCDeclMacher, CoreDecls) {
+ std::string ObjCString =
+ "#pragma clang diagnostic ignored \"-Wobjc-root-class\"\n"
+ "@protocol Proto "
+ "- (void)protoDidThing; "
+ "@end "
+ "@interface Thing "
+ "@property int enabled; "
+ "@end "
+ "@interface Thing (ABC) "
+ "- (void)abc_doThing; "
+ "@end "
+ "@implementation Thing "
+ "{ id _ivar; } "
+ "- (void)anything {} "
+ "@end "
+ ;
+
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcProtocolDecl(hasName("Proto"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcCategoryDecl(hasName("ABC"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcMethodDecl(hasName("protoDidThing"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcMethodDecl(hasName("abc_doThing"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcMethodDecl(hasName("anything"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcIvarDecl(hasName("_ivar"))));
+ EXPECT_TRUE(matchesObjC(
+ ObjCString,
+ objcPropertyDecl(hasName("enabled"))));
+}
+
} // namespace ast_matchers
} // namespace clang
Index: unittests/ASTMatchers/ASTMatchersTest.h
===================================================================
--- unittests/ASTMatchers/ASTMatchersTest.h
+++ unittests/ASTMatchers/ASTMatchersTest.h
@@ -120,7 +120,7 @@
const T &AMatcher) {
return matchesConditionally(
Code, AMatcher, true,
- "", FileContentMappings(), "input.m");
+ "-fobjc-runtime=macosx", FileContentMappings(), "input.m");
}
template
@@ -148,7 +148,7 @@
const T &AMatcher) {
return matchesConditionally(
Code, AMatcher, false,
- "", FileContentMappings(), "input.m");
+ "-fobjc-runtime=macosx", FileContentMappings(), "input.m");
}