[clang-tools-extra] 65d20e3 - [clang-tidy] Fix hungarian notation failed to indicate the number of asterisks in check-clang-extra-clang-tidy-checkers-readability
Piotr Zegar via cfe-commits
cfe-commits at lists.llvm.org
Mon Apr 10 23:43:21 PDT 2023
Author: Douglas Chen
Date: 2023-04-11T06:43:07Z
New Revision: 65d20e3296909169405f9286d2a2177a42789e06
URL: https://github.com/llvm/llvm-project/commit/65d20e3296909169405f9286d2a2177a42789e06
DIFF: https://github.com/llvm/llvm-project/commit/65d20e3296909169405f9286d2a2177a42789e06.diff
LOG: [clang-tidy] Fix hungarian notation failed to indicate the number of asterisks in check-clang-extra-clang-tidy-checkers-readability
Fix hungarian notation failed to indicate the number of asterisks for the pointers of multiple word types.
- WRONG: `unsigned char* value` : `value` --> `ucValue`
- RIGHT: `unsigned cahr* value` : `value` --> `pucValue`
- RIGHT: `unsigned char** value` : `value` --> `ppucValue`
Reviewed By: amurzeau, PiotrZSL
Differential Revision: https://reviews.llvm.org/D147779
Added:
Modified:
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
clang-tools-extra/docs/ReleaseNotes.rst
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-c-language.c
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-cfgfile.cpp
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index 81d05a8a93cd9..eeb0642baa100 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -339,6 +339,12 @@ std::string IdentifierNamingCheck::HungarianNotation::getDeclTypeName(
}
TypeName = Type.erase(0, Type.find_first_not_of(" "));
+ // Remove template parameters
+ const size_t Pos = Type.find("<");
+ if (Pos != std::string::npos) {
+ TypeName = Type.erase(Pos, Type.size() - Pos);
+ }
+
// Replace spaces with single space.
for (size_t Pos = 0; (Pos = Type.find(" ", Pos)) != std::string::npos;
Pos += strlen(" ")) {
@@ -364,11 +370,13 @@ std::string IdentifierNamingCheck::HungarianNotation::getDeclTypeName(
for (auto Kw : TailsOfMultiWordType) {
size_t Pos = Type.rfind(Kw.data());
if (Pos != std::string::npos) {
- Type = Type.substr(0, Pos + Kw.size());
+ const size_t PtrCount = getAsteriskCount(Type, ND);
+ Type = Type.substr(0, Pos + Kw.size() + PtrCount);
RedundantRemoved = true;
break;
}
}
+
TypeName = Type.erase(0, Type.find_first_not_of(" "));
if (!RedundantRemoved) {
std::size_t FoundSpace = Type.find(" ");
@@ -585,15 +593,7 @@ std::string IdentifierNamingCheck::HungarianNotation::getDataTypePrefix(
}
// Pointers
- size_t PtrCount = [&](std::string TypeName) -> size_t {
- size_t Pos = TypeName.find('*');
- size_t Count = 0;
- for (; Pos < TypeName.length(); Pos++, Count++) {
- if ('*' != TypeName[Pos])
- break;
- }
- return Count;
- }(ModifiedTypeName);
+ size_t PtrCount = getAsteriskCount(ModifiedTypeName);
if (PtrCount > 0) {
ModifiedTypeName = [&](std::string Str, StringRef From, StringRef To) {
size_t StartPos = 0;
@@ -691,6 +691,28 @@ std::string IdentifierNamingCheck::HungarianNotation::getEnumPrefix(
return Initial;
}
+size_t IdentifierNamingCheck::HungarianNotation::getAsteriskCount(
+ const std::string &TypeName) const {
+ size_t Pos = TypeName.find('*');
+ size_t Count = 0;
+ for (; Pos < TypeName.length(); Pos++, Count++) {
+ if ('*' != TypeName[Pos])
+ break;
+ }
+ return Count;
+}
+
+size_t IdentifierNamingCheck::HungarianNotation::getAsteriskCount(
+ const std::string &TypeName, const NamedDecl *ND) const {
+ size_t PtrCount = 0;
+ if (const auto *TD = dyn_cast<ValueDecl>(ND)) {
+ QualType QT = TD->getType();
+ if (QT->isPointerType())
+ PtrCount = getAsteriskCount(TypeName);
+ }
+ return PtrCount;
+}
+
void IdentifierNamingCheck::HungarianNotation::loadDefaultConfig(
IdentifierNamingCheck::HungarianNotationOption &HNOption) const {
diff --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
index b1db919902e22..f16de8bcc54ad 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
@@ -91,6 +91,11 @@ class IdentifierNamingCheck final : public RenamerClangTidyCheck {
bool checkOptionValid(int StyleKindIndex) const;
bool isOptionEnabled(StringRef OptionKey,
const llvm::StringMap<std::string> &StrMap) const;
+
+ size_t getAsteriskCount(const std::string &TypeName) const;
+ size_t getAsteriskCount(const std::string &TypeName,
+ const NamedDecl *ND) const;
+
void loadDefaultConfig(
IdentifierNamingCheck::HungarianNotationOption &HNOption) const;
void loadFileConfig(
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 9c5b86fc8606d..5fb6aa3240517 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -257,6 +257,10 @@ Changes in existing checks
behavior of using `i` as the prefix for enum tags, set the `EnumConstantPrefix`
option to `i` instead of using `EnumConstantHungarianPrefix`.
+- Fixed a hungarian notation issue in :doc:`readability-identifier-naming
+ <clang-tidy/checks/readability/identifier-naming>` which failed to indicate
+ the number of asterisks.
+
- Fixed a false positive in :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check warning would
be unnecessarily emitted for explicit cast using direct list initialization.
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-c-language.c b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-c-language.c
index 1e4e6d7b32726..abd7e1b8f275d 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-c-language.c
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-c-language.c
@@ -283,6 +283,14 @@ uint8_t *ValueU8Ptr;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: invalid case style for global pointer 'ValueU8Ptr' [readability-identifier-naming]
// CHECK-FIXES: {{^}}uint8_t *pu8ValueU8Ptr;
+unsigned char *ValueUcPtr;
+// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: invalid case style for global pointer 'ValueUcPtr' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char *pucValueUcPtr;
+
+unsigned char **ValueUcPtr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: invalid case style for global pointer 'ValueUcPtr2' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char **ppucValueUcPtr2;
+
void MyFunc2(void* Val){}
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for pointer parameter 'Val' [readability-identifier-naming]
// CHECK-FIXES: {{^}}void MyFunc2(void* pVal){}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-cfgfile.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-cfgfile.cpp
index 6e081500b1aa4..2026e1ff10872 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-cfgfile.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation-cfgfile.cpp
@@ -355,6 +355,14 @@ uint8_t *ValueU8Ptr;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: invalid case style for global pointer 'ValueU8Ptr' [readability-identifier-naming]
// CHECK-FIXES: {{^}}uint8_t *custpcustu8ValueU8Ptr;
+unsigned char *ValueUcPtr;
+// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: invalid case style for global pointer 'ValueUcPtr' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char *custpcustucValueUcPtr;
+
+unsigned char **ValueUcPtr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: invalid case style for global pointer 'ValueUcPtr2' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char **custpcustpcustucValueUcPtr2;
+
void MyFunc2(void* Val){}
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for pointer parameter 'Val' [readability-identifier-naming]
// CHECK-FIXES: {{^}}void MyFunc2(void* custpcustvVal){}
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation.cpp
index 1808441f8210c..10feff37f0899 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-hungarian-notation.cpp
@@ -355,6 +355,14 @@ uint8_t *ValueU8Ptr;
// CHECK-MESSAGES: :[[@LINE-1]]:10: warning: invalid case style for global pointer 'ValueU8Ptr' [readability-identifier-naming]
// CHECK-FIXES: {{^}}uint8_t *pu8ValueU8Ptr;
+unsigned char *ValueUcPtr;
+// CHECK-MESSAGES: :[[@LINE-1]]:16: warning: invalid case style for global pointer 'ValueUcPtr' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char *pucValueUcPtr;
+
+unsigned char **ValueUcPtr2;
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: invalid case style for global pointer 'ValueUcPtr2' [readability-identifier-naming]
+// CHECK-FIXES: {{^}}unsigned char **ppucValueUcPtr2;
+
void MyFunc2(void* Val){}
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for pointer parameter 'Val' [readability-identifier-naming]
// CHECK-FIXES: {{^}}void MyFunc2(void* pVal){}
More information about the cfe-commits
mailing list