10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 17 namespace readability {
19 void RedundantAccessSpecifiersCheck::registerMatchers(MatchFinder *Finder) {
20 if (!getLangOpts().CPlusPlus)
24 cxxRecordDecl(has(accessSpecDecl())).bind(
"redundant-access-specifiers"),
28 void RedundantAccessSpecifiersCheck::check(
29 const MatchFinder::MatchResult &Result) {
30 const auto *MatchedDecl =
31 Result.Nodes.getNodeAs<CXXRecordDecl>(
"redundant-access-specifiers");
33 const AccessSpecDecl *LastASDecl =
nullptr;
34 for (DeclContext::specific_decl_iterator<AccessSpecDecl>
35 AS(MatchedDecl->decls_begin()),
36 ASEnd(MatchedDecl->decls_end());
38 const AccessSpecDecl *ASDecl = *AS;
41 if (ASDecl->getLocation().isMacroID()) {
46 if (LastASDecl ==
nullptr) {
50 if (CheckFirstDeclaration) {
51 AccessSpecifier DefaultSpecifier =
52 MatchedDecl->isClass() ? AS_private : AS_public;
53 if (ASDecl->getAccess() == DefaultSpecifier) {
54 diag(ASDecl->getLocation(),
55 "redundant access specifier has the same accessibility as the " 56 "implicit access specifier")
57 << FixItHint::CreateRemoval(ASDecl->getSourceRange());
64 if (LastASDecl->getAccess() == ASDecl->getAccess()) {
66 if (LastASDecl->getLocation().isMacroID()) {
71 diag(ASDecl->getLocation(),
72 "redundant access specifier has the same accessibility as the " 73 "previous access specifier")
74 << FixItHint::CreateRemoval(ASDecl->getSourceRange());
75 diag(LastASDecl->getLocation(),
"previously declared here",
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//