Clang Project

clang_source_code/include/clang/ARCMigrate/FileRemapper.h
1//===-- FileRemapper.h - File Remapping Helper ------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
10#define LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
11
12#include "clang/Basic/LLVM.h"
13#include "llvm/ADT/DenseMap.h"
14#include "llvm/ADT/PointerUnion.h"
15#include "llvm/ADT/StringRef.h"
16#include <memory>
17
18namespace llvm {
19  class MemoryBuffer;
20}
21
22namespace clang {
23  class FileManager;
24  class FileEntry;
25  class DiagnosticsEngine;
26  class PreprocessorOptions;
27
28namespace arcmt {
29
30class FileRemapper {
31  // FIXME: Reuse the same FileManager for multiple ASTContexts.
32  std::unique_ptr<FileManagerFileMgr;
33
34  typedef llvm::PointerUnion<const FileEntry *, llvm::MemoryBuffer *> Target;
35  typedef llvm::DenseMap<const FileEntry *, Target> MappingsTy;
36  MappingsTy FromToMappings;
37
38  llvm::DenseMap<const FileEntry *, const FileEntry *> ToFromMappings;
39
40public:
41  FileRemapper();
42  ~FileRemapper();
43
44  bool initFromDisk(StringRef outputDirDiagnosticsEngine &Diag,
45                    bool ignoreIfFilesChanged);
46  bool initFromFile(StringRef filePathDiagnosticsEngine &Diag,
47                    bool ignoreIfFilesChanged);
48  bool flushToDisk(StringRef outputDirDiagnosticsEngine &Diag);
49  bool flushToFile(StringRef outputPathDiagnosticsEngine &Diag);
50
51  bool overwriteOriginal(DiagnosticsEngine &Diag,
52                         StringRef outputDir = StringRef());
53
54  void remap(StringRef filePathstd::unique_ptr<llvm::MemoryBuffermemBuf);
55
56  void applyMappings(PreprocessorOptions &PPOptsconst;
57
58  void clear(StringRef outputDir = StringRef());
59
60private:
61  void remap(const FileEntry *filestd::unique_ptr<llvm::MemoryBuffermemBuf);
62  void remap(const FileEntry *fileconst FileEntry *newfile);
63
64  const FileEntry *getOriginalFile(StringRef filePath);
65  void resetTarget(Target &targ);
66
67  bool report(const Twine &errDiagnosticsEngine &Diag);
68
69  std::string getRemapInfoFile(StringRef outputDir);
70};
71
72// end namespace arcmt
73
74}  // end namespace clang
75
76#endif
77
clang::arcmt::FileRemapper::FileMgr
clang::arcmt::FileRemapper::FromToMappings
clang::arcmt::FileRemapper::ToFromMappings
clang::arcmt::FileRemapper::initFromDisk
clang::arcmt::FileRemapper::initFromFile
clang::arcmt::FileRemapper::flushToDisk
clang::arcmt::FileRemapper::flushToFile
clang::arcmt::FileRemapper::overwriteOriginal
clang::arcmt::FileRemapper::remap
clang::arcmt::FileRemapper::applyMappings
clang::arcmt::FileRemapper::clear
clang::arcmt::FileRemapper::remap
clang::arcmt::FileRemapper::remap
clang::arcmt::FileRemapper::getOriginalFile
clang::arcmt::FileRemapper::resetTarget
clang::arcmt::FileRemapper::report
clang::arcmt::FileRemapper::getRemapInfoFile