blob: face37b4324db483fadba66074f6ff82061177eb [file] [log] [blame]
Edwin Vane3bf14ce2013-08-22 13:07:14 +00001//===-- ClangReplaceMain.cpp - Main file for clang-replace tool -----------===//
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/// \file
11/// \brief This file provides the main function for the clang-replace tool.
12///
13//===----------------------------------------------------------------------===//
14
15#include "ApplyReplacements.h"
16#include "clang/Basic/Diagnostic.h"
17#include "clang/Basic/DiagnosticOptions.h"
Edwin Vane1106ef22013-08-22 13:40:32 +000018#include "clang/Basic/SourceManager.h"
Edwin Vanef18633c2013-08-28 17:19:10 +000019#include "clang/Rewrite/Core/Rewriter.h"
Edwin Vane3bf14ce2013-08-22 13:07:14 +000020#include "llvm/Support/CommandLine.h"
21
22using namespace llvm;
23using namespace clang;
24using namespace clang::replace;
25
26static cl::opt<std::string> Directory(cl::Positional, cl::Required,
27 cl::desc("<Search Root Directory>"));
28
Tareq A. Siraj11755522013-08-26 19:58:59 +000029static cl::opt<bool> RemoveTUReplacementFiles(
30 "remove-change-desc-files",
31 cl::desc("Remove the change description files regardless of successful\n"
32 "merging/replacing."),
33 cl::init(false));
34
35// Helper object to remove the TUReplacement files (triggered by
36// "remove-change-desc-files" command line option) when exiting current scope.
37class ScopedFileRemover {
38public:
39 ScopedFileRemover(const TUReplacementFiles &Files,
40 clang::DiagnosticsEngine &Diagnostics)
41 : TURFiles(Files), Diag(Diagnostics) {}
42
43 ~ScopedFileRemover() {
44 deleteReplacementFiles(TURFiles, Diag);
45 }
46
47private:
48 const TUReplacementFiles &TURFiles;
49 clang::DiagnosticsEngine &Diag;
50};
51
Edwin Vane3bf14ce2013-08-22 13:07:14 +000052int main(int argc, char **argv) {
53 cl::ParseCommandLineOptions(argc, argv);
54
55 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
56 DiagnosticsEngine Diagnostics(
57 IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
58 DiagOpts.getPtr());
59
60 TUReplacements TUs;
Tareq A. Siraj11755522013-08-26 19:58:59 +000061 TUReplacementFiles TURFiles;
Edwin Vane3bf14ce2013-08-22 13:07:14 +000062
63 error_code ErrorCode =
Tareq A. Siraj11755522013-08-26 19:58:59 +000064 collectReplacementsFromDirectory(Directory, TUs, TURFiles, Diagnostics);
Edwin Vane3bf14ce2013-08-22 13:07:14 +000065
66 if (ErrorCode) {
67 errs() << "Trouble iterating over directory '" << Directory
68 << "': " << ErrorCode.message() << "\n";
69 return false;
70 }
71
Tareq A. Siraj11755522013-08-26 19:58:59 +000072 // Remove the TUReplacementFiles (triggered by "remove-change-desc-files"
73 // command line option) when exiting main().
74 OwningPtr<ScopedFileRemover> Remover;
75 if (RemoveTUReplacementFiles)
76 Remover.reset(new ScopedFileRemover(TURFiles, Diagnostics));
77
Edwin Vane1106ef22013-08-22 13:40:32 +000078 FileManager Files((FileSystemOptions()));
79 SourceManager SM(Diagnostics, Files);
80
Edwin Vane3bf14ce2013-08-22 13:07:14 +000081 FileToReplacementsMap GroupedReplacements;
Edwin Vane1106ef22013-08-22 13:40:32 +000082 if (!mergeAndDeduplicate(TUs, GroupedReplacements, SM))
83 return 1;
84
Edwin Vanef18633c2013-08-28 17:19:10 +000085 Rewriter DestRewriter(SM, LangOptions());
86 if (!applyReplacements(GroupedReplacements, DestRewriter)) {
87 errs() << "Failed to apply all replacements. No changes made.\n";
Edwin Vane1106ef22013-08-22 13:40:32 +000088 return 1;
Edwin Vanef18633c2013-08-28 17:19:10 +000089 }
90
91 if (!writeFiles(DestRewriter))
92 return 1;
93
94 return 0;
Edwin Vane3bf14ce2013-08-22 13:07:14 +000095}