summaryrefslogtreecommitdiffstats
path: root/clang/lib/ARCMigrate/ARCMT.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/lib/ARCMigrate/ARCMT.cpp')
-rw-r--r--clang/lib/ARCMigrate/ARCMT.cpp65
1 files changed, 59 insertions, 6 deletions
diff --git a/clang/lib/ARCMigrate/ARCMT.cpp b/clang/lib/ARCMigrate/ARCMT.cpp
index 0678a255d71..73c8dbd6a4e 100644
--- a/clang/lib/ARCMigrate/ARCMT.cpp
+++ b/clang/lib/ARCMigrate/ARCMT.cpp
@@ -269,9 +269,10 @@ bool arcmt::checkForManualIssues(CompilerInvocation &origCI,
// applyTransformations.
//===----------------------------------------------------------------------===//
-bool arcmt::applyTransformations(CompilerInvocation &origCI,
- llvm::StringRef Filename, InputKind Kind,
- DiagnosticClient *DiagClient) {
+static bool applyTransforms(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient,
+ llvm::StringRef outputDir) {
if (!origCI.getLangOpts().ObjC1)
return false;
@@ -284,7 +285,7 @@ bool arcmt::applyTransformations(CompilerInvocation &origCI,
CInvok.getFrontendOpts().Inputs.clear();
CInvok.getFrontendOpts().Inputs.push_back(std::make_pair(Kind, Filename));
- MigrationProcess migration(CInvok, DiagClient);
+ MigrationProcess migration(CInvok, DiagClient, outputDir);
std::vector<TransformFn> transforms = arcmt::getAllTransformations();
assert(!transforms.empty());
@@ -294,12 +295,52 @@ bool arcmt::applyTransformations(CompilerInvocation &origCI,
if (err) return true;
}
- origCI.getLangOpts().ObjCAutoRefCount = true;
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+
+ if (outputDir.empty()) {
+ origCI.getLangOpts().ObjCAutoRefCount = true;
+ return migration.getRemapper().overwriteOriginal(*Diags);
+ } else
+ return migration.getRemapper().flushToDisk(outputDir, *Diags);
+}
+
+bool arcmt::applyTransformations(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient) {
+ return applyTransforms(origCI, Filename, Kind, DiagClient, llvm::StringRef());
+}
+
+bool arcmt::migrateWithTemporaryFiles(CompilerInvocation &origCI,
+ llvm::StringRef Filename, InputKind Kind,
+ DiagnosticClient *DiagClient,
+ llvm::StringRef outputDir) {
+ assert(!outputDir.empty() && "Expected output directory path");
+ return applyTransforms(origCI, Filename, Kind, DiagClient, outputDir);
+}
+
+bool arcmt::getFileRemappings(std::vector<std::pair<std::string,std::string> > &
+ remap,
+ llvm::StringRef outputDir,
+ DiagnosticClient *DiagClient) {
+ assert(!outputDir.empty());
llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
- return migration.getRemapper().overwriteOriginal(*Diags);
+
+ FileRemapper remapper;
+ bool err = remapper.initFromDisk(outputDir, *Diags,
+ /*ignoreIfFilesChanged=*/true);
+ if (err)
+ return true;
+
+ CompilerInvocation CI;
+ remapper.applyMappings(CI);
+ remap = CI.getPreprocessorOpts().RemappedFiles;
+
+ return false;
}
//===----------------------------------------------------------------------===//
@@ -382,6 +423,18 @@ public:
/// \brief Anchor for VTable.
MigrationProcess::RewriteListener::~RewriteListener() { }
+MigrationProcess::MigrationProcess(const CompilerInvocation &CI,
+ DiagnosticClient *diagClient,
+ llvm::StringRef outputDir)
+ : OrigCI(CI), DiagClient(diagClient) {
+ if (!outputDir.empty()) {
+ llvm::IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs());
+ llvm::IntrusiveRefCntPtr<Diagnostic> Diags(
+ new Diagnostic(DiagID, DiagClient, /*ShouldOwnClient=*/false));
+ Remapper.initFromDisk(outputDir, *Diags, /*ignoreIfFilesChanges=*/true);
+ }
+}
+
bool MigrationProcess::applyTransform(TransformFn trans,
RewriteListener *listener) {
llvm::OwningPtr<CompilerInvocation> CInvok;
OpenPOWER on IntegriCloud