Add IdentifierNamingCheck::CaseType, CT_HungarianNotation, supporting naming check with Hungarian notation.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Unit Tests
Time | Test | |
---|---|---|
400 ms | linux > HWAddressSanitizer-x86_64.TestCases::sizes.cpp |
Event Timeline
Reply code review suggestions. I will upload my change later.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
466 | OK~ I moved the HNOption to IdentifierNamingCheck class as its private data member. Then give value by constructor initializer list (instead of clearAll()). | |
522–523 | OK. | |
523 | OK~ Thank you. I will check them. | |
524 | OK. | |
526 | OK. | |
526–527 | Sure! it's what should I do, you have helped me a lots. | |
531 | Nice, thank you. | |
538–545 | OK. | |
549–553 | YES. I get the its QualType from EnumConstantDecl::getType(). Then get EnumDecl name via QualType::getAsString() (if enum tag name is "DataType", the string I get is "enum DataType"). static std::string getHungarianNotationEnumPrefix(const EnumConstantDecl *ECD) { std::string Name = ECD->getType().getAsString(); // ... } | |
590 | OK. | |
591 | OK, thank you. |
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
229 | This function can be called multiple times per translation unit when looking through header files if GetConfigPerFile is enabled. Making this static will mean that each file thats read could potentially alter other files style configuration. | |
434–449 | This isn't really needed if you have the mapping defined, Options.get works with enums, just look at how CaseType is parsed and stored. If you want to map multiple strings to a single enum constant that can also work by putting both strings in the mapping. |
- Removed clearAll() function and made the HPOption variable passing by value(origin is std::move()).
- Moved static HNOption variable from static getNamingStyles() function to IdentifierNamingCheck class a private data member.
- Replaced auto keyword with explicit std::string.
- Elided braces around single-line.
- Used CXXRecordDecl::isAbstract() directly.
- changed const auto to const auto * for pointer objects.
- Enhanced test case for enum with two EnumConstant decls.
- Removed unnecessary clang:: namespace for variables.
- Executed arc lint
- Final changes.
- Executed arc lint
- Applied all patches with the trunk(1800b44651c19b11e7680f908344d5751e8d2246).
- Moved HNOption pointer out of NamingStyle data structure.
- Removed parseHungarianPrefix() function, use Options.get() instead.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
123 | Is this line needed? | |
233 | As you never use map like access for this, shouldn't it be an array. | |
358 | ||
360 | However for this I can see that its mapping the same options as Options in getHungarianNotationDefaultConfig(). A similar approach could be made with HNDerviedTypes | |
361–362 | Building these temporary strings is expensive. Better off having a SmallString contsructed outside the loop and fill the string for each iteration, saved on allocations. | |
416 | ||
712 |
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
123 | I will remove it. Thank you. | |
233 | Thank you. I will change it. | |
360 | I will move HNOpts and HNDerviedTypes outward to the top of the getHungarianNotationDefaultConfig() function. If the arrays are defined as static, is there any difference btw inside or outside of function, or did I misunderstand your meaning? | |
361–362 | Good idea, thank you. |
- Fixed build failure on BuildBot. (Touch empty data from Options.get())
- Changed llvm::StringMap with std::pair in getHungarianNotationDefaultConfig().
- Moved HNOpts and HNDerviedTypes declarations out of getHungarianNotationDefaultConfig().
- Reused SmallString<128> for string concatenation.
- Removed redundant m(HungarianNotation) in #define NAMING_KEYS(m).
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
237 | Usual style is to elide braces for single-line if statements (applies elsewhere in the patch as well). | |
254 | One thing that confused me was the plain char and wchar_t entries -- those are for arrays of char and wchar_t, aren't they? Can we use char[] to make that more clear? If not, can you add a comment to clarify? | |
376–380 | Similar question here as above, but less pressing because we at least have the word "array" nearby. | |
421–422 | ||
431 | Formatting | |
591–592 | ||
602–603 | ||
667 | ||
678–680 | No need to check for CXXMethodDecl because those inherit from FunctionDecl anyway. | |
694 | I think EOL should probably be const char * and can remove remove all these const_cast<>? | |
781 | I think this switch should be replaced with: if (const auto *ECD = dyn_cast<EnumConstantDecl>(ND)) { ... } else if (const auto *CRD = dyn_cast<CXXRecordDecl>(ND)) { ... } else if (isa<VarDecl, FieldDecl, RecordDecl>(ND)) { ... } | |
786 | Can remove all of the if (ND) in this method -- we already early return if ND == nullptr. | |
826–827 | ||
874 | ||
1038 | ||
1348 | There's no need to pass a StringRef by const reference -- they pass like a pointer type already. | |
1389 | And can remove the declaration of TypeName above. Also, can you correct the formatting issues, elsewhere as well. | |
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h | ||
125 | Might as well clear up this lint warning. | |
clang-tools-extra/clangd/refactor/tweaks/AddUsing.cpp | ||
55 | This change looks unrelated to the patch? | |
clang-tools-extra/clangd/refactor/tweaks/DefineOutline.cpp | ||
363 | Same here? | |
clang-tools-extra/clangd/refactor/tweaks/RemoveUsingNamespace.cpp | ||
41 | And these changes as well? | |
clang-tools-extra/docs/clang-tidy/checks/readability-identifier-naming.rst | ||
110 | For all of these, I'd recommend a slight wording tweak to: When enabled, the check ensures that the declared identifier will have a Hungarian notation prefix based on the declared type. | |
2264–2265 | I would remove this paragraph as it doesn't really add much value (it effectively says that the option works well with other options, but that's already expected). | |
2312 | ||
2315 | ||
2318 | ||
2321–2322 | ||
lldb/include/lldb/Target/Process.h | ||
565 | All the changes in this file are unrelated. | |
lldb/source/Target/Process.cpp | ||
532 | Unrelated changes. | |
llvm/lib/Target/SystemZ/SystemZISelLowering.cpp | ||
167 | All the changes in this file are unrelated. | |
llvm/lib/Target/SystemZ/SystemZISelLowering.h | ||
54 | Unrelated changes. | |
llvm/lib/Target/SystemZ/SystemZInstrInfo.td | ||
835 | All the changes in this file are unrelated. | |
llvm/lib/Target/SystemZ/SystemZInstrVector.td | ||
574 | Unrelated changes. | |
llvm/lib/Target/SystemZ/SystemZOperators.td | ||
669 | All the changes in this file are unrelated. | |
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | ||
15 | All the changes in this file are unrelated. |
Hi @aaron.ballman, thank you for your feedback. I will update my change later. Unrelated change were mixed with other commits when I against git master. I did it again then the problem was gone. I found the command, arc diff master --preview, knowing exactly changes before uploading diff by arc.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
254 | I improved it. It will look like the following: static constexpr std::pair<StringRef, StringRef> CStrings[] = { {"char*", "sz"}, {"char[]", "sz"}, {"wchar_t*", "wsz"}, {"wchar_t[]", "wsz"}}; | |
376–380 | Improved here too. It will change to: static constexpr std::pair<StringRef, StringRef> HNCStrings[] = { {"CharPrinter", "char*"}, {"CharArray", "char[]"}, {"WideCharPrinter", "wchar_t*"}, {"WideCharArray", "wchar_t[]"}}; | |
431 | OK. I checked all the range including single-line if statements, and passing StringRef directly(not its reference). |
- Improved code review suggestions from Aaron Ballman(aaron.ballman). Including document, single-line if statements, no reference with StringRef, "char"-->"char[]" for HNOption.CString, use llvm::transform insteads of for-loop to uppercase string, don't check CXXMethod in getDeclTypeName(), remove const_cast<char *> in getDeclTypeName(), use if-else insteads of switch-case(simplify src).
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
617 | Returning {} as default initializer will be better. Same in other places. |
Hi @aaron.ballman and @Eugene.Zelenko, thank you for your suggestions. I will improve them and upload my diff later.
- Improved code review suggestions from Aaron.Ballman and Eugene.Zelenko. Including return default initializer instead of empty string, use isa<>() instead of if statement with multiple conditions, use StringRef array instead of list<std::string>.
LGTM! Thank you for the new functionality! You may want to wait a bit before landing to see if @njames93 has any remaining comments.
- Improved code review suggestions from @njames93. Including move the IdentifierNamingCheck::HNOption variable to IdentifierNamingCheck::FileStyle::HNOption, use try_emplace() instead of insert() and lookup().
This needs rebasing against main. Can't be applied cleanly in its current state.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
398–404 | There's no need to build a string and transform it here. |
- Against git master.
- Refined isHungarianNotationOptionEnabled() function.
- Classify document and test cases.
Hi @njames93, thank you for your review suggestions, I have improved them and against my change to the main branch.
I encounter a problem on the Buildbot for Windows only. Several people encounter also to the same problem that their build failed at an unrelated regression test (llvm\test\CodeGen\XCore\threads.ll).
One last point, is there a way to validate that these options are only set where it makes sense. If someone tries to use say MacroDefinitionHungarianPrefix That could be warning worthy?
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
398–404 | Scratch this, in D92756 support was added for all boolean options in clang-tidy to use the full YAML boolean spec, I'd advise calling the same function here to keep everything consistent. | |
443–470 |
- Against git master.
- Refined isHungarianNotationOptionEnabled() function.
- Classify document and test cases.
- Fixed assertions by clang-format.
- Instead check On/Off string with llvm::yaml::parseBool() function for consistent.
- Improved code.
- Add new check for unsupported option.
Addressed comments by @njames93. Including adding warning message for unsupported options in config file, refining code in getFileStyleFromOptions(), and for consistent reason to use llvm::yaml::parseBool() function instead of checking On/Off string.
- Against trunk.
- Refined isHungarianNotationOptionEnabled() function.
- Changed old way that showing invalid config option in .clang-tidy config file. Now added a new function ClangTidyCheck::OptionsView::diagnoseInvalidConfigOption() instead.
- Recovered that document content missing in .rst.
Hi @njames93,
That's ok. You have helped me a lots. Thank you.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
447 | To use configurationDiag() function in getFileStyleFromOptions(), seems it needs to pass a ClangTidyContext object to getFileStyleFromOptions(). How about changing like the following? getFileStyleFromOptions(const ClangTidyCheck::OptionsView &Options, ClangTidyContext &Context) { ... if (!isHungarianNotationSupportedStyle(I) && HPTOpt.hasValue()) Context.configurationDiag("invalid identifier naming option '%0'") << StyleString; ... } |
clang-tools-extra/clang-tidy/ClangTidyCheck.h | ||
---|---|---|
124–126 ↗ | (On Diff #342126) | You don't need a ClangTidyContext, this function is all that's needed. |
clang-tools-extra/clang-tidy/ClangTidyCheck.h | ||
---|---|---|
124–126 ↗ | (On Diff #342126) | But the getFileStyleFromOptions() is a static function in IdentifierNamingCheck.cpp file. It can't access configurationDiag() directly. |
Hi @njames93
I tried to create a class, HungarianNotation, and put all related functions into the class. Then I can call configurationDiag() in HungarianNotation::checkOptionValid() function.
How about this way?
The new class.
struct HungarianNotation { public: HungarianNotation(ClangTidyContext *Context = nullptr); bool checkOptionValid(int StyleKindIndex, StringRef StyleString, bool HasValue); ...
Use the configurationDiag() in checkOptionValid() function
bool HungarianNotation::checkOptionValid(int StyleKindIndex, StringRef StyleString, bool HasValue) { .. if (HasValue) Context->configurationDiag("invalid identifier naming option '%0'") << StyleString; return false; }
Call the checkOptionValid() here in getFileStyleFromOptions().
static IdentifierNamingCheck::FileStyle getFileStyleFromOptions(const ClangTidyCheck::OptionsView &Options, ClangTidyContext &Context) { ... StyleString.append("HungarianPrefix"); auto HPTOpt = Options.get<IdentifierNamingCheck::HungarianPrefixType>(StyleString); HN.checkOptionValid(I, StyleString, HPTOpt.hasValue()); ...
- Removed diagnoseInvalidConfigOption() function.
- Created a HungarianNotation class and moved related functions into there.
Hi @njames93:
Could you do me a favor? Because it is my first patch, something I'm not sure. I'm confused about can I land this patch now? I read the "LLVM Code-Review Policy and Practices" document, it said patches can be landed if received a LGTM, but seems you are still reviewing.
If you have made significant changes (excluding what a reviewer asks when giving an LGTM) Its best to get those further changes also reviewed.
clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp | ||
---|---|---|
432 | Rather than passing the ClangTidyContext, Make this function a method of IdentifierNamingCheck. Then you call create the Diag without worrying about the Context. |
- Moved all static functions into IdentifierNamingCheck class, and called the configurationDiag() directly in IdentifierNamingCheck::getFileStyleFromOptions() method.
Hi @gnossier:
I'm waiting for feedbacks from reviewer.
Hi @aaron.ballman:
Nathan is helping me to review this patch, but seems he is not here recently. Do you have any suggestion about how to keep the ball rolling in this situation? If it was done, can I apply the right to land it by self?
This breaks tests on windows: http://45.33.8.238/win/43180/step_8.txt
"The command line is too long" Maybe some arts could be passed via a response file instead?
Hi @thakis :
Thank you.
I'm a newbie. I tried to arc diff but arc shows ERR_CLOSED: This revision has already been closed.. Should I create a new differential diff for it?
Hi @thakis,
YES. I just create a new differential diff for it, https://reviews.llvm.org/D107325, could you help me to review it?
Can you go with ND (or something else) instead of Decl since that's a type name?