//===--- SimpleFormatContext.h ----------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // /// \file /// /// \brief Defines a utility class for use of clang-format in libclang // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_SIMPLE_FORM_CONTEXT_H #define LLVM_CLANG_SIMPLE_FORM_CONTEXT_H #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceManager.h" #include "clang/Rewrite/Core/Rewriter.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/raw_ostream.h" namespace clang { /// \brief A small class to be used by libclang clients to format /// a declaration string in memory. This object is instantiated once /// and used each time a formatting is needed. class SimpleFormatContext { public: SimpleFormatContext(LangOptions Options) : DiagOpts(new DiagnosticOptions()), Diagnostics(new DiagnosticsEngine(new DiagnosticIDs, DiagOpts.getPtr())), Files((FileSystemOptions())), Sources(*Diagnostics, Files), Rewrite(Sources, Options) { Diagnostics->setClient(new IgnoringDiagConsumer, true); } ~SimpleFormatContext() { } FileID createInMemoryFile(StringRef Name, StringRef Content) { const llvm::MemoryBuffer *Source = llvm::MemoryBuffer::getMemBuffer(Content); const FileEntry *Entry = Files.getVirtualFile(Name, Source->getBufferSize(), 0); Sources.overrideFileContents(Entry, Source, true); assert(Entry != NULL); return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User); } std::string getRewrittenText(FileID ID) { std::string Result; llvm::raw_string_ostream OS(Result); Rewrite.getEditBuffer(ID).write(OS); OS.flush(); return Result; } IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics; FileManager Files; SourceManager Sources; Rewriter Rewrite; }; } // end namespace clang #endif