12

在常见的 IDE(选择一个)中,您通常会有一个大纲视图,显示特定类的方法列表。

假设我有一个 C++ 接口类IFoo.h,如下所示:

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

我如何(以编程方式)IFoo.h使用可能的 clang 库为上面的文件获取这样的 IDE 大纲列表?首先,如果我能获得函数名称列表会有所帮助。

我特别打算使用clang,因此非常感谢有关如何使用clang分析我的头文件的任何帮助。

同时,我将在这里查看 clang 教程:https ://github.com/loarabia/Clang-tutorial

在此先感谢您的帮助。

4

1 回答 1

16

我浏览了本教程http://clang.llvm.org/docs/LibASTMatchersTutorial.html并在那里发现了一些非常有用的东西,这就是我想出的:

我必须将我的文件从 to 重命名IFoo.hIFoo.hppCxx 而不是 C 代码。

我必须调用我的程序-x c++才能让我的IFoo.h文件被识别为 C++ 代码而不是 C 代码(*.h默认情况下,clang 将文件解释为 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
于 2014-02-19T16:44:51.730 回答