//===-- cpp11-migrate/Cpp11Migrate.cpp - Main file C++11 migration tool ---===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// \file /// \brief This file implements the C++11 feature migration tool main function /// and transformation framework. /// /// Usage: /// cpp11-migrate [-p ] ... [-- [compiler-options]] /// /// Where is a CMake build directory containing a file named /// compile_commands.json which provides compiler options for building each /// sourc file. If is not provided the compile_commands.json file /// is searched for through all parent directories. /// /// Alternatively, one can provide compile options to be applied to every source /// file after the optional '--'. /// /// ... specify the paths of files in the CMake source tree, with the /// same requirements as other tools built on LibTooling. /// //===----------------------------------------------------------------------===// #include "clang/Frontend/FrontendActions.h" #include "clang/Tooling/CommonOptionsParser.h" #include "clang/Tooling/Tooling.h" #include "Transforms.h" #include "Transform.h" namespace cl = llvm::cl; using namespace clang::tooling; static cl::opt MaxRiskLevel("risk", cl::desc("Select a maximum risk level:"), cl::values( clEnumValN(RL_Safe, "safe", "Only safe transformations"), clEnumValN(RL_Reasonable, "reasonable", "Enable transformations that might change " "semantics (default)"), clEnumValN(RL_Risky, "risky", "Enable transformations that are likely to " "change semantics"), clEnumValEnd), cl::init(RL_Reasonable)); int main(int argc, const char **argv) { Transforms TransformManager; TransformManager.createTransformOpts(); // This causes options to be parsed. CommonOptionsParser OptionsParser(argc, argv); TransformManager.createSelectedTransforms(); if (TransformManager.begin() == TransformManager.end()) { llvm::errs() << "No selected transforms\n"; return 1; } // Initial syntax check. ClangTool SyntaxTool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); // First, let's check to make sure there were no errors. if (SyntaxTool.run(newFrontendActionFactory()) != 0) { return 1; } // Apply transforms. for (Transforms::const_iterator I = TransformManager.begin(), E = TransformManager.end(); I != E; ++I) { if ((*I)->apply(MaxRiskLevel, OptionsParser.getCompilations(), OptionsParser.getSourcePathList()) != 0) { return 1; } } // Final Syntax check. ClangTool EndSyntaxTool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); if (EndSyntaxTool.run( newFrontendActionFactory()) != 0) { // FIXME: Revert changes made to files that fail the syntax test. return 1; } return 0; }