Мне нужно предварительно обработать некоторые C ++ файлы для автоматической вставки кода для тестирования и профилирования, и мне нужно сделать это с помощью clang API .
Сейчас я хочу сделать следующее:
Если есть функция:
int SomeFn(int a, int b, int c) {
doStuff();
}
Я хочу предварительно обработать его, чтобы он выглядел так:
int SomeFn(int a, int b, int c) {
cout << "SomeFn is invoked with the following arguments: a=" << a << ", b=" << b << ", c=" << c << endl;
doStuff();
}
Я пытался расширить ASTConsumer
и использовать методы HandleTopLevelDecl
и HandleTopLevelSingleDecl
и проверить, являются ли переданные Decls
значения FunctionDecls
, и уменьшить их, чтобы я мог получить их имена и местонахождение.
Но я не могу обрабатывать методы класса таким образом, только глобальные функции.
Я нашел функцию в ASTConsumer
классе HandleTagDeclDefinition(TagDecl* D)
. В документации сказано:
Этот обратный вызов вызывается каждый раз, когда
TagDecl (например, структура, объединение, перечисление,
класс) завершен.
Но похоже, что этот метод даже не вызывается, когда я проверяю его.
Итак, мой вопрос: что было бы правильным способом выполнить эту задачу? И как классы C ++ представлены в Clang API? Может быть, кто-то знает, где я могу найти примеры, потому что API Clang плохо документированы.
UPDATE:
Я знаю, что есть также понятие Visitors
, и есть метод VisitRecordDecl(RecordDecl *D)
. В документации сказано, что RecordDecl
представляет классы. Поэтому я расширил RecursiveASTVisitor
и внедрил VisitRecordDecl(RecordDecl *D)
, но кажется, что этот метод также не вызывается.
Вместо этого VisitVarDecl
вызывается, когда определением класса является find, как если бы оно рассматривалось как объявление переменной.
Так что я немного растерялся. Я надеюсь, кто-то может помочь ...
UPDATE2:
Я попытался разобрать другой файл, и на этот раз clang нашел один RecordDecl
. Но файл определил одну структуру и два класса, поэтому я думаю, что мой код Clang анализирует C вместо C ++ . Есть ли какие-либо настройки для переключения между C и C ++ ?