#include <iostream> #include "llvm/Support/raw_ostream.h" #include "llvm/Support/Host.h" #include "clang/Frontend/DiagnosticOptions.h" #include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/FileSystemOptions.h" #include "clang/Basic/SourceManager.h" #include "clang/Lex/HeaderSearch.h" #include "clang/Basic/FileManager.h" #include "clang/Frontend/HeaderSearchOptions.h" #include "clang/Frontend/Utils.h" #include "clang/Basic/TargetOptions.h" #include "clang/Basic/TargetInfo.h" #include "clang/Lex/Preprocessor.h" #include "clang/Frontend/PreprocessorOptions.h" #include "clang/Frontend/FrontendOptions.h" #include "clang/Frontend/CompilerInstance.h" #include "clang/Basic/IdentifierTable.h" #include "clang/Basic/Builtins.h" #include "clang/AST/ASTContext.h" #include "clang/AST/ASTConsumer.h" #include "clang/Sema/Sema.h" #include "clang/AST/DeclBase.h" #include "clang/AST/Type.h" #include "clang/AST/Decl.h" #include "clang/Sema/Lookup.h" #include "clang/Sema/Ownership.h" #include "clang/AST/DeclGroup.h" #include "clang/AST/CXXInheritance.h" #include "clang/Parse/Parser.h" #include "clang/Parse/ParseAST.h" int main() { // 言語オプションをセットアップする。 clang::LangOptions langOpts; langOpts.MicrosoftExt = true; langOpts.MicrosoftMode = true; langOpts.CPlusPlus = true; langOpts.CPlusPlus0x = true; langOpts.Bool = true; langOpts.GNUMode = false; langOpts.GNUKeywords = false; langOpts.LaxVectorConversions = false; langOpts.Exceptions = true; langOpts.CXXExceptions = true; langOpts.MSBitfields = true; langOpts.NeXTRuntime = false; langOpts.MSCVersion = _MSC_VER; // Diagnostic をセットアップする。 clang::DiagnosticOptions diagOpts; clang::TextDiagnosticPrinter diagPrinter(llvm::outs(), diagOpts); diagPrinter.BeginSourceFile(langOpts, nullptr); llvm::IntrusiveRefCntPtr<clang::DiagnosticIDs> diagIds(new clang::DiagnosticIDs()); clang::DiagnosticsEngine diagEngine(diagIds, &diagPrinter, false); // 動作環境オプションをセットアップする。 llvm::Triple triple; triple.setArch(llvm::Triple::x86); triple.setVendor(llvm::Triple::PC); triple.setOS(llvm::Triple::Win32); clang::TargetOptions targetOpts; targetOpts.Triple = triple.getTriple(); clang::TargetInfo* targetInfo = clang::TargetInfo::CreateTargetInfo(diagEngine, targetOpts); // ソースファイル管理をセットアップする。 clang::FileSystemOptions fileSysOpts; clang::FileManager fileMgr(fileSysOpts); clang::SourceManager srcMgr(diagEngine, fileMgr); // ヘッダ検索をセットアップする。 clang::HeaderSearch headerSearch(fileMgr); clang::HeaderSearchOptions headerSearchOpts; headerSearchOpts.AddPath("C:\\Program Files (x86)\\Microsoft Visual Studio 8\\VC\\include", clang::frontend::Angled, false, false, false); headerSearchOpts.AddPath("C:\\Program Files (x86)\\Microsoft Visual Studio 8\\VC\\PlatformSDK\\include", clang::frontend::Angled, false, false, false); clang::ApplyHeaderSearchOptions(headerSearch, headerSearchOpts, langOpts, triple); // プリプロセッサをセットアップする。 clang::CompilerInstance compiler; clang::Preprocessor pp(diagEngine, langOpts, targetInfo, srcMgr, headerSearch, compiler); clang::PreprocessorOptions ppOpts; clang::FrontendOptions frontendOpts; clang::InitializePreprocessor(pp, ppOpts, headerSearchOpts, frontendOpts); const clang::FileEntry *pFile = fileMgr.getFile("D:\\develop\\Clang\\temp.cpp"); srcMgr.createMainFileID(pFile); clang::IdentifierTable identifierTable(langOpts); clang::SelectorTable selectorTable; clang::Builtin::Context builtinContext; clang::ASTContext astContext(langOpts, srcMgr, targetInfo, identifierTable, selectorTable, builtinContext, 0); clang::ASTConsumer astConsumer; clang::Sema sema(pp, astContext, astConsumer); sema.Initialize(); clang::ParseAST(pp, &astConsumer, astContext); // 構文解析結果を確認する。 clang::ASTContext::const_type_iterator t = astContext.types_begin(); clang::ASTContext::const_type_iterator eot = astContext.types_end(); for(; t != eot; ++t) { clang::CXXRecordDecl* pDecl = (*t)->getAsCXXRecordDecl(); if( (pDecl != nullptr) && pDecl->hasDefinition() && pDecl->isClass() ) { //pDecl->getDeclName().printName(llvm::outs()); // 基本クラスを確認する。 std::printf(">>>> base class >>>>\n"); clang::CXXRecordDecl::base_class_iterator base = pDecl->bases_begin(); clang::CXXRecordDecl::base_class_iterator eobase = pDecl->bases_end(); for(; base != eobase; ++base) { // CXXRecordDecl::base_class_iterator は CXXBaseSpecifier* 。 base->getType().dump(); } std::printf("<<<<\n"); // public なメンバ関数を列挙する。 std::printf(">>>> method >>>>\n"); clang::CXXRecordDecl::method_iterator method = pDecl->method_begin(); clang::CXXRecordDecl::method_iterator eomethod = pDecl->method_end(); for(; method != eomethod; ++method) { method->dump(); std::printf("\n-#-#-#-#\n"); } std::printf("<<<<\n"); std::printf("\n---------------------------------------------------------\n"); } } std::getchar(); return 0; }
2011年10月27日木曜日
C++コード表示の調整テスト中・・・
C++コードが見にくいので調整中。
以前からPrettyPrintを導入しようとしていたが、うまくいかずにモヤモヤしていた。どうもBloggerのテンプレートとして動的ビューを選択しているとうまくいかないようなので、シンプルに戻してみた。
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿