1//===--- Refactoring.h - Framework for clang refactoring tools --*- C++ -*-===// 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// Interfaces supporting refactorings that span multiple translation units. 11// While single translation unit refactorings are supported via the Rewriter, 12// when refactoring multiple translation units changes must be stored in a 13// SourceManager independent form, duplicate changes need to be removed, and 14// all changes must be applied at once at the end of the refactoring so that 15// the code is always parseable. 16// 17//===----------------------------------------------------------------------===// 18 19#ifndef LLVM_CLANG_TOOLING_REFACTORING_H 20#define LLVM_CLANG_TOOLING_REFACTORING_H 21 22#include "clang/Tooling/Core/Replacement.h" 23#include "clang/Tooling/Tooling.h" 24#include <map> 25#include <string> 26 27namespace clang { 28 29class Rewriter; 30 31namespace tooling { 32 33/// \brief A tool to run refactorings. 34/// 35/// This is a refactoring specific version of \see ClangTool. FrontendActions 36/// passed to run() and runAndSave() should add replacements to 37/// getReplacements(). 38class RefactoringTool : public ClangTool { 39public: 40 /// \see ClangTool::ClangTool. 41 RefactoringTool(const CompilationDatabase &Compilations, 42 ArrayRef<std::string> SourcePaths, 43 std::shared_ptr<PCHContainerOperations> PCHContainerOps = 44 std::make_shared<PCHContainerOperations>()); 45 46 /// \brief Returns the file path to replacements map to which replacements 47 /// should be added during the run of the tool. 48 std::map<std::string, Replacements> &getReplacements(); 49 50 /// \brief Call run(), apply all generated replacements, and immediately save 51 /// the results to disk. 52 /// 53 /// \returns 0 upon success. Non-zero upon failure. 54 int runAndSave(FrontendActionFactory *ActionFactory); 55 56 /// \brief Apply all stored replacements to the given Rewriter. 57 /// 58 /// FileToReplaces will be deduplicated with `groupReplacementsByFile` before 59 /// application. 60 /// 61 /// Replacement applications happen independently of the success of other 62 /// applications. 63 /// 64 /// \returns true if all replacements apply. false otherwise. 65 bool applyAllReplacements(Rewriter &Rewrite); 66 67private: 68 /// \brief Write all refactored files to disk. 69 int saveRewrittenFiles(Rewriter &Rewrite); 70 71private: 72 std::map<std::string, Replacements> FileToReplaces; 73}; 74 75/// \brief Groups \p Replaces by the file path and applies each group of 76/// Replacements on the related file in \p Rewriter. In addition to applying 77/// given Replacements, this function also formats the changed code. 78/// 79/// \pre Replacements must be conflict-free. 80/// 81/// FileToReplaces will be deduplicated with `groupReplacementsByFile` before 82/// application. 83/// 84/// Replacement applications happen independently of the success of other 85/// applications. 86/// 87/// \param[in] FileToReplaces Replacements (grouped by files) to apply. 88/// \param[in] Rewrite The `Rewritter` to apply replacements on. 89/// \param[in] Style The style name used for reformatting. See ```getStyle``` in 90/// "include/clang/Format/Format.h" for all possible style forms. 91/// 92/// \returns true if all replacements applied and formatted. false otherwise. 93bool formatAndApplyAllReplacements( 94 const std::map<std::string, Replacements> &FileToReplaces, 95 Rewriter &Rewrite, StringRef Style = "file"); 96 97} // end namespace tooling 98} // end namespace clang 99 100#endif // LLVM_CLANG_TOOLING_REFACTORING_H 101