2

我使用了一段时间的 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();

因此,clang tidy 现在给我的信息是我有“int”类型的子表达式,这是正确的,但我不知道如何获得它的名称。

我尝试的是动态转换为DeclRefExpr,但这没有通过。还尝试了动态强制转换为BuiltinType,然后我想获得一个声明但没有运气。

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

谢谢!

4

1 回答 1

2

如果有人遇到这个问题,我会这样解决。

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

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

于 2018-04-19T07:08:44.340 回答