Clang AST Matcher: нет CXXMethodDecl для `operator ()`? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующее struct определение в файле:

template <class... EventArgs>
struct banana {
    template <class... Args>
    void operator()(Args&&... args) const {
        _f(std::forward<Args>(args)...);
    }

private:
    std::function<void(EventArgs...)> _f;
};

Используя -ast-dump -fsyntax-only, я могу ясно видеть несколько CXXRecordDecl s в дампе, которые также относятся к bananaкак CXXMethodDecl s, которые ссылаются на operator():

`-ClassTemplateDecl 0x7fb23c11e028 <./test_files/templates.cpp:12:1, line:21:1> line:13:8 banana
  |-TemplateTypeParmDecl 0x7fb23c11df08 <line:12:11, col:20> col:20 referenced class depth 0 index 0 ... EventArgs
  |-CXXRecordDecl 0x7fb23c11df90 <line:13:1, line:21:1> line:13:8 struct banana definition
  | |-CXXRecordDecl 0x7fb23c11e300 <line:13:1, col:8> col:8 implicit struct banana
  | |-FunctionTemplateDecl 0x7fb23c11e668 <line:14:5, line:17:5> line:15:10 operator()
  | | |-TemplateTypeParmDecl 0x7fb23c11e398 <line:14:15, col:24> col:24 referenced class depth 1 index 0 ... Args
  | | `-CXXMethodDecl 0x7fb23c11e5d0 <line:15:5, line:17:5> line:15:10 operator() 'void (Args &&...) const'
  | | etc., etc.

Мой подкласс MatchFinder::MatchCallback выполняется над событием CXXRecordDecl для события, однако methods() возвращается с пустым диапазоном:

void ClassInfo::run(const MatchFinder::MatchResult& Result) {
    auto clas = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("class");

    for (const auto& method : clas->methods()) {
        // Not getting run - methods() is empty?
    }
}

Чего мне не хватает?

1 Ответ

0 голосов
/ 03 октября 2018

Ну, clas->methods() возвращает только CXXMethodDecl s на верхнем уровне struct.Но в вашем struct есть только FunctionTemplateDecl.Итак, вы можете захотеть сделать что-то вроде этого:

for (const auto &decl : clas->decls()) {
  if (auto *templ = dyn_cast<FunctionTemplateDecl>(&decl)) {
    // Use templ->getTemplatedDecl to get FunctionDecl.
  }
}

Примечание. На самом деле я не тестировал и не компилировал этот код, но, надеюсь, вы поняли идею.

...