Clang AST Совпадение вызова make_unique с определенным классом - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь использовать сопоставления AST clang для целевого кода, как показано ниже:

#include<memory>

namespace Demo {
    class Widget {};
}

int main () {
    auto w = std::make_unique<Demo::Widget>();
}

В запросе clang я пробовал следующее:

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")))
)))

IЯ также пытался заменить refersToType(...) на

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

, что также дает ноль совпадений. Что я могу использовать для таргетинга вызовов на std::make_unique, настроенных на определенный тип?

Ответы [ 2 ]

1 голос
/ 20 октября 2019

Вам нужно refersToType(asString("class Demo::Widget")))

К сожалению, это не очень заметно. Я показал некоторые инструменты, чтобы сделать это обнаруживаемым здесь: https://steveire.wordpress.com/2019/04/30/the-future-of-ast-matching-refactoring-tools-eurollvm-and-accu/, но он пока недоступен.

1 голос
/ 19 октября 2019

Просмотр действительного типа аргумента шаблона работает с 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.
...