Add matcher for AccessSpecDecls.

Also, add matchers isPrivate(), isProtected() and isPublic(), that
restrict the matching of such AccessSpecDecls and all other Decls.

llvm-svn: 176017
This commit is contained in:
Daniel Jasper 2013-02-25 12:02:08 +00:00
parent b2ac280f96
commit 639522ca35
2 changed files with 103 additions and 0 deletions

View File

@ -192,6 +192,69 @@ const internal::VariadicDynCastAllOfMatcher<
Decl,
ClassTemplateSpecializationDecl> classTemplateSpecializationDecl;
/// \brief Matches C++ access specifier declarations.
///
/// Given
/// \code
/// class C {
/// public:
/// int a;
/// };
/// \endcode
/// accessSpecDecl()
/// matches 'public:'
const internal::VariadicDynCastAllOfMatcher<
Decl,
AccessSpecDecl> accessSpecDecl;
/// \brief Matches public C++ declarations.
///
/// Given
/// \code
/// class C {
/// public: int a;
/// protected: int b;
/// private: int c;
/// };
/// \endcode
/// fieldDecl(isPublic())
/// matches 'int a;'
AST_MATCHER(Decl, isPublic) {
return Node.getAccess() == AS_public;
}
/// \brief Matches protected C++ declarations.
///
/// Given
/// \code
/// class C {
/// public: int a;
/// protected: int b;
/// private: int c;
/// };
/// \endcode
/// fieldDecl(isProtected())
/// matches 'int b;'
AST_MATCHER(Decl, isProtected) {
return Node.getAccess() == AS_protected;
}
/// \brief Matches private C++ declarations.
///
/// Given
/// \code
/// class C {
/// public: int a;
/// protected: int b;
/// private: int c;
/// };
/// \endcode
/// fieldDecl(isPrivate())
/// matches 'int c;'
AST_MATCHER(Decl, isPrivate) {
return Node.getAccess() == AS_private;
}
/// \brief Matches classTemplateSpecializations that have at least one
/// TemplateArgument matching the given InnerMatcher.
///

View File

@ -1413,6 +1413,18 @@ TEST(Matcher, MatchesSpecificArgument) {
1, refersToType(asString("int"))))));
}
TEST(Matcher, MatchesAccessSpecDecls) {
EXPECT_TRUE(matches("class C { public: int i; };", accessSpecDecl()));
EXPECT_TRUE(
matches("class C { public: int i; };", accessSpecDecl(isPublic())));
EXPECT_TRUE(
notMatches("class C { public: int i; };", accessSpecDecl(isProtected())));
EXPECT_TRUE(
notMatches("class C { public: int i; };", accessSpecDecl(isPrivate())));
EXPECT_TRUE(notMatches("class C { int i; };", accessSpecDecl()));
}
TEST(Matcher, ConstructorCall) {
StatementMatcher Constructor = constructExpr();
@ -2283,6 +2295,34 @@ TEST(Member, MatchesMember) {
memberExpr(hasDeclaration(fieldDecl(hasType(isInteger()))))));
}
TEST(Member, UnderstandsAccess) {
EXPECT_TRUE(matches(
"struct A { int i; };", fieldDecl(isPublic(), hasName("i"))));
EXPECT_TRUE(notMatches(
"struct A { int i; };", fieldDecl(isProtected(), hasName("i"))));
EXPECT_TRUE(notMatches(
"struct A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
EXPECT_TRUE(notMatches(
"class A { int i; };", fieldDecl(isPublic(), hasName("i"))));
EXPECT_TRUE(notMatches(
"class A { int i; };", fieldDecl(isProtected(), hasName("i"))));
EXPECT_TRUE(matches(
"class A { int i; };", fieldDecl(isPrivate(), hasName("i"))));
EXPECT_TRUE(notMatches(
"class A { protected: int i; };", fieldDecl(isPublic(), hasName("i"))));
EXPECT_TRUE(matches("class A { protected: int i; };",
fieldDecl(isProtected(), hasName("i"))));
EXPECT_TRUE(notMatches(
"class A { protected: int i; };", fieldDecl(isPrivate(), hasName("i"))));
// Non-member decls have the AccessSpecifier AS_none and thus aren't matched.
EXPECT_TRUE(notMatches("int i;", varDecl(isPublic(), hasName("i"))));
EXPECT_TRUE(notMatches("int i;", varDecl(isProtected(), hasName("i"))));
EXPECT_TRUE(notMatches("int i;", varDecl(isPrivate(), hasName("i"))));
}
TEST(Member, MatchesMemberAllocationFunction) {
// Fails in C++11 mode
EXPECT_TRUE(matchesConditionally(