diff options
author | Alexander Kornienko <alexfh@google.com> | 2017-04-26 16:39:11 +0000 |
---|---|---|
committer | Alexander Kornienko <alexfh@google.com> | 2017-04-26 16:39:11 +0000 |
commit | eec01adde3ac789fe5e032ce34da3b2266830308 (patch) | |
tree | d9e2475dc9619d34105abb8207187793965bf2ae | |
parent | a84ae0b943bacec50f952a30461bdfa9d482ead1 (diff) | |
download | bcm5719-llvm-eec01adde3ac789fe5e032ce34da3b2266830308.tar.gz bcm5719-llvm-eec01adde3ac789fe5e032ce34da3b2266830308.zip |
[clang-tidy] Update IdentifierNamingCheck to remove extra leading/trailing underscores
Summary:
The goal of this change is to fix the following suboptimal replacements currently suggested by clang-tidy:
```
// with MemberPrefix == "_"
int __foo; // accepted without complaint
```
```
// with MemberPrefix == "m_"
int _foo;
^~~~~~
m__foo
```
I fixed this by
- updating `matchesStyle()` to reject names which have a leading underscore after a prefix has already been stripped, or a trailing underscore if a suffix has already been stripped;
- updating `fixupWithStyle()` to strip leading & trailing underscores before adding the user-defined prefix and suffix.
The replacements are now:
```
// MemberPrefix == "_"
int __foo;
^~~~~~
_foo
```
```
// MemberPrefix == "m_"
int _foo;
^~~~~
m_foo
```
Future improvements might elect to add .clang-tidy flags to improve what is being stripped. For instance, stripping `m_` could allow `m_foo` to be automatically replaced with `_foo`.
Reviewers: alexfh
Reviewed By: alexfh
Subscribers: cfe-commits
Patch by Jacob Bandes-Storch!
Differential Revision: https://reviews.llvm.org/D32333
llvm-svn: 301431
-rw-r--r-- | clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | 15 | ||||
-rw-r--r-- | clang-tools-extra/test/clang-tidy/readability-identifier-naming.cpp | 3 |
2 files changed, 14 insertions, 4 deletions
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp index 3502a6fdef4..175feea0faa 100644 --- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp @@ -262,6 +262,11 @@ static bool matchesStyle(StringRef Name, else Matches = false; + // Ensure the name doesn't have any extra underscores beyond those specified + // in the prefix and suffix. + if (Name.startswith("_") || Name.endswith("_")) + Matches = false; + if (Style.Case && !Matchers[static_cast<size_t>(*Style.Case)].match(Name)) Matches = false; @@ -367,10 +372,12 @@ static std::string fixupWithCase(StringRef Name, static std::string fixupWithStyle(StringRef Name, const IdentifierNamingCheck::NamingStyle &Style) { - return Style.Prefix + - fixupWithCase(Name, Style.Case.getValueOr( - IdentifierNamingCheck::CaseType::CT_AnyCase)) + - Style.Suffix; + const std::string Fixed = fixupWithCase( + Name, Style.Case.getValueOr(IdentifierNamingCheck::CaseType::CT_AnyCase)); + StringRef Mid = StringRef(Fixed).trim("_"); + if (Mid.empty()) + Mid = "_"; + return (Style.Prefix + Mid + Style.Suffix).str(); } static StyleKind findStyleKind( diff --git a/clang-tools-extra/test/clang-tidy/readability-identifier-naming.cpp b/clang-tools-extra/test/clang-tidy/readability-identifier-naming.cpp index 30a109bbcfd..60bd69a4090 100644 --- a/clang-tools-extra/test/clang-tidy/readability-identifier-naming.cpp +++ b/clang-tools-extra/test/clang-tidy/readability-identifier-naming.cpp @@ -175,6 +175,9 @@ private: int member2 = 2; // CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for private member 'member2' // CHECK-FIXES: {{^}} int __member2 = 2;{{$}} + int _memberWithExtraUnderscores_ = 42; +// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for private member '_memberWithExtraUnderscores_' +// CHECK-FIXES: {{^}} int __memberWithExtraUnderscores = 42;{{$}} private: int private_member = 3; |