1//===--- RefactoringCallbacks.h - Structural query framework ----*- 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//  Provides callbacks to make common kinds of refactorings easy.
11//
12//  The general idea is to construct a matcher expression that describes a
13//  subtree match on the AST and then replace the corresponding source code
14//  either by some specific text or some other AST node.
15//
16//  Example:
17//  int main(int argc, char **argv) {
18//    ClangTool Tool(argc, argv);
19//    MatchFinder Finder;
20//    ReplaceStmtWithText Callback("integer", "42");
21//    Finder.AddMatcher(id("integer", expression(integerLiteral())), Callback);
22//    return Tool.run(newFrontendActionFactory(&Finder));
23//  }
24//
25//  This will replace all integer literals with "42".
26//
27//===----------------------------------------------------------------------===//
28
29#ifndef LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
30#define LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
31
32#include "clang/ASTMatchers/ASTMatchFinder.h"
33#include "clang/Tooling/Refactoring.h"
34
35namespace clang {
36namespace tooling {
37
38/// \brief Base class for RefactoringCallbacks.
39///
40/// Collects \c tooling::Replacements while running.
41class RefactoringCallback : public ast_matchers::MatchFinder::MatchCallback {
42public:
43  RefactoringCallback();
44  Replacements &getReplacements();
45
46protected:
47  Replacements Replace;
48};
49
50/// \brief Replace the text of the statement bound to \c FromId with the text in
51/// \c ToText.
52class ReplaceStmtWithText : public RefactoringCallback {
53public:
54  ReplaceStmtWithText(StringRef FromId, StringRef ToText);
55  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
56
57private:
58  std::string FromId;
59  std::string ToText;
60};
61
62/// \brief Replace the text of the statement bound to \c FromId with the text of
63/// the statement bound to \c ToId.
64class ReplaceStmtWithStmt : public RefactoringCallback {
65public:
66  ReplaceStmtWithStmt(StringRef FromId, StringRef ToId);
67  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
68
69private:
70  std::string FromId;
71  std::string ToId;
72};
73
74/// \brief Replace an if-statement bound to \c Id with the outdented text of its
75/// body, choosing the consequent or the alternative based on whether
76/// \c PickTrueBranch is true.
77class ReplaceIfStmtWithItsBody : public RefactoringCallback {
78public:
79  ReplaceIfStmtWithItsBody(StringRef Id, bool PickTrueBranch);
80  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
81
82private:
83  std::string Id;
84  const bool PickTrueBranch;
85};
86
87} // end namespace tooling
88} // end namespace clang
89
90#endif // LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
91