10 #include "clang/AST/ASTContext.h"
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
17 namespace readability {
19 void RedundantAccessSpecifiersCheck::registerMatchers(MatchFinder *Finder) {
21 cxxRecordDecl(has(accessSpecDecl())).bind(
"redundant-access-specifiers"),
25 void RedundantAccessSpecifiersCheck::check(
26 const MatchFinder::MatchResult &Result) {
27 const auto *MatchedDecl =
28 Result.Nodes.getNodeAs<CXXRecordDecl>(
"redundant-access-specifiers");
30 const AccessSpecDecl *LastASDecl =
nullptr;
31 for (DeclContext::specific_decl_iterator<AccessSpecDecl>
32 AS(MatchedDecl->decls_begin()),
33 ASEnd(MatchedDecl->decls_end());
35 const AccessSpecDecl *ASDecl = *AS;
38 if (ASDecl->getLocation().isMacroID()) {
43 if (LastASDecl ==
nullptr) {
47 if (CheckFirstDeclaration) {
48 AccessSpecifier DefaultSpecifier =
49 MatchedDecl->isClass() ? AS_private : AS_public;
50 if (ASDecl->getAccess() == DefaultSpecifier) {
51 diag(ASDecl->getLocation(),
52 "redundant access specifier has the same accessibility as the "
53 "implicit access specifier")
54 << FixItHint::CreateRemoval(ASDecl->getSourceRange());
61 if (LastASDecl->getAccess() == ASDecl->getAccess()) {
63 if (LastASDecl->getLocation().isMacroID()) {
68 diag(ASDecl->getLocation(),
69 "redundant access specifier has the same accessibility as the "
70 "previous access specifier")
71 << FixItHint::CreateRemoval(ASDecl->getSourceRange());
72 diag(LastASDecl->getLocation(),
"previously declared here",