2014-08-30 29 views
7

Mam nagłówek C++ o nazwie class.h że chcę analizować:Nie można zmusić obiekt dzyń CompilerInstance analizować nagłówek jak C++ pliku

class MyClass 
{ 
    public: 
    Class() {} 
    ~Class() {} 
    bool isTrue() const; 
    bool isFalse() const; 
    private: 
    bool m_attrib; 
}; 

bool MyClass::isTrue() const 
{ 
    return true; 
} 
bool MyClass::isFalse() const 
{ 
    return false; 
} 

Używam dzyń instancji kompilatora z AST konsument. Cały mój kod działa dobrze z plikiem źródłowym c. Ale nie jestem w stanie skonfigurować/wymusić langage, które musi użyć CompilerInstance. Oto kod używam:

m_ci = new clang::CompilerInstance(); 
/*configure the langage to use*/ 
clang::CompilerInvocation *invocation = new clang::CompilerInvocation; 
clang::LangOptions langOpts; 
/*with langage = clang::IK_CXX*/ 
langOpts.CPlusPlus = 1; 
invocation->setLangDefaults(langOpts, langage); 
m_ci->setInvocation(invocation); 
m_ci->createDiagnostics(); 
llvm::IntrusiveRefCntPtr<clang::TargetOptions> pto(new clang::TargetOptions()); 
pto->Triple = llvm::sys::getDefaultTargetTriple(); 
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(m_ci->getDiagnostics(), pto.getPtr()); 
m_ci->setTarget(pti); 
m_ci->createFileManager(); 
m_ci->createSourceManager(ci->getFileManager()); 
m_ci->createPreprocessor(); 
/*add some header search paths*/ 
m_hso = llvm::IntrusiveRefCntPtr<clang::HeaderSearchOptions>(new clang::HeaderSearchOptions()); 
m_hso->AddPath(pathName.c_str(), 
       clang::frontend::Angled, 
       false, 
       false); 
/*add the source file*/ 
const clang::FileEntry *pFile = m_ci->getFileManager().getFile(fileName.c_str()); 
m_ci->getSourceManager().createMainFileID(pFile); 
/*parse*/ 
clang::InitializePreprocessor(m_ci->getPreprocessor(), 
           m_ci->getPreprocessorOpts(), 
           *m_hso, 
           m_ci->getFrontendOpts()); 
m_ci->createASTContext(); 
m_headerElements = new HeaderElements(); 
m_ci->setASTConsumer(m_headerElements); 
m_ci->getDiagnosticClient().BeginSourceFile(m_ci->getLangOpts(), 
              &m_ci->getPreprocessor()); 
clang::ParseAST(m_ci->getPreprocessor(), m_headerElements, m_ci->getASTContext()); 
m_ci->getDiagnosticClient().EndSourceFile(); 

Kiedy to sprawdzić, parser zgłasza błędy tak:

error: unknown type name 'class' 

a test

m_ci->getLangOpts.CPlusPlus == 0 

jest prawdą więc wydaje się, że the LangOptions nie jest stosowany w CompilerInstance.

Odpowiedz

11

Po kilku testach i wielu poszukiwaniach, zorientowałem się, jak to zrobić. Aby ustawić opcje Język obiektu CompilerInstance, po prostu trzeba to zrobić:

clang::CompilerInstance ci; 
//initialize lot of stuff 
ci.createDiagnostics(); 
ci.createFileManager(); 
ci.createSourceManager(m_ci.getFileManager()); 
std::shared_ptr<clang::TargetOptions> pto = std::make_shared<clang::TargetOptions>(); 
pto->Triple = llvm::sys::getDefaultTargetTriple(); 
clang::TargetInfo *pti = clang::TargetInfo::CreateTargetInfo(ci.getDiagnostics(), pto); 
ci.setTarget(pti); 
//force langage to C++ 
ci.getLangOpts().CPlusPlus = 1; 
ci.createPreprocessor(clang::TU_Complete); 

Ważną rzeczą jest, aby skonfigurować LangOpts przed utworzeniem lub ponownego tworzenia preprocesora z CompilerInstance::createPreprocessor()