[clang-tidy] Fix support for typedefs in readability-identifier-naming (#66835)

Typedef rename were not properly handled when typedef were used behind
pointer, or as a part of function type. Additionally because entire
function were passed as an source-range, when function started with
macro, such change were not marked for a fix.

Removed workaround and used proper TypedefTypeLoc instead.

Fixes #55156, #54699
This commit is contained in:
Piotr Zegar 2023-09-20 21:29:54 +02:00 committed by GitHub
parent 33aa095a8b
commit 5d95d27e50
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 34 additions and 21 deletions

View File

@ -256,26 +256,6 @@ public:
return true;
}
// Fix type aliases in value declarations.
if (const auto *Value = dyn_cast<ValueDecl>(Decl)) {
if (const Type *TypePtr = Value->getType().getTypePtrOrNull()) {
if (const auto *Typedef = TypePtr->getAs<TypedefType>())
Check->addUsage(Typedef->getDecl(), Value->getSourceRange(), SM);
}
}
// Fix type aliases in function declarations.
if (const auto *Value = dyn_cast<FunctionDecl>(Decl)) {
if (const auto *Typedef =
Value->getReturnType().getTypePtr()->getAs<TypedefType>())
Check->addUsage(Typedef->getDecl(), Value->getSourceRange(), SM);
for (const ParmVarDecl *Param : Value->parameters()) {
if (const TypedefType *Typedef =
Param->getType().getTypePtr()->getAs<TypedefType>())
Check->addUsage(Typedef->getDecl(), Value->getSourceRange(), SM);
}
}
// Fix overridden methods
if (const auto *Method = dyn_cast<CXXMethodDecl>(Decl)) {
if (const CXXMethodDecl *Overridden = getOverrideMethod(Method)) {
@ -340,6 +320,11 @@ public:
return true;
}
bool VisitTypedefTypeLoc(const TypedefTypeLoc &Loc) {
Check->addUsage(Loc.getTypedefNameDecl(), Loc.getSourceRange(), SM);
return true;
}
bool VisitTagTypeLoc(const TagTypeLoc &Loc) {
Check->addUsage(Loc.getDecl(), Loc.getSourceRange(), SM);
return true;

View File

@ -295,7 +295,9 @@ Changes in existing checks
warnings when a type's forward declaration precedes its definition.
Additionally, it now provides appropriate warnings for ``struct`` and
``union`` in C, while also incorporating support for the
``Leading_upper_snake_case`` naming convention.
``Leading_upper_snake_case`` naming convention. The handling of ``typedef``
has been enhanced, particularly within complex types like function pointers
and cases where style checks were omitted when functions started with macros.
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check to take

View File

@ -729,3 +729,29 @@ struct forward_declared_as_struct;
class forward_declared_as_struct {
};
namespace pr55156 {
template<typename> struct Wrap;
typedef enum {
VALUE0,
VALUE1,
} ValueType;
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: invalid case style for typedef 'ValueType' [readability-identifier-naming]
// CHECK-FIXES: {{^}}} value_type_t;
typedef ValueType (*MyFunPtr)(const ValueType&, Wrap<ValueType>*);
// CHECK-MESSAGES: :[[@LINE-1]]:21: warning: invalid case style for typedef 'MyFunPtr' [readability-identifier-naming]
// CHECK-FIXES: {{^}}typedef value_type_t (*my_fun_ptr_t)(const value_type_t&, Wrap<value_type_t>*);
#define STATIC_MACRO static
STATIC_MACRO void someFunc(ValueType a_v1, const ValueType& a_v2) {}
// CHECK-FIXES: {{^}}STATIC_MACRO void someFunc(value_type_t a_v1, const value_type_t& a_v2) {}
STATIC_MACRO void someFunc(const ValueType** p_a_v1, ValueType (*p_a_v2)()) {}
// CHECK-FIXES: {{^}}STATIC_MACRO void someFunc(const value_type_t** p_a_v1, value_type_t (*p_a_v2)()) {}
STATIC_MACRO ValueType someFunc() {}
// CHECK-FIXES: {{^}}STATIC_MACRO value_type_t someFunc() {}
STATIC_MACRO void someFunc(MyFunPtr, const MyFunPtr****) {}
// CHECK-FIXES: {{^}}STATIC_MACRO void someFunc(my_fun_ptr_t, const my_fun_ptr_t****) {}
#undef STATIC_MACRO
}