使用Clang AST匹配操作指定头文件中定义枚举类型的switch语句失败,求排查原因
Clang AST匹配操作指定头文件中定义枚举类型的switch语句失败,求排查原因
兄弟,我一眼就瞅出来你这问题的核心了——你没用到Clang AST匹配器里专门定位switch条件的hasCondition()匹配器!
你之前写的m switchStmt(implicitCastExpr()),是在找任意子节点包含ImplicitCastExpr的SwitchStmt,但Clang的AST里SwitchStmt的结构比较特殊,它的条件表达式是一个特定的子节点,通用的子节点匹配方式要么命中不到,要么会匹配到无关的节点。你得精准定位到switch的条件部分才行。
先给你改好第一步的匹配命令,保证能命中你目标里的switch:
m switchStmt(hasCondition(implicitCastExpr()))
你先在clang-query里跑这个,肯定能匹配到你写的那个switch语句。
接下来再顺着你的计划往下走,要匹配指定头文件里的枚举,你可以在implicitCastExpr()里继续嵌套匹配器,精准锁定目标枚举类型。比如假设你的枚举定义在my-target-enums.h里,完整的匹配器可以写成这样:
m switchStmt( hasCondition( implicitCastExpr( hasImplicitDestinationType( enumType( hasDeclaration( enumDecl( isInFileMatching("my-target-enums.h") ) ) ) ) ) ) )
我给你拆解下每个部分的作用:
hasCondition():精准定位switch的条件表达式,这是你之前缺失的关键一步implicitCastExpr():匹配你AST里那个隐式转换节点hasImplicitDestinationType():获取这个隐式转换的目标类型(也就是你定义的枚举类E)enumType():指定目标类型是枚举类型,避免匹配到其他类型的隐式转换enumDecl(isInFileMatching("xxx.h")):最终锁定这个枚举类型的定义来自你指定的头文件
你可以一步步来,先验证第一步的匹配器能命中目标,再逐步叠加后面的条件,就能精准筛选出你要的switch语句了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

