xref: /aosp_15_r20/external/clang/lib/Index/SimpleFormatContext.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===--- SimpleFormatContext.h ----------------------------------*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li //
10*67e74705SXin Li /// \file
11*67e74705SXin Li ///
12*67e74705SXin Li /// \brief Defines a utility class for use of clang-format in libclang
13*67e74705SXin Li //
14*67e74705SXin Li //===----------------------------------------------------------------------===//
15*67e74705SXin Li 
16*67e74705SXin Li #ifndef LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H
17*67e74705SXin Li #define LLVM_CLANG_LIB_INDEX_SIMPLEFORMATCONTEXT_H
18*67e74705SXin Li 
19*67e74705SXin Li #include "clang/Basic/Diagnostic.h"
20*67e74705SXin Li #include "clang/Basic/DiagnosticOptions.h"
21*67e74705SXin Li #include "clang/Basic/FileManager.h"
22*67e74705SXin Li #include "clang/Basic/LangOptions.h"
23*67e74705SXin Li #include "clang/Basic/SourceManager.h"
24*67e74705SXin Li #include "clang/Rewrite/Core/Rewriter.h"
25*67e74705SXin Li #include "llvm/Support/FileSystem.h"
26*67e74705SXin Li #include "llvm/Support/Path.h"
27*67e74705SXin Li #include "llvm/Support/raw_ostream.h"
28*67e74705SXin Li 
29*67e74705SXin Li namespace clang {
30*67e74705SXin Li namespace index {
31*67e74705SXin Li 
32*67e74705SXin Li /// \brief A small class to be used by libclang clients to format
33*67e74705SXin Li /// a declaration string in memory. This object is instantiated once
34*67e74705SXin Li /// and used each time a formatting is needed.
35*67e74705SXin Li class SimpleFormatContext {
36*67e74705SXin Li public:
SimpleFormatContext(LangOptions Options)37*67e74705SXin Li   SimpleFormatContext(LangOptions Options)
38*67e74705SXin Li       : DiagOpts(new DiagnosticOptions()),
39*67e74705SXin Li         Diagnostics(new DiagnosticsEngine(new DiagnosticIDs,
40*67e74705SXin Li                                           DiagOpts.get())),
41*67e74705SXin Li         InMemoryFileSystem(new vfs::InMemoryFileSystem),
42*67e74705SXin Li         Files(FileSystemOptions(), InMemoryFileSystem),
43*67e74705SXin Li         Sources(*Diagnostics, Files),
44*67e74705SXin Li         Rewrite(Sources, Options) {
45*67e74705SXin Li     Diagnostics->setClient(new IgnoringDiagConsumer, true);
46*67e74705SXin Li   }
47*67e74705SXin Li 
createInMemoryFile(StringRef Name,StringRef Content)48*67e74705SXin Li   FileID createInMemoryFile(StringRef Name, StringRef Content) {
49*67e74705SXin Li     InMemoryFileSystem->addFile(Name, 0,
50*67e74705SXin Li                                 llvm::MemoryBuffer::getMemBuffer(Content));
51*67e74705SXin Li     const FileEntry *Entry = Files.getFile(Name);
52*67e74705SXin Li     assert(Entry != nullptr);
53*67e74705SXin Li     return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User);
54*67e74705SXin Li   }
55*67e74705SXin Li 
getRewrittenText(FileID ID)56*67e74705SXin Li   std::string getRewrittenText(FileID ID) {
57*67e74705SXin Li     std::string Result;
58*67e74705SXin Li     llvm::raw_string_ostream OS(Result);
59*67e74705SXin Li     Rewrite.getEditBuffer(ID).write(OS);
60*67e74705SXin Li     OS.flush();
61*67e74705SXin Li     return Result;
62*67e74705SXin Li   }
63*67e74705SXin Li 
64*67e74705SXin Li   IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts;
65*67e74705SXin Li   IntrusiveRefCntPtr<DiagnosticsEngine> Diagnostics;
66*67e74705SXin Li   IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem;
67*67e74705SXin Li   FileManager Files;
68*67e74705SXin Li   SourceManager Sources;
69*67e74705SXin Li   Rewriter Rewrite;
70*67e74705SXin Li };
71*67e74705SXin Li 
72*67e74705SXin Li } // end namespace index
73*67e74705SXin Li } // end namespace clang
74*67e74705SXin Li 
75*67e74705SXin Li #endif
76