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