97int main(
int argc,
const char **argv) {
98 llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
100 tooling::CommonOptionsParser::create(argc, argv, ClangMoveCategory);
101 if (!ExpectedParser) {
102 llvm::errs() << ExpectedParser.takeError();
105 tooling::CommonOptionsParser &OptionsParser = ExpectedParser.get();
107 if (OldDependOnNew && NewDependOnOld) {
108 llvm::errs() <<
"Provide either --old_depend_on_new or "
109 "--new_depend_on_old. clang-move doesn't support these two "
110 "options at same time (It will introduce include cycle).\n";
114 tooling::RefactoringTool Tool(OptionsParser.getCompilations(),
115 OptionsParser.getSourcePathList());
117 Tool.appendArgumentsAdjuster(tooling::getInsertArgumentAdjuster(
118 "-fparse-all-comments", tooling::ArgumentInsertPosition::BEGIN));
120 Spec.
Names = {Names.begin(), Names.end()};
128 llvm::SmallString<128> InitialDirectory;
129 if (std::error_code EC = llvm::sys::fs::current_path(InitialDirectory))
130 llvm::report_fatal_error(
"Cannot detect current path: " +
131 Twine(EC.message()));
134 std::string(InitialDirectory), Style,
139 int CodeStatus = Tool.run(&Factory);
144 llvm::outs() <<
"[\n";
146 for (
auto I = Declarations.begin(), E = Declarations.end(); I != E; ++I) {
147 llvm::outs() <<
" {\n";
148 llvm::outs() <<
" \"DeclarationName\": \"" << I->QualifiedName
150 llvm::outs() <<
" \"DeclarationType\": \"" << I->Kind <<
"\",\n";
151 llvm::outs() <<
" \"Templated\": " << (I->Templated ?
"true" :
"false")
153 llvm::outs() <<
" }";
155 if (I != std::prev(E))
156 llvm::outs() <<
",\n";
158 llvm::outs() <<
"\n]\n";
162 if (!NewCC.empty()) {
163 std::error_code EC = CreateNewFile(NewCC);
165 llvm::errs() <<
"Failed to create " << NewCC <<
": " << EC.message()
170 if (!NewHeader.empty()) {
171 std::error_code EC = CreateNewFile(NewHeader);
173 llvm::errs() <<
"Failed to create " << NewHeader <<
": " << EC.message()
179 DiagnosticOptions DiagOpts;
180 clang::TextDiagnosticPrinter DiagnosticPrinter(errs(), DiagOpts);
181 DiagnosticsEngine Diagnostics(DiagnosticIDs::create(), DiagOpts,
182 &DiagnosticPrinter,
false);
183 auto &FileMgr = Tool.getFiles();
184 SourceManager SM(Diagnostics, FileMgr);
185 Rewriter Rewrite(SM, LangOptions());
187 if (!formatAndApplyAllReplacements(Tool.getReplacements(), Rewrite, Style)) {
188 llvm::errs() <<
"Failed applying all replacements.\n";
193 std::set<llvm::StringRef> Files;
194 for (
const auto &it : Tool.getReplacements())
195 Files.insert(it.first);
196 auto WriteToJson = [&](llvm::raw_ostream &OS) {
198 for (
auto I = Files.begin(), E = Files.end(); I != E; ++I) {
200 OS <<
" \"FilePath\": \"" << *I <<
"\",\n";
201 const auto Entry = FileMgr.getOptionalFileRef(*I);
202 auto ID = SM.translateFile(*
Entry);
204 llvm::raw_string_ostream ContentStream(Content);
205 Rewrite.getEditBuffer(ID).write(ContentStream);
206 OS <<
" \"SourceText\": \""
207 << llvm::yaml::escape(ContentStream.str()) <<
"\"\n";
209 if (I != std::prev(E))
214 WriteToJson(llvm::outs());
218 return Rewrite.overwriteChangedFiles();