1fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//===--- RefactoringCallbacks.h - Structural query framework ----*- C++ -*-===//
2fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
3fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//                     The LLVM Compiler Infrastructure
4fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
5fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper// This file is distributed under the University of Illinois Open Source
6fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper// License. See LICENSE.TXT for details.
7fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
8fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//===----------------------------------------------------------------------===//
9fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
10fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  Provides callbacks to make common kinds of refactorings easy.
11fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
12fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  The general idea is to construct a matcher expression that describes a
13fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  subtree match on the AST and then replace the corresponding source code
14fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  either by some specific text or some other AST node.
15fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
16fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  Example:
17fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  int main(int argc, char **argv) {
18fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//    ClangTool Tool(argc, argv);
19fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//    MatchFinder Finder;
20fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//    ReplaceStmtWithText Callback("integer", "42");
21fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//    Finder.AddMatcher(id("integer", expression(integerLiteral())), Callback);
22fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//    return Tool.run(newFrontendActionFactory(&Finder));
23fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  }
24fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
25fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//  This will replace all integer literals with "42".
26fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//
27fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper//===----------------------------------------------------------------------===//
28fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
29d5c66dd664b005866c9f7fc91eb0d49164bca36fDaniel Jasper#ifndef LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
30d5c66dd664b005866c9f7fc91eb0d49164bca36fDaniel Jasper#define LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
31fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
32fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper#include "clang/ASTMatchers/ASTMatchFinder.h"
33fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper#include "clang/Tooling/Refactoring.h"
34fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
35fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jaspernamespace clang {
368ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jaspernamespace tooling {
37fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
38fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \brief Base class for RefactoringCallbacks.
39fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper///
40fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// Collects \c tooling::Replacements while running.
418ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasperclass RefactoringCallback : public ast_matchers::MatchFinder::MatchCallback {
42fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperpublic:
43fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  RefactoringCallback();
448ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper  Replacements &getReplacements();
45fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
46fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperprotected:
478ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper  Replacements Replace;
48fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper};
49fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
50fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \brief Replace the text of the statement bound to \c FromId with the text in
51fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \c ToText.
52fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperclass ReplaceStmtWithText : public RefactoringCallback {
53fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperpublic:
54fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  ReplaceStmtWithText(StringRef FromId, StringRef ToText);
55651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
56fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
57fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperprivate:
58fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  std::string FromId;
59fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  std::string ToText;
60fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper};
61fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
62fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \brief Replace the text of the statement bound to \c FromId with the text of
63fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// the statement bound to \c ToId.
64fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperclass ReplaceStmtWithStmt : public RefactoringCallback {
65fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperpublic:
66fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  ReplaceStmtWithStmt(StringRef FromId, StringRef ToId);
67651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
68fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
69fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperprivate:
70fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  std::string FromId;
71fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  std::string ToId;
72fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper};
73fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
74fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \brief Replace an if-statement bound to \c Id with the outdented text of its
75fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// body, choosing the consequent or the alternative based on whether
76fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper/// \c PickTrueBranch is true.
77fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperclass ReplaceIfStmtWithItsBody : public RefactoringCallback {
78fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperpublic:
79fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  ReplaceIfStmtWithItsBody(StringRef Id, bool PickTrueBranch);
80651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines  void run(const ast_matchers::MatchFinder::MatchResult &Result) override;
81fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
82fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasperprivate:
83fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  std::string Id;
84fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper  const bool PickTrueBranch;
85fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper};
86fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
878ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper} // end namespace tooling
88fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper} // end namespace clang
89fe7beeb421b90f66b4a96c2358c5a838c376a0a8Daniel Jasper
90d5c66dd664b005866c9f7fc91eb0d49164bca36fDaniel Jasper#endif // LLVM_CLANG_TOOLING_REFACTORING_CALLBACKS_H
91