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>
。如何調整我的代碼?