diff --git a/clang/docs/LibASTMatchersReference.html b/clang/docs/LibASTMatchersReference.html --- a/clang/docs/LibASTMatchersReference.html +++ b/clang/docs/LibASTMatchersReference.html @@ -1236,7 +1236,7 @@ #pragma omp parallel ``ompDefaultClause()`` matches ``default(none)``, ``default(shared)``, -``default(private)`` and ``default(firstprivate)`` +`` default(private)`` and ``default(firstprivate)`` @@ -2036,6 +2036,14 @@ +
Matches ObjectiveC String literal expressions. + +Example matches @"abcd" + NSString *s = @"abcd"; +
Matches Objective-C statements. @@ -4716,8 +4724,8 @@
Matches if the OpenMP ``default`` clause has ``private`` kind ++ Matcher<OMPDefaultClause> isFirstPrivateKind - Matches if the OpenMP ``default`` clause has ``firstprivate`` kind specified. Given @@ -4729,12 +4737,12 @@ #pragma omp parallel default(firstprivate) ``ompDefaultClause(isFirstPrivateKind())`` matches only -``default(private)``. +``default(firstprivate)``.- Matcher<OMPDefaultClause> isFirstPrivateKind Matches if the OpenMP ``default`` clause has ``firstprivate`` kind -specified. + ++ Matcher<OMPDefaultClause> isNoneKind - Matches if the OpenMP ``default`` clause has ``none`` kind specified. Given @@ -4744,13 +4752,13 @@ #pragma omp parallel default(private) #pragma omp parallel default(firstprivate) -``ompDefaultClause(isFirstPrivateKind())`` matches only -``default(firstprivate)``. +``ompDefaultClause(isNoneKind())`` matches only ``default(none)``.- Matcher<OMPDefaultClause> isNoneKind - Matches if the OpenMP ``default`` clause has ``none`` kind specified. ++ Matcher<OMPDefaultClause> isPrivateKind @@ -7411,8 +7420,9 @@ Matches if the OpenMP ``default`` clause has ``private`` kind +specified. Given @@ -4760,7 +4768,8 @@ #pragma omp parallel default(private) #pragma omp parallel default(firstprivate) -``ompDefaultClause(isNoneKind())`` matches only ``default(none)``. +``ompDefaultClause(isPrivateKind())`` matches only +``default(private)``.- Matcher<ClassTemplateSpecializationDecl> forEachTemplateArgument Matcher<TemplateArgument> InnerMatcher Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. ++ Matcher<ClassTemplateSpecializationDecl> forEachTemplateArgument clang::ast_matchers::Matcher<TemplateArgument> InnerMatcher + Matches classTemplateSpecialization, templateSpecializationType and +functionDecl nodes where the template argument matches the inner matcher. This matcher may produce multiple matches. Given @@ -7427,10 +7437,8 @@ bool B = false; f(R, B); - templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) matches twice, with expr() matching 'R * 2' and 'R * 4' - functionDecl(forEachTemplateArgument(refersToType(builtinType()))) matches the specialization f<unsigned, bool> twice, for 'unsigned' and 'bool' @@ -8180,6 +8188,31 @@+ Matcher<FunctionDecl> forEachTemplateArgument clang::ast_matchers::Matcher<TemplateArgument> InnerMatcher + + Matches classTemplateSpecialization, templateSpecializationType and +functionDecl nodes where the template argument matches the inner matcher. +This matcher may produce multiple matches. + +Given + template <typename T, unsigned N, unsigned M> + struct Matrix {}; + + constexpr unsigned R = 2; + Matrix<int, R * 2, R * 4> M; + + template <typename T, typename U> + void f(T&& t, U&& u) {} + + bool B = false; + f(R, B); +templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) + matches twice, with expr() matching 'R * 2' and 'R * 4' +functionDecl(forEachTemplateArgument(refersToType(builtinType()))) + matches the specialization f<unsigned, bool> twice, for 'unsigned' + and 'bool' +Matcher<FunctionDecl> hasAnyBody Matcher<Stmt> InnerMatcher - Matches a function declaration that has a given body present in the AST. Note that this matcher matches all the declarations of a function whose @@ -8227,32 +8260,6 @@- Matcher<FunctionDecl> forEachTemplateArgument Matcher<TemplateArgument> InnerMatcher - - Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. -This matcher may produce multiple matches. - -Given - template <typename T, unsigned N, unsigned M> - struct Matrix {}; - - constexpr unsigned R = 2; - Matrix<int, R * 2, R * 4> M; - - template <typename T, typename U> - void f(T&& t, U&& u) {} - - bool B = false; - f(R, B); - -templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) - matches twice, with expr() matching 'R * 2' and 'R * 4' - -functionDecl(forEachTemplateArgument(refersToType(builtinType()))) - matches the specialization f<unsigned, bool> twice, for 'unsigned' - and 'bool' -Matcher<FunctionDecl> hasAnyTemplateArgument Matcher<TemplateArgument> InnerMatcher - Matches classTemplateSpecializations, templateSpecializationType and functionDecl that have at least one TemplateArgument matching the given @@ -9477,11 +9484,11 @@- Matcher<TemplateSpecializationType> forEachTemplateArgument Matcher<TemplateArgument> InnerMatcher Matches classTemplateSpecialization, templateSpecializationType and functionDecl nodes where the template argument matches the inner matcher. ++ Matcher<TemplateSpecializationType> forEachTemplateArgument clang::ast_matchers::Matcher<TemplateArgument> InnerMatcher Matches classTemplateSpecialization, templateSpecializationType and +functionDecl nodes where the template argument matches the inner matcher. This matcher may produce multiple matches. - Given template <typename T, unsigned N, unsigned M> struct Matrix {}; @@ -9494,10 +9501,8 @@ bool B = false; f(R, B); - templateSpecializationType(forEachTemplateArgument(isExpr(expr()))) matches twice, with expr() matching 'R * 2' and 'R * 4' - functionDecl(forEachTemplateArgument(refersToType(builtinType()))) matches the specialization f<unsigned, bool> twice, for 'unsigned' and 'bool' diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -565,6 +565,9 @@ - Added ``forEachTemplateArgument`` matcher which creates a match every time a ``templateArgument`` matches the matcher supplied to it. + +- Added ``objcStringLiteral`` matcher which matches ObjectiveC String + literal expressions. clang-format ------------ diff --git a/clang/include/clang/ASTMatchers/ASTMatchers.h b/clang/include/clang/ASTMatchers/ASTMatchers.h --- a/clang/include/clang/ASTMatchers/ASTMatchers.h +++ b/clang/include/clang/ASTMatchers/ASTMatchers.h @@ -1515,6 +1515,15 @@ extern const internal::VariadicDynCastAllOfMatcherobjcMessageExpr; +/// Matches ObjectiveC String literal expressions. +/// +/// Example matches @"abcd" +/// \code +/// NSString *s = @"abcd"; +/// \endcode +extern const internal::VariadicDynCastAllOfMatcher + objcStringLiteral; + /// Matches Objective-C interface declarations. /// /// Example matches Foo diff --git a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp --- a/clang/lib/ASTMatchers/ASTMatchersInternal.cpp +++ b/clang/lib/ASTMatchers/ASTMatchersInternal.cpp @@ -917,6 +917,7 @@ const internal::VariadicDynCastAllOfMatcher cxxBoolLiteral; const internal::VariadicDynCastAllOfMatcher stringLiteral; +const internal::VariadicDynCastAllOfMatcher objcStringLiteral; const internal::VariadicDynCastAllOfMatcher characterLiteral; const internal::VariadicDynCastAllOfMatcher diff --git a/clang/lib/ASTMatchers/Dynamic/Registry.cpp b/clang/lib/ASTMatchers/Dynamic/Registry.cpp --- a/clang/lib/ASTMatchers/Dynamic/Registry.cpp +++ b/clang/lib/ASTMatchers/Dynamic/Registry.cpp @@ -505,6 +505,7 @@ REGISTER_MATCHER(objcObjectPointerType); REGISTER_MATCHER(objcPropertyDecl); REGISTER_MATCHER(objcProtocolDecl); + REGISTER_MATCHER(objcStringLiteral); REGISTER_MATCHER(objcThrowStmt); REGISTER_MATCHER(objcTryStmt); REGISTER_MATCHER(ofClass); diff --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp --- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp +++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp @@ -2352,6 +2352,26 @@ argumentCountIs(0)))); } +TEST(ASTMatchersTestObjC, ObjCStringLiteral) { + + StringRef Objc1String = "@interface NSObject " + "@end " + "@interface NSString " + "@end " + "@interface Test : NSObject " + "+ (void)someFunction:(NSString *)Desc; " + "@end " + "@implementation Test " + "+ (void)someFunction:(NSString *)Desc { " + " return; " + "} " + "- (void) foo { " + " [Test someFunction:@\"Ola!\"]; " + "}\n" + "@end "; + EXPECT_TRUE(matchesObjC(Objc1String, objcStringLiteral())); +} + TEST(ASTMatchersTestObjC, ObjCDecls) { StringRef ObjCString = "@protocol Proto " "- (void)protoDidThing; "