#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 件のコメント:
コメントを投稿