blob: 2c26e4d82e081cba3d2fa2937256c5e41fca2bab [file] [log] [blame]
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +00001//===--- SimpleFormatContext.h ----------------------------------*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Fariborz Jahanianae9d8ae2012-12-19 17:03:46 +000010/// \file
Fariborz Jahanian799d96b2012-12-19 01:00:36 +000011///
Fariborz Jahanianae9d8ae2012-12-19 17:03:46 +000012/// \brief Defines a utility class for use of clang-format in libclang
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000013//
14//===----------------------------------------------------------------------===//
15
Benjamin Kramer2f5db8b2014-08-13 16:25:19 +000016#ifndef LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H
17#define LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000018
19#include "clang/Basic/Diagnostic.h"
20#include "clang/Basic/DiagnosticOptions.h"
21#include "clang/Basic/FileManager.h"
22#include "clang/Basic/LangOptions.h"
23#include "clang/Basic/SourceManager.h"
24#include "clang/Rewrite/Core/Rewriter.h"
25#include "llvm/Support/FileSystem.h"
26#include "llvm/Support/Path.h"
27#include "llvm/Support/raw_ostream.h"
28
29namespace clang {
Dmitri Gribenko9e605112013-11-13 22:16:51 +000030namespace index {
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000031
32/// \brief A small class to be used by libclang clients to format
33/// a declaration string in memory. This object is instantiated once
34/// and used each time a formatting is needed.
35class SimpleFormatContext {
Fariborz Jahanianb67908a2012-12-19 00:01:48 +000036public:
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000037 SimpleFormatContext(LangOptions Options)
38 : DiagOpts(new DiagnosticOptions()),
Dmitri Gribenko9e605112013-11-13 22:16:51 +000039 Diagnostics(new DiagnosticsEngine(new DiagnosticIDs,
Alp Tokerf994cef2014-07-05 03:08:06 +000040 DiagOpts.get())),
Benjamin Kramerb93511a2015-10-06 10:23:34 +000041 InMemoryFileSystem(new vfs::InMemoryFileSystem),
42 Files(FileSystemOptions(), InMemoryFileSystem),
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000043 Sources(*Diagnostics, Files),
44 Rewrite(Sources, Options) {
45 Diagnostics->setClient(new IgnoringDiagConsumer, true);
46 }
47
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000048 FileID createInMemoryFile(StringRef Name, StringRef Content) {
Benjamin Kramerb93511a2015-10-06 10:23:34 +000049 InMemoryFileSystem->addFile(Name, 0,
50 llvm::MemoryBuffer::getMemBuffer(Content));
51 const FileEntry *Entry = Files.getFile(Name);
Craig Topper236bde32014-05-26 06:21:51 +000052 assert(Entry != nullptr);
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000053 return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User);
54 }
55
56 std::string getRewrittenText(FileID ID) {
57 std::string Result;
58 llvm::raw_string_ostream OS(Result);
59 Rewrite.getEditBuffer(ID).write(OS);
60 OS.flush();
61 return Result;
62 }
63
Dmitri Gribenkof8579502013-01-12 19:30:44 +000064 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
65 IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics;
Benjamin Kramerb93511a2015-10-06 10:23:34 +000066 IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem;
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000067 FileManager Files;
68 SourceManager Sources;
69 Rewriter Rewrite;
70};
71
Dmitri Gribenko9e605112013-11-13 22:16:51 +000072} // end namespace index
Fariborz Jahanian9b7ab872012-12-18 23:02:59 +000073} // end namespace clang
74
75#endif