1b54ef6a2SAlex Lorenz //===--- RefactoringActions.cpp - Constructs refactoring actions ----------===// 2b54ef6a2SAlex Lorenz // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b54ef6a2SAlex Lorenz // 7b54ef6a2SAlex Lorenz //===----------------------------------------------------------------------===// 8b54ef6a2SAlex Lorenz 90beca4d1SAlex Lorenz #include "clang/Tooling/Refactoring/Extract/Extract.h" 10b54ef6a2SAlex Lorenz #include "clang/Tooling/Refactoring/RefactoringAction.h" 110beca4d1SAlex Lorenz #include "clang/Tooling/Refactoring/RefactoringOptions.h" 120beca4d1SAlex Lorenz #include "clang/Tooling/Refactoring/Rename/RenamingAction.h" 13b54ef6a2SAlex Lorenz 14b54ef6a2SAlex Lorenz namespace clang { 15b54ef6a2SAlex Lorenz namespace tooling { 16b54ef6a2SAlex Lorenz 170beca4d1SAlex Lorenz namespace { 180beca4d1SAlex Lorenz 190beca4d1SAlex Lorenz class DeclNameOption final : public OptionalRefactoringOption<std::string> { 200beca4d1SAlex Lorenz public: getName() const21*fc24d1eaSLogan Smith StringRef getName() const override { return "name"; } getDescription() const22*fc24d1eaSLogan Smith StringRef getDescription() const override { 230beca4d1SAlex Lorenz return "Name of the extracted declaration"; 240beca4d1SAlex Lorenz } 250beca4d1SAlex Lorenz }; 260beca4d1SAlex Lorenz 270beca4d1SAlex Lorenz // FIXME: Rewrite the Actions to avoid duplication of descriptions/names with 280beca4d1SAlex Lorenz // rules. 290beca4d1SAlex Lorenz class ExtractRefactoring final : public RefactoringAction { 300beca4d1SAlex Lorenz public: getCommand() const310beca4d1SAlex Lorenz StringRef getCommand() const override { return "extract"; } 320beca4d1SAlex Lorenz getDescription() const330beca4d1SAlex Lorenz StringRef getDescription() const override { 340beca4d1SAlex Lorenz return "(WIP action; use with caution!) Extracts code into a new function"; 350beca4d1SAlex Lorenz } 360beca4d1SAlex Lorenz 370beca4d1SAlex Lorenz /// Returns a set of refactoring actions rules that are defined by this 380beca4d1SAlex Lorenz /// action. createActionRules() const390beca4d1SAlex Lorenz RefactoringActionRules createActionRules() const override { 400beca4d1SAlex Lorenz RefactoringActionRules Rules; 410beca4d1SAlex Lorenz Rules.push_back(createRefactoringActionRule<ExtractFunction>( 420beca4d1SAlex Lorenz CodeRangeASTSelectionRequirement(), 430beca4d1SAlex Lorenz OptionRequirement<DeclNameOption>())); 440beca4d1SAlex Lorenz return Rules; 450beca4d1SAlex Lorenz } 460beca4d1SAlex Lorenz }; 470beca4d1SAlex Lorenz 48200458f3SHaojian Wu class OldQualifiedNameOption : public RequiredRefactoringOption<std::string> { 49200458f3SHaojian Wu public: getName() const50200458f3SHaojian Wu StringRef getName() const override { return "old-qualified-name"; } getDescription() const51200458f3SHaojian Wu StringRef getDescription() const override { 52200458f3SHaojian Wu return "The old qualified name to be renamed"; 53200458f3SHaojian Wu } 54200458f3SHaojian Wu }; 55200458f3SHaojian Wu 56200458f3SHaojian Wu class NewQualifiedNameOption : public RequiredRefactoringOption<std::string> { 57200458f3SHaojian Wu public: getName() const58200458f3SHaojian Wu StringRef getName() const override { return "new-qualified-name"; } getDescription() const59200458f3SHaojian Wu StringRef getDescription() const override { 60200458f3SHaojian Wu return "The new qualified name to change the symbol to"; 61200458f3SHaojian Wu } 62200458f3SHaojian Wu }; 63200458f3SHaojian Wu 640beca4d1SAlex Lorenz class NewNameOption : public RequiredRefactoringOption<std::string> { 650beca4d1SAlex Lorenz public: getName() const660beca4d1SAlex Lorenz StringRef getName() const override { return "new-name"; } getDescription() const670beca4d1SAlex Lorenz StringRef getDescription() const override { 680beca4d1SAlex Lorenz return "The new name to change the symbol to"; 690beca4d1SAlex Lorenz } 700beca4d1SAlex Lorenz }; 710beca4d1SAlex Lorenz 720beca4d1SAlex Lorenz // FIXME: Rewrite the Actions to avoid duplication of descriptions/names with 730beca4d1SAlex Lorenz // rules. 740beca4d1SAlex Lorenz class LocalRename final : public RefactoringAction { 750beca4d1SAlex Lorenz public: getCommand() const760beca4d1SAlex Lorenz StringRef getCommand() const override { return "local-rename"; } 770beca4d1SAlex Lorenz getDescription() const780beca4d1SAlex Lorenz StringRef getDescription() const override { 790beca4d1SAlex Lorenz return "Finds and renames symbols in code with no indexer support"; 800beca4d1SAlex Lorenz } 810beca4d1SAlex Lorenz 820beca4d1SAlex Lorenz /// Returns a set of refactoring actions rules that are defined by this 830beca4d1SAlex Lorenz /// action. createActionRules() const840beca4d1SAlex Lorenz RefactoringActionRules createActionRules() const override { 850beca4d1SAlex Lorenz RefactoringActionRules Rules; 860beca4d1SAlex Lorenz Rules.push_back(createRefactoringActionRule<RenameOccurrences>( 870beca4d1SAlex Lorenz SourceRangeSelectionRequirement(), OptionRequirement<NewNameOption>())); 88200458f3SHaojian Wu // FIXME: Use NewNameOption. 89200458f3SHaojian Wu Rules.push_back(createRefactoringActionRule<QualifiedRenameRule>( 90200458f3SHaojian Wu OptionRequirement<OldQualifiedNameOption>(), 91200458f3SHaojian Wu OptionRequirement<NewQualifiedNameOption>())); 920beca4d1SAlex Lorenz return Rules; 930beca4d1SAlex Lorenz } 940beca4d1SAlex Lorenz }; 950beca4d1SAlex Lorenz 960beca4d1SAlex Lorenz } // end anonymous namespace 97b54ef6a2SAlex Lorenz createRefactoringActions()98b54ef6a2SAlex Lorenzstd::vector<std::unique_ptr<RefactoringAction>> createRefactoringActions() { 99b54ef6a2SAlex Lorenz std::vector<std::unique_ptr<RefactoringAction>> Actions; 100b54ef6a2SAlex Lorenz 1012b3d49b6SJonas Devlieghere Actions.push_back(std::make_unique<LocalRename>()); 1022b3d49b6SJonas Devlieghere Actions.push_back(std::make_unique<ExtractRefactoring>()); 103b54ef6a2SAlex Lorenz 104b54ef6a2SAlex Lorenz return Actions; 105b54ef6a2SAlex Lorenz } 106b54ef6a2SAlex Lorenz createActiveActionRules()107b54ef6a2SAlex LorenzRefactoringActionRules RefactoringAction::createActiveActionRules() { 108b54ef6a2SAlex Lorenz // FIXME: Filter out rules that are not supported by a particular client. 109b54ef6a2SAlex Lorenz return createActionRules(); 110b54ef6a2SAlex Lorenz } 111b54ef6a2SAlex Lorenz 112b54ef6a2SAlex Lorenz } // end namespace tooling 113b54ef6a2SAlex Lorenz } // end namespace clang 114