Я хочу изменить следующий код с помощью clang ast matcher.
foo(NUM << DEV_SHIFT | DEVICE);
до
foo(ADDR(NUM, DEVICE));
с
#define ADDR(a, b) (((a) << NUM_SHIFT) | (b))
У меня есть следующий AST-matcher, который, кажется, очень хорошо идентифицирует код.
Finder->addMatcher(
callExpr(hasArgument(
0, binaryOperator(hasOperatorName("|"),
hasLHS(ignoringParenImpCasts(
binaryOperator(hasOperatorName("<<")))))
.bind("replaceWithMacro"))),
this);
Но у меня есть проблема, чтобы понять, как написать чек и перевод. В настоящее время я застрял с этим кодом:
void FirstCheckCheck::check(const MatchFinder::MatchResult &Result) {
// FIXME: Add callback implementation.
if (const auto MatchedDecl =
Result.Nodes.getNodeAs<CallExpr>("replaceWithMacro")) {
diag(MatchedDecl->getExprLoc(), "CallExp");
} else if (const auto MatchedDecl =
Result.Nodes.getNodeAs<Expr>("replaceWithMacro")) {
diag(MatchedDecl->getExprLoc(), "Expr");
diag(MatchedDecl->getBeginLoc(), "BeginLOC");
diag(MatchedDecl->getEndLoc(), "EndLOC");
}
Я не знаю, как извлечь две переменные в виде строк.
Я искал документацию для класса Expr (http://clang.llvm.org/doxygen/classclang_1_1Expr.html),, но не смог найти что-то полезное.
Если бы кто-то мог указать мне правильное направление, это было бы оценено.
Добавить редактирование.