17177Svlivanov//===-- FileRemapper.h - File Remapping Helper ------------------*- C++ -*-===//
27177Svlivanov//
37177Svlivanov// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
47177Svlivanov// See https://llvm.org/LICENSE.txt for license information.
57177Svlivanov// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
67177Svlivanov//
77177Svlivanov//===----------------------------------------------------------------------===//
87177Svlivanov
97177Svlivanov#ifndef LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
107177Svlivanov#define LLVM_CLANG_ARCMIGRATE_FILEREMAPPER_H
117177Svlivanov
127177Svlivanov#include "clang/Basic/FileEntry.h"
137177Svlivanov#include "clang/Basic/LLVM.h"
147177Svlivanov#include "llvm/ADT/DenseMap.h"
157177Svlivanov#include "llvm/ADT/STLExtras.h"
167177Svlivanov#include "llvm/ADT/StringRef.h"
177177Svlivanov#include <memory>
187177Svlivanov#include <variant>
197177Svlivanov
207177Svlivanovnamespace llvm {
217177Svlivanov  class MemoryBuffer;
227177Svlivanov  class MemoryBufferRef;
237177Svlivanov}
247177Svlivanov
257177Svlivanovnamespace clang {
2612072Sjcm  class FileManager;
2711707Stpivovarova  class DiagnosticsEngine;
2811707Stpivovarova  class PreprocessorOptions;
2911905Sjcm
3012072Sjcmnamespace arcmt {
317177Svlivanov
327177Svlivanovclass FileRemapper {
3311707Stpivovarova  // FIXME: Reuse the same FileManager for multiple ASTContexts.
3411707Stpivovarova  std::unique_ptr<FileManager> FileMgr;
357177Svlivanov
367177Svlivanov  using Target = std::variant<FileEntryRef, llvm::MemoryBuffer *>;
377177Svlivanov  using MappingsTy = llvm::DenseMap<FileEntryRef, Target>;
387177Svlivanov  MappingsTy FromToMappings;
397177Svlivanov
407177Svlivanov  llvm::DenseMap<const FileEntry *, FileEntryRef> ToFromMappings;
417177Svlivanov
427177Svlivanovpublic:
437177Svlivanov  FileRemapper();
447177Svlivanov  ~FileRemapper();
457177Svlivanov
467177Svlivanov  bool initFromDisk(StringRef outputDir, DiagnosticsEngine &Diag,
477177Svlivanov                    bool ignoreIfFilesChanged);
487177Svlivanov  bool initFromFile(StringRef filePath, DiagnosticsEngine &Diag,
497177Svlivanov                    bool ignoreIfFilesChanged);
507177Svlivanov  bool flushToDisk(StringRef outputDir, DiagnosticsEngine &Diag);
517177Svlivanov  bool flushToFile(StringRef outputPath, DiagnosticsEngine &Diag);
527177Svlivanov
537177Svlivanov  bool overwriteOriginal(DiagnosticsEngine &Diag,
547177Svlivanov                         StringRef outputDir = StringRef());
557177Svlivanov
567177Svlivanov  void remap(StringRef filePath, std::unique_ptr<llvm::MemoryBuffer> memBuf);
577177Svlivanov
587177Svlivanov  void applyMappings(PreprocessorOptions &PPOpts) const;
597177Svlivanov
607177Svlivanov  /// Iterate through all the mappings.
617177Svlivanov  void forEachMapping(
627177Svlivanov      llvm::function_ref<void(StringRef, StringRef)> CaptureFile,
637177Svlivanov      llvm::function_ref<void(StringRef, const llvm::MemoryBufferRef &)>
647177Svlivanov          CaptureBuffer) const;
657177Svlivanov
667177Svlivanov  void clear(StringRef outputDir = StringRef());
677177Svlivanov
68private:
69  void remap(FileEntryRef file, std::unique_ptr<llvm::MemoryBuffer> memBuf);
70  void remap(FileEntryRef file, FileEntryRef newfile);
71
72  OptionalFileEntryRef getOriginalFile(StringRef filePath);
73  void resetTarget(Target &targ);
74
75  bool report(const Twine &err, DiagnosticsEngine &Diag);
76
77  std::string getRemapInfoFile(StringRef outputDir);
78};
79
80} // end namespace arcmt
81
82}  // end namespace clang
83
84#endif
85