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