2014-08-30 7 views
7

Ich habe einen C++ Header class.h zu analysieren, die ich analysieren möge einen Header als C++ Datei mit dem Namen:Es kann kein Klirren CompilerInstance Objekt zwingen

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; 
} 

Ich benutze klirre eine Compiler Instanz mit einem AST Verbraucher. Mein gesamter Code funktioniert gut mit der c-Quelldatei. Aber ich kann die Sprache, die die CompilerInstance verwenden muss, nicht konfigurieren/erzwingen. Hier ist der Code, den ich verwenden:

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(); 

Wenn ich dies zu testen, der Parser wirft Fehler wie folgt aus:

error: unknown type name 'class' 

und der Test

m_ci->getLangOpts.CPlusPlus == 0 

wahr ist, so scheint es, dass Die LangOptions wird nicht auf die CompilerInstance angewendet.

Antwort

11

Nach einigen Tests und vielen Suchen habe ich herausgefunden, wie das geht. Um die Sprachoptionen eines CompilerInstance Objekt zu setzen, müssen Sie nur noch, dies zu tun:

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); 

Das Wichtigste ist, die LangOpts vor dem Erstellen oder neu zu erstellen, den Prä-Prozessor mit CompilerInstance::createPreprocessor()

zu konfigurieren