diff options
| author | Stephen Hines <srhines@google.com> | 2019-07-02 16:25:20 -0700 |
|---|---|---|
| committer | Ali B <abittin@gmail.com> | 2019-07-05 19:33:16 +0300 |
| commit | 9afee4e65dc5f9f5eb371683729ff67b8df81d03 (patch) | |
| tree | 4cf241d6c9044f91ee8c06e6920174d06f8de0b6 /clang-r353983e/include/clang/Tooling/Refactoring.h | |
| parent | 2f19bd722c4c825320d1511c1ed83161b7f95d51 (diff) | |
clang 9.0.5 (based on r353983e) from build 5696680.
Bug: http://b/135931688
Bug: http://b/136008926
Test: N/A
Change-Id: I922d17410047d2e2df4625615352c588ee71b203
Diffstat (limited to 'clang-r353983e/include/clang/Tooling/Refactoring.h')
| -rw-r--r-- | clang-r353983e/include/clang/Tooling/Refactoring.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/clang-r353983e/include/clang/Tooling/Refactoring.h b/clang-r353983e/include/clang/Tooling/Refactoring.h new file mode 100644 index 00000000..b82b09f0 --- /dev/null +++ b/clang-r353983e/include/clang/Tooling/Refactoring.h @@ -0,0 +1,99 @@ +//===--- Refactoring.h - Framework for clang refactoring tools --*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Interfaces supporting refactorings that span multiple translation units. +// While single translation unit refactorings are supported via the Rewriter, +// when refactoring multiple translation units changes must be stored in a +// SourceManager independent form, duplicate changes need to be removed, and +// all changes must be applied at once at the end of the refactoring so that +// the code is always parseable. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_CLANG_TOOLING_REFACTORING_H +#define LLVM_CLANG_TOOLING_REFACTORING_H + +#include "clang/Tooling/Core/Replacement.h" +#include "clang/Tooling/Tooling.h" +#include <map> +#include <string> + +namespace clang { + +class Rewriter; + +namespace tooling { + +/// A tool to run refactorings. +/// +/// This is a refactoring specific version of \see ClangTool. FrontendActions +/// passed to run() and runAndSave() should add replacements to +/// getReplacements(). +class RefactoringTool : public ClangTool { +public: + /// \see ClangTool::ClangTool. + RefactoringTool(const CompilationDatabase &Compilations, + ArrayRef<std::string> SourcePaths, + std::shared_ptr<PCHContainerOperations> PCHContainerOps = + std::make_shared<PCHContainerOperations>()); + + /// Returns the file path to replacements map to which replacements + /// should be added during the run of the tool. + std::map<std::string, Replacements> &getReplacements(); + + /// Call run(), apply all generated replacements, and immediately save + /// the results to disk. + /// + /// \returns 0 upon success. Non-zero upon failure. + int runAndSave(FrontendActionFactory *ActionFactory); + + /// Apply all stored replacements to the given Rewriter. + /// + /// FileToReplaces will be deduplicated with `groupReplacementsByFile` before + /// application. + /// + /// Replacement applications happen independently of the success of other + /// applications. + /// + /// \returns true if all replacements apply. false otherwise. + bool applyAllReplacements(Rewriter &Rewrite); + +private: + /// Write all refactored files to disk. + int saveRewrittenFiles(Rewriter &Rewrite); + +private: + std::map<std::string, Replacements> FileToReplaces; +}; + +/// Groups \p Replaces by the file path and applies each group of +/// Replacements on the related file in \p Rewriter. In addition to applying +/// given Replacements, this function also formats the changed code. +/// +/// \pre Replacements must be conflict-free. +/// +/// FileToReplaces will be deduplicated with `groupReplacementsByFile` before +/// application. +/// +/// Replacement applications happen independently of the success of other +/// applications. +/// +/// \param[in] FileToReplaces Replacements (grouped by files) to apply. +/// \param[in] Rewrite The `Rewritter` to apply replacements on. +/// \param[in] Style The style name used for reformatting. See ```getStyle``` in +/// "include/clang/Format/Format.h" for all possible style forms. +/// +/// \returns true if all replacements applied and formatted. false otherwise. +bool formatAndApplyAllReplacements( + const std::map<std::string, Replacements> &FileToReplaces, + Rewriter &Rewrite, StringRef Style = "file"); + +} // end namespace tooling +} // end namespace clang + +#endif // LLVM_CLANG_TOOLING_REFACTORING_H |
