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