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