我使用clang-tidy一段时间并创建一些自己的支票。但现在我陷入了这个问题。我有一个cstyle强制转换表达式,我想从中获取一个宏名称作为字符串。
#define H_KEY 5;
float *a;
a = (float *)H_KEY; // I want to print out "H_KEY" from this expression
所以我注册了一个像这样的匹配器
void PointersCastCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(cStyleCastExpr().bind("cStyleCastExpr"), this);
}
我能够抓住每个cstyle演员并从中获得一个subExpr。
const Expr * subExpr = cStyleCast->getSubExpr();
所以铿锵整齐的现在给我的信息我已经" int"键入子表达式是正确的,但我不知道如何得到它的名称。
我尝试动态转换为 DeclRefExpr ,但这不会通过。还尝试动态转换为 BuiltinType ,然后我想获得声明,但没有运气。
所以请帮忙。我认为这应该不难。
谢谢!
答案 0 :(得分:2)
如果有人在这个问题上运行,我会这样解决。
if (subExpr->getExprLoc().isMacroID()) {
SourceManager &SM = *Result.SourceManager;
LangOptions LangOpts = getLangOpts();
StringRef subExprText = Lexer::getSourceText(CharSourceRange::getTokenRange(subExpr->getSourceRange()), SM, LangOpts);}
也许有更好的方法,但这个适合我的需要。