зеркало из https://github.com/microsoft/clang-1.git
Add matcher for AccessSpecDecls.
Also, add matchers isPrivate(), isProtected() and isPublic(), that restrict the matching of such AccessSpecDecls and all other Decls. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@176017 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Родитель
6c5038cf84
Коммит
f3197e9eb0
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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(
|
||||
|
|
Загрузка…
Ссылка в новой задаче