blob: 01ca68604452272ca4d67bae769f21584f1ea6e3 [file] [log] [blame]
Edwin Vaneb225be22013-09-03 17:58:19 +00001//===-- ClangApplyReplacementsMain.cpp - Main file for the tool -----------===//
Edwin Vane3bf14ce2013-08-22 13:07:14 +00002//
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
Edwin Vaneb225be22013-09-03 17:58:19 +000011/// \brief This file provides the main function for the
12/// clang-apply-replacements tool.
Edwin Vane3bf14ce2013-08-22 13:07:14 +000013///
14//===----------------------------------------------------------------------===//
15
Edwin Vaneb225be22013-09-03 17:58:19 +000016#include "clang-apply-replacements/Tooling/ApplyReplacements.h"
Edwin Vane3bf14ce2013-08-22 13:07:14 +000017#include "clang/Basic/Diagnostic.h"
18#include "clang/Basic/DiagnosticOptions.h"
Edwin Vane1106ef22013-08-22 13:40:32 +000019#include "clang/Basic/SourceManager.h"
Edwin Vanef18633c2013-08-28 17:19:10 +000020#include "clang/Rewrite/Core/Rewriter.h"
Edwin Vane3bf14ce2013-08-22 13:07:14 +000021#include "llvm/Support/CommandLine.h"
22
23using namespace llvm;
24using namespace clang;
25using namespace clang::replace;
26
27static cl::opt<std::string> Directory(cl::Positional, cl::Required,
28 cl::desc("<Search Root Directory>"));
29
Tareq A. Siraj11755522013-08-26 19:58:59 +000030static cl::opt<bool> RemoveTUReplacementFiles(
31 "remove-change-desc-files",
32 cl::desc("Remove the change description files regardless of successful\n"
33 "merging/replacing."),
34 cl::init(false));
35
36// Helper object to remove the TUReplacement files (triggered by
37// "remove-change-desc-files" command line option) when exiting current scope.
38class ScopedFileRemover {
39public:
40 ScopedFileRemover(const TUReplacementFiles &Files,
41 clang::DiagnosticsEngine &Diagnostics)
42 : TURFiles(Files), Diag(Diagnostics) {}
43
44 ~ScopedFileRemover() {
45 deleteReplacementFiles(TURFiles, Diag);
46 }
47
48private:
49 const TUReplacementFiles &TURFiles;
50 clang::DiagnosticsEngine &Diag;
51};
52
Edwin Vane3bf14ce2013-08-22 13:07:14 +000053int main(int argc, char **argv) {
54 cl::ParseCommandLineOptions(argc, argv);
55
56 IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts(new DiagnosticOptions());
57 DiagnosticsEngine Diagnostics(
58 IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()),
59 DiagOpts.getPtr());
60
61 TUReplacements TUs;
Tareq A. Siraj11755522013-08-26 19:58:59 +000062 TUReplacementFiles TURFiles;
Edwin Vane3bf14ce2013-08-22 13:07:14 +000063
64 error_code ErrorCode =
Tareq A. Siraj11755522013-08-26 19:58:59 +000065 collectReplacementsFromDirectory(Directory, TUs, TURFiles, Diagnostics);
Edwin Vane3bf14ce2013-08-22 13:07:14 +000066
67 if (ErrorCode) {
68 errs() << "Trouble iterating over directory '" << Directory
69 << "': " << ErrorCode.message() << "\n";
70 return false;
71 }
72
Tareq A. Siraj11755522013-08-26 19:58:59 +000073 // Remove the TUReplacementFiles (triggered by "remove-change-desc-files"
74 // command line option) when exiting main().
75 OwningPtr<ScopedFileRemover> Remover;
76 if (RemoveTUReplacementFiles)
77 Remover.reset(new ScopedFileRemover(TURFiles, Diagnostics));
78
Edwin Vane1106ef22013-08-22 13:40:32 +000079 FileManager Files((FileSystemOptions()));
80 SourceManager SM(Diagnostics, Files);
81
Edwin Vane3bf14ce2013-08-22 13:07:14 +000082 FileToReplacementsMap GroupedReplacements;
Edwin Vane1106ef22013-08-22 13:40:32 +000083 if (!mergeAndDeduplicate(TUs, GroupedReplacements, SM))
84 return 1;
85
Edwin Vanef18633c2013-08-28 17:19:10 +000086 Rewriter DestRewriter(SM, LangOptions());
87 if (!applyReplacements(GroupedReplacements, DestRewriter)) {
88 errs() << "Failed to apply all replacements. No changes made.\n";
Edwin Vane1106ef22013-08-22 13:40:32 +000089 return 1;
Edwin Vanef18633c2013-08-28 17:19:10 +000090 }
91
92 if (!writeFiles(DestRewriter))
93 return 1;
94
95 return 0;
Edwin Vane3bf14ce2013-08-22 13:07:14 +000096}