xref: /llvm-project/clang/lib/Tooling/Refactoring/RefactoringActions.cpp (revision fc24d1eaddd8c0618e3ef3ab395029a0238d4568)
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 Lorenz std::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 Lorenz RefactoringActionRules 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