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.