forked from OSchip/llvm-project
Revise the google-objc-global-variable-declaration check to match the style guide.
Summary: Revise the google-objc-global-variable-declaration check to match the style guide. This commit updates the check as follows: (1) Do not emit fixes for extern global constants. (2) Allow the second character of prefixes for constants to be numeric (the new guideline is that global constants should generally be named with a prefix that begins with a capital letter followed by one or more capital letters or numbers). https://google.github.io/styleguide/objcguide.html#prefixes Contributed by yaqiji. Reviewers: Wizard, benhamilton, stephanemoore Reviewed By: benhamilton, stephanemoore Subscribers: mgorny, cfe-commits, yaqiji Tags: #clang Differential Revision: https://reviews.llvm.org/D62045 llvm-svn: 361907
This commit is contained in:
parent
860736cc3c
commit
12e3726fad
|
@ -23,11 +23,15 @@ namespace objc {
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
AST_MATCHER(VarDecl, isLocalVariable) {
|
AST_MATCHER(VarDecl, isLocalVariable) { return Node.isLocalVarDecl(); }
|
||||||
return Node.isLocalVarDecl();
|
|
||||||
}
|
|
||||||
|
|
||||||
FixItHint generateFixItHint(const VarDecl *Decl, bool IsConst) {
|
FixItHint generateFixItHint(const VarDecl *Decl, bool IsConst) {
|
||||||
|
if (IsConst && (Decl->getStorageClass() != SC_Static)) {
|
||||||
|
// No fix available if it is not a static constant, since it is difficult
|
||||||
|
// to determine the proper fix in this case.
|
||||||
|
return FixItHint();
|
||||||
|
}
|
||||||
|
|
||||||
char FC = Decl->getName()[0];
|
char FC = Decl->getName()[0];
|
||||||
if (!llvm::isAlpha(FC) || Decl->getName().size() == 1) {
|
if (!llvm::isAlpha(FC) || Decl->getName().size() == 1) {
|
||||||
// No fix available if first character is not alphabetical character, or it
|
// No fix available if first character is not alphabetical character, or it
|
||||||
|
@ -38,14 +42,16 @@ FixItHint generateFixItHint(const VarDecl *Decl, bool IsConst) {
|
||||||
}
|
}
|
||||||
char SC = Decl->getName()[1];
|
char SC = Decl->getName()[1];
|
||||||
if ((FC == 'k' || FC == 'g') && !llvm::isAlpha(SC)) {
|
if ((FC == 'k' || FC == 'g') && !llvm::isAlpha(SC)) {
|
||||||
// No fix available if the prefix is correct but the second character is not
|
// No fix available if the prefix is correct but the second character is
|
||||||
// alphabetical, since it is difficult to determine the proper fix in this
|
// not alphabetical, since it is difficult to determine the proper fix in
|
||||||
// case.
|
// this case.
|
||||||
return FixItHint();
|
return FixItHint();
|
||||||
}
|
}
|
||||||
|
|
||||||
auto NewName = (IsConst ? "k" : "g") +
|
auto NewName = (IsConst ? "k" : "g") +
|
||||||
llvm::StringRef(std::string(1, FC)).upper() +
|
llvm::StringRef(std::string(1, FC)).upper() +
|
||||||
Decl->getName().substr(1).str();
|
Decl->getName().substr(1).str();
|
||||||
|
|
||||||
return FixItHint::CreateReplacement(
|
return FixItHint::CreateReplacement(
|
||||||
CharSourceRange::getTokenRange(SourceRange(Decl->getLocation())),
|
CharSourceRange::getTokenRange(SourceRange(Decl->getLocation())),
|
||||||
llvm::StringRef(NewName));
|
llvm::StringRef(NewName));
|
||||||
|
@ -71,7 +77,7 @@ void GlobalVariableDeclarationCheck::registerMatchers(MatchFinder *Finder) {
|
||||||
this);
|
this);
|
||||||
Finder->addMatcher(varDecl(hasGlobalStorage(), hasType(isConstQualified()),
|
Finder->addMatcher(varDecl(hasGlobalStorage(), hasType(isConstQualified()),
|
||||||
unless(isLocalVariable()),
|
unless(isLocalVariable()),
|
||||||
unless(matchesName("::(k[A-Z]|[A-Z]{2,})")))
|
unless(matchesName("::(k[A-Z])|([A-Z][A-Z0-9])")))
|
||||||
.bind("global_const"),
|
.bind("global_const"),
|
||||||
this);
|
this);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
// RUN: %check_clang_tidy %s google-objc-global-variable-declaration %t
|
// RUN: %check_clang_tidy %s google-objc-global-variable-declaration %t
|
||||||
|
|
||||||
@class NSString;
|
@class NSString;
|
||||||
|
|
||||||
static NSString* const myConstString = @"hello";
|
static NSString* const myConstString = @"hello";
|
||||||
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'myConstString' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'myConstString' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
// CHECK-FIXES: static NSString* const kMyConstString = @"hello";
|
// CHECK-FIXES: static NSString* const kMyConstString = @"hello";
|
||||||
|
|
||||||
|
extern NSString* const GlobalConstant = @"hey";
|
||||||
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'GlobalConstant' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
|
|
||||||
static NSString* MyString = @"hi";
|
static NSString* MyString = @"hi";
|
||||||
// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: non-const global variable 'MyString' must have a name which starts with 'g[A-Z]' [google-objc-global-variable-declaration]
|
// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: non-const global variable 'MyString' must have a name which starts with 'g[A-Z]' [google-objc-global-variable-declaration]
|
||||||
// CHECK-FIXES: static NSString* gMyString = @"hi";
|
// CHECK-FIXES: static NSString* gMyString = @"hi";
|
||||||
|
@ -25,13 +29,23 @@ static NSString* const _notAlpha = @"NotBeginWithAlpha";
|
||||||
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable '_notAlpha' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable '_notAlpha' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
// CHECK-FIXES: static NSString* const _notAlpha = @"NotBeginWithAlpha";
|
// CHECK-FIXES: static NSString* const _notAlpha = @"NotBeginWithAlpha";
|
||||||
|
|
||||||
|
static NSString* const notCap = @"NotBeginWithCap";
|
||||||
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'notCap' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
|
// CHECK-FIXES: static NSString* const kNotCap = @"NotBeginWithCap";
|
||||||
|
|
||||||
static NSString* const k_Alpha = @"SecondNotAlpha";
|
static NSString* const k_Alpha = @"SecondNotAlpha";
|
||||||
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'k_Alpha' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'k_Alpha' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
// CHECK-FIXES: static NSString* const k_Alpha = @"SecondNotAlpha";
|
// CHECK-FIXES: static NSString* const k_Alpha = @"SecondNotAlpha";
|
||||||
|
|
||||||
|
static NSString* const SecondNotCap = @"SecondNotCapOrNumber";
|
||||||
|
// CHECK-MESSAGES: :[[@LINE-1]]:24: warning: const global variable 'SecondNotCap' must have a name which starts with an appropriate prefix [google-objc-global-variable-declaration]
|
||||||
|
// CHECK-FIXES: static NSString* const kSecondNotCap = @"SecondNotCapOrNumber";
|
||||||
|
|
||||||
static NSString* const kGood = @"hello";
|
static NSString* const kGood = @"hello";
|
||||||
static NSString* const XYGood = @"hello";
|
static NSString* const XYGood = @"hello";
|
||||||
|
static NSString* const X1Good = @"hello";
|
||||||
static NSString* gMyIntGood = 0;
|
static NSString* gMyIntGood = 0;
|
||||||
|
extern NSString* Y2Good;
|
||||||
|
|
||||||
extern NSString* const GTLServiceErrorDomain;
|
extern NSString* const GTLServiceErrorDomain;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue