Получить список методов в классе, используя Clang

В обычных IDE (выберите одну) у вас часто есть представление схемы, показывающее вам список методов для определенного класса.

Предположим, у меня есть класс интерфейса C ++ в IFoo.h это выглядит так:

#ifndef IFOO_H_
#define IFOO_H_
class IFoo {
public:
virtual ~IFoo() {}
virtual void bar() = 0;
};
#endif

Как (программно) я могу получить такой список IDE outliner для моего IFoo.h Файл выше, используя, может быть, библиотеки Clang? Для первого запуска было бы полезно, если бы я мог получить список имен функций.

Я специально намереваюсь использовать clang, поэтому любая помощь в том, как проанализировать мой заголовочный файл с помощью clang, будет очень признательна.

А пока я посмотрю учебник по лязгу здесь: https://github.com/loarabia/Clang-tutorial

Заранее спасибо за помощь.

10

Решение

Я прошел этот урок http://clang.llvm.org/docs/LibASTMatchersTutorial.html и нашел там довольно полезные вещи, вот что я придумал:

Я должен был переименовать мой файл из IFoo.h в IFoo.hpp быть обнаруженным как Cxx, а не как код C.

Я должен был назвать свою программу с -x c++ иметь мой IFoo.h файл распознается как код C ++, а не как код C (clang интерпретирует *.h файлы как C по умолчанию:

~/Development/llvm-build/bin/mytool ~/IFoo.h -- -x c++

Это мой код для выгрузки всех виртуальных функций из предоставленного класса:

// Declares clang::SyntaxOnlyAction.
#include "clang/Frontend/FrontendActions.h"#include "clang/Tooling/CommonOptionsParser.h"#include "clang/Tooling/Tooling.h"#include "clang/ASTMatchers/ASTMatchers.h"// Declares llvm::cl::extrahelp.
#include "llvm/Support/CommandLine.h"
#include "clang/ASTMatchers/ASTMatchers.h"#include "clang/ASTMatchers/ASTMatchFinder.h"
#include <cstdio>

using namespace clang;
using namespace clang::ast_matchers;
using namespace clang::tooling;
using namespace llvm;

DeclarationMatcher methodMatcher = methodDecl(isVirtual()).bind("methods");

class MethodPrinter : public MatchFinder::MatchCallback {
public :
virtual void run(const MatchFinder::MatchResult &Result) {
if (const CXXMethodDecl *md = Result.Nodes.getNodeAs<clang::CXXMethodDecl>("methods")) {
md->dump();
}
}
};

// CommonOptionsParser declares HelpMessage with a description of the common
// command-line options related to the compilation database and input files.
// It's nice to have this help message in all tools.
static cl::extrahelp CommonHelp(CommonOptionsParser::HelpMessage);

// A help message for this specific tool can be added afterwards.
static cl::extrahelp MoreHelp("\nMore help text...");

int main(int argc, const char **argv) {
cl::OptionCategory cat("myname", "mydescription");
CommonOptionsParser optionsParser(argc, argv, cat, 0);

ClangTool tool(optionsParser.getCompilations(), optionsParser.getSourcePathList());

MethodPrinter printer;
MatchFinder finder;
finder.addMatcher(methodMatcher, &printer);
return tool.run(newFrontendActionFactory(&finder));
}

Вывод выглядит так, когда передан IFoo.h файл:

CXXDestructorDecl 0x1709c30 <~/IFoo.h:5:3, col:20> ~IFoo 'void (void)' virtual
`-CompoundStmt 0x1758128 <col:19, col:20>
CXXMethodDecl 0x1757e60 <~/IFoo.h:6:3, col:24> bar 'void (void)' virtual pure
14

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector