如何在clang-tidy的RenamerClangTidyCheck中判断clang::VarDecl的变量类型
解决方案
核心实现逻辑
你重写getDeclFailureInfo()时按以下步骤校验类型即可:
- 先将传入的
NamedDecl指针通过dyn_cast安全向下转型为VarDecl,转型失败直接返回空的FailureInfo即可 - 调用
VarDecl::getType()拿到变量的类型实例,先做规范化处理,可根据你的匹配需求剥离顶层的const/volatile限定符、引用、指针修饰 - 对比规范化后的类型信息,确认是
MyType后返回重命名规则即可
RenamerClangTidyCheck内部会自动遍历该声明的所有引用位点,批量生成重命名的修复提示,覆盖声明、调用、传参等所有使用场景,不需要你手动处理使用位置的替换逻辑。
代码示例
std::optional<RenamerClangTidyCheck::FailureInfo> YourCheck::getDeclFailureInfo(const NamedDecl *Decl, const SourceManager &SM) const { // 筛选变量声明 const auto *VD = dyn_cast<VarDecl>(Decl); if (!VD) return std::nullopt; // 规范化类型,根据匹配需求调整修饰剥离逻辑:不需要匹配指针就去掉IgnorePointers,不需要匹配引用就去掉IgnoreReferences QualType TargetType = VD->getType() .getCanonicalType() .getUnqualifiedType() .IgnorePointers() .IgnoreReferences(); // 校验是否为目标类型 if (TargetType.getAsString() != "class MyType") return std::nullopt; // 返回重命名规则,Fix字段填你要生成的新变量名字符串 RenamerClangTidyCheck::FailureInfo Info; Info.KindName = "mytype-variable"; Info.Fix = /* 自定义的新变量名 */; return Info; }
优化建议
如果不想硬编码类型字符串,可以通过匹配类型声明标识符的方式避免字符串匹配误差:
// 可在检查类初始化时预存MyType的标识符 IdentifierInfo *MyTypeIdent = &getContext().Idents.get("MyType"); // 替换上述代码中的字符串匹配逻辑 const auto *RD = TargetType->getAsCXXRecordDecl(); if (!RD || RD->getIdentifier() != MyTypeIdent) return std::nullopt;
内容的提问来源于stack exchange,提问作者Mikhail
相关产品推荐
相关产品推荐

