FileRemapper.h revision 6f42b62b6194f53bcbc349f5d17388e1936535d7
1//===-- FileRemapper.h - File Remapping Helper ------------------*- 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
10#ifndef LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
11#define LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
12
13#include "clang/Basic/LLVM.h"
14#include "llvm/ADT/OwningPtr.h"
15#include "llvm/ADT/PointerUnion.h"
16#include "llvm/ADT/DenseMap.h"
17#include "llvm/ADT/StringRef.h"
18
19namespace llvm {
20  class MemoryBuffer;
21}
22
23namespace clang {
24  class FileManager;
25  class FileEntry;
26  class DiagnosticsEngine;
27  class CompilerInvocation;
28
29namespace arcmt {
30
31class FileRemapper {
32  // FIXME: Reuse the same FileManager for multiple ASTContexts.
33  OwningPtr<FileManager> FileMgr;
34
35  typedef llvm::PointerUnion<const FileEntry *, llvm::MemoryBuffer *> Target;
36  typedef llvm::DenseMap<const FileEntry *, Target> MappingsTy;
37  MappingsTy FromToMappings;
38
39  llvm::DenseMap<const FileEntry *, const FileEntry *> ToFromMappings;
40
41public:
42  FileRemapper();
43  ~FileRemapper();
44
45  bool initFromDisk(StringRef outputDir, DiagnosticsEngine &Diag,
46                    bool ignoreIfFilesChanged);
47  bool flushToDisk(StringRef outputDir, DiagnosticsEngine &Diag);
48
49  bool overwriteOriginal(DiagnosticsEngine &Diag,
50                         StringRef outputDir = StringRef());
51
52  void remap(StringRef filePath, llvm::MemoryBuffer *memBuf);
53  void remap(StringRef filePath, StringRef newPath);
54
55  void applyMappings(CompilerInvocation &CI) const;
56
57  void transferMappingsAndClear(CompilerInvocation &CI);
58
59  void clear(StringRef outputDir = StringRef());
60
61private:
62  void remap(const FileEntry *file, llvm::MemoryBuffer *memBuf);
63  void remap(const FileEntry *file, const FileEntry *newfile);
64
65  const FileEntry *getOriginalFile(StringRef filePath);
66  void resetTarget(Target &targ);
67
68  bool report(const Twine &err, DiagnosticsEngine &Diag);
69
70  std::string getRemapInfoFile(StringRef outputDir);
71};
72
73} // end namespace arcmt
74
75}  // end namespace clang
76
77#endif
78