1259701Sdim//===--- SimpleFormatContext.h ----------------------------------*- C++ -*-===// 2259701Sdim// 3259701Sdim// The LLVM Compiler Infrastructure 4259701Sdim// 5259701Sdim// This file is distributed under the University of Illinois Open Source 6259701Sdim// License. See LICENSE.TXT for details. 7259701Sdim// 8259701Sdim//===----------------------------------------------------------------------===// 9259701Sdim// 10259701Sdim/// \file 11259701Sdim/// 12259701Sdim/// \brief Defines a utility class for use of clang-format in libclang 13259701Sdim// 14259701Sdim//===----------------------------------------------------------------------===// 15259701Sdim 16259701Sdim#ifndef LLVM_CLANG_SIMPLE_FORM_CONTEXT_H 17259701Sdim#define LLVM_CLANG_SIMPLE_FORM_CONTEXT_H 18259701Sdim 19259701Sdim#include "clang/Basic/Diagnostic.h" 20259701Sdim#include "clang/Basic/DiagnosticOptions.h" 21259701Sdim#include "clang/Basic/FileManager.h" 22259701Sdim#include "clang/Basic/LangOptions.h" 23259701Sdim#include "clang/Basic/SourceManager.h" 24259701Sdim#include "clang/Rewrite/Core/Rewriter.h" 25259701Sdim#include "llvm/Support/FileSystem.h" 26259701Sdim#include "llvm/Support/Path.h" 27259701Sdim#include "llvm/Support/raw_ostream.h" 28259701Sdim 29259701Sdimnamespace clang { 30259701Sdimnamespace index { 31259701Sdim 32259701Sdim/// \brief A small class to be used by libclang clients to format 33259701Sdim/// a declaration string in memory. This object is instantiated once 34259701Sdim/// and used each time a formatting is needed. 35259701Sdimclass SimpleFormatContext { 36259701Sdimpublic: 37259701Sdim SimpleFormatContext(LangOptions Options) 38259701Sdim : DiagOpts(new DiagnosticOptions()), 39259701Sdim Diagnostics(new DiagnosticsEngine(new DiagnosticIDs, 40259701Sdim DiagOpts.getPtr())), 41259701Sdim Files((FileSystemOptions())), 42259701Sdim Sources(*Diagnostics, Files), 43259701Sdim Rewrite(Sources, Options) { 44259701Sdim Diagnostics->setClient(new IgnoringDiagConsumer, true); 45259701Sdim } 46259701Sdim 47259701Sdim ~SimpleFormatContext() { } 48259701Sdim 49259701Sdim FileID createInMemoryFile(StringRef Name, StringRef Content) { 50259701Sdim const llvm::MemoryBuffer *Source = 51259701Sdim llvm::MemoryBuffer::getMemBuffer(Content); 52259701Sdim const FileEntry *Entry = 53259701Sdim Files.getVirtualFile(Name, Source->getBufferSize(), 0); 54259701Sdim Sources.overrideFileContents(Entry, Source, true); 55259701Sdim assert(Entry != NULL); 56259701Sdim return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User); 57259701Sdim } 58259701Sdim 59259701Sdim std::string getRewrittenText(FileID ID) { 60259701Sdim std::string Result; 61259701Sdim llvm::raw_string_ostream OS(Result); 62259701Sdim Rewrite.getEditBuffer(ID).write(OS); 63259701Sdim OS.flush(); 64259701Sdim return Result; 65259701Sdim } 66259701Sdim 67259701Sdim IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; 68259701Sdim IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics; 69259701Sdim FileManager Files; 70259701Sdim SourceManager Sources; 71259701Sdim Rewriter Rewrite; 72259701Sdim}; 73259701Sdim 74259701Sdim} // end namespace index 75259701Sdim} // end namespace clang 76259701Sdim 77259701Sdim#endif 78