2015-04-02 135 views
2

我有一个基于铿锵创建一个编译器实例,并能解析C头文件的小工具。这个工具在第3.4和3.5版中运行良好。如何使用编译器实例和ASTConsumer与铿锵3.6

我首先创建一个编译器实例,并与来自ASTConsumer创建了一个新的类使用它:

ci = new clang::CompilerInstance() 
ci.createDiagnostics(); 
ci.createFileManager(); 
ci.createSourceManager(ci.getFileManager()); 
std::shared_ptr<clang::TargetOptions> pto = std::make_shared<clang::TargetOptions>(); 
pto->Triple = llvm::sys::getDefaultTargetTriple(); 
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(m_ci.getDiagnostics(), pto); 
ci.setTarget(pti); 
ci.createPreprocessor(clang::TU_Complete); 
...  
//add source file and the headers paths 
... 
MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer; 
ci.setASTConsumer(myASTConsumerClassInstance); 
... 
//parse the header file 

其中myASTConsumerClassInstance是我像这样(以简化的形式)中创建的类的一个实例:

class MyASTConsumer : public clang::ASTConsumer 
{ 
    MyASTConsumer() 
    ~MyASTConsumer() {}; 
    virtual bool HandleTopLevelDecl(clang::DeclGroupRef d); 
    virtual void HandleTagDeclDefinition(clang::TagDecl * d); 
    private: 
    std::vector<clang::TagDecl *> m_my_tags; 
} 

HandleTagDeclDefinition方法中,所有标记声明都在向量m_my_tags中注册。因此,在解析过程之后,我可以访问myASTConsumerInstance中的所有标记声明。

现在在叮当声3.6 api中,方法clang::CompilerInstance::setASTConsumer需要一个std::unique_ptr<ASTConsumer>。如何调整我的代码?

回答

2

这是很容易在事实上取代这个

MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer; 
ci.setASTConsumer(myASTConsumerClassInstance); 

有:

ci.setASTConsumer(llvm::make_unique<MyASTConsumer>()); 

或:

MyASTConsumer * myASTConsumerClassInstance = new MyASTConsumer; 
ci.setASTConsumer(llvm::make_unique<clang::ASTConsumer>(*myASTConsumerClassInstance));