如何在clang-tidy中从CStyleCastExpr匹配器获取宏名称?

时间:2018-04-17 12:13:30

标签: c++ macros clang llvm clang-tidy

我使用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 ,然后我想获得声明,但没有运气。

所以请帮忙。我认为这应该不难。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果有人在这个问题上运行,我会这样解决。

if (subExpr->getExprLoc().isMacroID()) {
                SourceManager &SM = *Result.SourceManager;
                LangOptions LangOpts = getLangOpts();
                StringRef subExprText = Lexer::getSourceText(CharSourceRange::getTokenRange(subExpr->getSourceRange()), SM, LangOpts);}

也许有更好的方法,但这个适合我的需要。