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); 558ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper virtual void run(const ast_matchers::MatchFinder::MatchResult &Result); 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); 678ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper virtual void run(const ast_matchers::MatchFinder::MatchResult &Result); 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); 808ee04480df468a11667dbfad1049d2b08c4b9482Daniel Jasper virtual void run(const ast_matchers::MatchFinder::MatchResult &Result); 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