2015-04-02 111 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));