RecursiveASMVisitor и поиск сайтов вызова функций - PullRequest
0 голосов
/ 29 июня 2018

Есть ли способ найти сайты вызовов для FunctionDecl внутри VisitFunctionDecl внутри RecursiveASTVisitor?

1 Ответ

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

Используйте RecursiveASTVisitor, чтобы найти CallExpr, чей абонент - FunctionDecl, который вы ищете. Clang на самом деле имеет специальный интерфейс для типа вещи, называемый matcher interface , с которым вы можете поэкспериментировать, используя инструмент командной строки "clang-query":

   $ clang-query-7 ast.cpp --
   clang-query> m callExpr(callee(functionDecl(hasName("somefunc"))))

   Match #1:

   /home/nicholas/ast.cpp:4:3: note: "root" binds here
     somefunc(1 + somefunc(0));
     ^~~~~~~~~~~~~~~~~~~~~~~~~

   Match #2:

   /home/nicholas/ast.cpp:4:16: note: "root" binds here
     somefunc(1 + somefunc(0));
                  ^~~~~~~~~~~
   2 matches.

Выражение соответствия, которое вы пишете в этом инструменте (который содержит завершение табуляции!), Является допустимым C ++ с использованием библиотеки совпадений AST clang. После того, как вы итерировали выражение и убедились, что оно работает, просто скопируйте и вставьте его в свой проект.

...