1 //===--- RefactoringAction.h - Clang refactoring library ------------------===// 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 #ifndef LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGACTION_H 10 #define LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGACTION_H 11 12 #include "clang/Basic/LLVM.h" 13 #include "clang/Tooling/Refactoring/RefactoringActionRules.h" 14 #include <vector> 15 16 namespace clang { 17 namespace tooling { 18 19 /// A refactoring action is a class that defines a set of related refactoring 20 /// action rules. These rules get grouped under a common umbrella - a single 21 /// clang-refactor subcommand. 22 /// 23 /// A subclass of \c RefactoringAction is responsible for creating the set of 24 /// grouped refactoring action rules that represent one refactoring operation. 25 /// Although the rules in one action may have a number of different 26 /// implementations, they should strive to produce a similar result. It should 27 /// be easy for users to identify which refactoring action produced the result 28 /// regardless of which refactoring action rule was used. 29 /// 30 /// The distinction between actions and rules enables the creation of action 31 /// that uses very different rules, for example: 32 /// - local vs global: a refactoring operation like 33 /// "add missing switch cases" can be applied to one switch when it's 34 /// selected in an editor, or to all switches in a project when an enum 35 /// constant is added to an enum. 36 /// - tool vs editor: some refactoring operation can be initiated in the 37 /// editor when a declaration is selected, or in a tool when the name of 38 /// the declaration is passed using a command-line argument. 39 class RefactoringAction { 40 public: ~RefactoringAction()41 virtual ~RefactoringAction() {} 42 43 /// Returns the name of the subcommand that's used by clang-refactor for this 44 /// action. 45 virtual StringRef getCommand() const = 0; 46 47 virtual StringRef getDescription() const = 0; 48 49 RefactoringActionRules createActiveActionRules(); 50 51 protected: 52 /// Returns a set of refactoring actions rules that are defined by this 53 /// action. 54 virtual RefactoringActionRules createActionRules() const = 0; 55 }; 56 57 /// Returns the list of all the available refactoring actions. 58 std::vector<std::unique_ptr<RefactoringAction>> createRefactoringActions(); 59 60 } // end namespace tooling 61 } // end namespace clang 62 63 #endif // LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGACTION_H 64