叮当 AST 将调用与特定类匹配make_unique



我正在尝试使用 clang 的 AST 匹配器来定位代码,如下所示:

#include<memory>
namespace Demo {
class Widget {};
}
int main () {
auto w = std::make_unique<Demo::Widget>();
}

在 clang-query 中,我尝试了以下方法:

callExpr(callee(functionDecl(
// including only this arg gives matches
hasName("make_unique"),
// adding this second arg produces zero matches
hasTemplateArgument(0, refersToType(asString("Demo::Widget")))
)))

我也尝试过将refersToType(...)换成

refersToDeclaration(cxxRecordDecl(isSameOrDerivedFrom("Demo::Widget")))

这也给出了零匹配。我可以使用哪些内容将调用定位到特定类型的模板化std::make_unique

通过模板参数的实际类型适用于 clang-10.0.0,

clang-query> match callExpr(callee(functionDecl(hasName("make_unique"),
hasAnyTemplateArgument(refersToType(hasDeclaration(
namedDecl(hasName("Demo::Widget"))))))))
Match #1:
/tmp/test.cpp:8:18: note: "root" binds here
auto w = std::make_unique<Demo::Widget>();
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 match.

你需要refersToType(asString("class Demo::Widget")))

不幸的是,这不是很容易发现的。我展示了一些工具,使其可在此处发现:https://steveire.wordpress.com/2019/04/30/the-future-of-ast-matching-refactoring-tools-eurollvm-and-accu/但尚未普遍可用。

相关内容

  • 没有找到相关文章

最新更新