2011年10月27日木曜日

C++コード表示の調整テスト中・・・

C++コードが見にくいので調整中。 以前からPrettyPrintを導入しようとしていたが、うまくいかずにモヤモヤしていた。どうもBloggerのテンプレートとして動的ビューを選択しているとうまくいかないようなので、シンプルに戻してみた。
#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;
}

0 件のコメント:

コメントを投稿