188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian//===--- SimpleFormatContext.h ----------------------------------*- C++ -*-===// 288b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// 388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// The LLVM Compiler Infrastructure 488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// 588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// This file is distributed under the University of Illinois Open Source 688b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// License. See LICENSE.TXT for details. 788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// 888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian//===----------------------------------------------------------------------===// 988b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// 104547fb55370b80f468fec19903ecb4a5cfd6d734Fariborz Jahanian/// \file 11e3ec31a6c2ff37bbc1ebea523e9f1730e0b4b1c7Fariborz Jahanian/// 124547fb55370b80f468fec19903ecb4a5cfd6d734Fariborz Jahanian/// \brief Defines a utility class for use of clang-format in libclang 1388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian// 1488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian//===----------------------------------------------------------------------===// 1588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 16176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#ifndef LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H 17176edba5311f6eff0cad2631449885ddf4fbc9eaStephen Hines#define LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H 1888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 1988b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Basic/Diagnostic.h" 2088b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Basic/DiagnosticOptions.h" 2188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Basic/FileManager.h" 2288b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Basic/LangOptions.h" 2388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Basic/SourceManager.h" 2488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "clang/Rewrite/Core/Rewriter.h" 2588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "llvm/Support/FileSystem.h" 2688b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "llvm/Support/Path.h" 2788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#include "llvm/Support/raw_ostream.h" 2888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 2988b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahaniannamespace clang { 3086cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenkonamespace index { 3188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 3288b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian/// \brief A small class to be used by libclang clients to format 3388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian/// a declaration string in memory. This object is instantiated once 3488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian/// and used each time a formatting is needed. 3588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanianclass SimpleFormatContext { 367c10683c834f051e018c89b090d64bf5e4ca3bccFariborz Jahanianpublic: 3788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian SimpleFormatContext(LangOptions Options) 3888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian : DiagOpts(new DiagnosticOptions()), 3986cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko Diagnostics(new DiagnosticsEngine(new DiagnosticIDs, 40c568f1e98938584c0ef0b12ae5018ff7d90a4072Stephen Hines DiagOpts.get())), 41a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar InMemoryFileSystem(new vfs::InMemoryFileSystem), 42a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar Files(FileSystemOptions(), InMemoryFileSystem), 4388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian Sources(*Diagnostics, Files), 4488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian Rewrite(Sources, Options) { 4588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian Diagnostics->setClient(new IgnoringDiagConsumer, true); 4688b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian } 4788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 4888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian FileID createInMemoryFile(StringRef Name, StringRef Content) { 49a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar InMemoryFileSystem->addFile(Name, 0, 50a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar llvm::MemoryBuffer::getMemBuffer(Content)); 51a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar const FileEntry *Entry = Files.getFile(Name); 526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines assert(Entry != nullptr); 5388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User); 5488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian } 5588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 5688b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian std::string getRewrittenText(FileID ID) { 5788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian std::string Result; 5888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian llvm::raw_string_ostream OS(Result); 5988b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian Rewrite.getEditBuffer(ID).write(OS); 6088b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian OS.flush(); 6188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian return Result; 6288b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian } 6388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 64cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts; 65cfa88f893915ceb8ae4ce2f17c46c24a4d67502fDmitri Gribenko IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics; 66a4de17562d13d7a8188108243c4cfbd52f33229aPirama Arumuga Nainar IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem; 6788b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian FileManager Files; 6888b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian SourceManager Sources; 6988b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian Rewriter Rewrite; 7088b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian}; 7188b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 7286cfda2fcccc84e92fb7f27e85b58312440ca8deDmitri Gribenko} // end namespace index 7388b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian} // end namespace clang 7488b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian 7588b9521364735a6c9a7ccd23c5bd19d81a80cdd3Fariborz Jahanian#endif 76