10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 12 #include "llvm/ADT/StringExtras.h" 13 #include "llvm/ADT/StringRef.h" 26 AST_MATCHER(VarDecl, isLocalVariable) {
return Node.isLocalVarDecl(); }
28 FixItHint generateFixItHint(
const VarDecl *Decl,
bool IsConst) {
29 if (IsConst && (Decl->getStorageClass() != SC_Static)) {
35 char FC = Decl->getName()[0];
36 if (!llvm::isAlpha(FC) || Decl->getName().size() == 1) {
43 char SC = Decl->getName()[1];
44 if ((FC ==
'k' || FC ==
'g') && !llvm::isAlpha(SC)) {
51 auto NewName = (IsConst ?
"k" :
"g") +
52 llvm::StringRef(std::string(1, FC)).upper() +
53 Decl->getName().substr(1).str();
55 return FixItHint::CreateReplacement(
57 llvm::StringRef(NewName));
61 void GlobalVariableDeclarationCheck::registerMatchers(MatchFinder *Finder) {
63 if (!getLangOpts().ObjC)
74 varDecl(hasGlobalStorage(), unless(hasType(isConstQualified())),
75 unless(isLocalVariable()), unless(matchesName(
"::g[A-Z]")))
78 Finder->addMatcher(varDecl(hasGlobalStorage(), hasType(isConstQualified()),
79 unless(isLocalVariable()),
80 unless(matchesName(
"::(k[A-Z])|([A-Z][A-Z0-9])")))
81 .bind(
"global_const"),
85 void GlobalVariableDeclarationCheck::check(
86 const MatchFinder::MatchResult &
Result) {
87 if (
const auto *Decl = Result.Nodes.getNodeAs<VarDecl>(
"global_var")) {
88 if (Decl->isStaticDataMember())
90 diag(Decl->getLocation(),
91 "non-const global variable '%0' must have a name which starts with " 93 << Decl->getName() << generateFixItHint(Decl,
false);
95 if (
const auto *Decl = Result.Nodes.getNodeAs<VarDecl>(
"global_const")) {
96 if (Decl->isStaticDataMember())
98 diag(Decl->getLocation(),
99 "const global variable '%0' must have a name which starts with " 100 "an appropriate prefix")
101 << Decl->getName() << generateFixItHint(Decl,
true);
AST_MATCHER(Expr, isMacroID)
llvm::Optional< Range > getTokenRange(const SourceManager &SM, const LangOptions &LangOpts, SourceLocation TokLoc)
Returns the taken range at TokLoc.
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
llvm::Optional< llvm::Expected< tooling::AtomicChanges > > Result