114 lines · cpp
1//===--- RefactoringActions.cpp - Constructs refactoring actions ----------===//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-exception6//7//===----------------------------------------------------------------------===//8 9#include "clang/Tooling/Refactoring/Extract/Extract.h"10#include "clang/Tooling/Refactoring/RefactoringAction.h"11#include "clang/Tooling/Refactoring/RefactoringOptions.h"12#include "clang/Tooling/Refactoring/Rename/RenamingAction.h"13 14namespace clang {15namespace tooling {16 17namespace {18 19class DeclNameOption final : public OptionalRefactoringOption<std::string> {20public:21 StringRef getName() const override { return "name"; }22 StringRef getDescription() const override {23 return "Name of the extracted declaration";24 }25};26 27// FIXME: Rewrite the Actions to avoid duplication of descriptions/names with28// rules.29class ExtractRefactoring final : public RefactoringAction {30public:31 StringRef getCommand() const override { return "extract"; }32 33 StringRef getDescription() const override {34 return "(WIP action; use with caution!) Extracts code into a new function";35 }36 37 /// Returns a set of refactoring actions rules that are defined by this38 /// action.39 RefactoringActionRules createActionRules() const override {40 RefactoringActionRules Rules;41 Rules.push_back(createRefactoringActionRule<ExtractFunction>(42 CodeRangeASTSelectionRequirement(),43 OptionRequirement<DeclNameOption>()));44 return Rules;45 }46};47 48class OldQualifiedNameOption : public RequiredRefactoringOption<std::string> {49public:50 StringRef getName() const override { return "old-qualified-name"; }51 StringRef getDescription() const override {52 return "The old qualified name to be renamed";53 }54};55 56class NewQualifiedNameOption : public RequiredRefactoringOption<std::string> {57public:58 StringRef getName() const override { return "new-qualified-name"; }59 StringRef getDescription() const override {60 return "The new qualified name to change the symbol to";61 }62};63 64class NewNameOption : public RequiredRefactoringOption<std::string> {65public:66 StringRef getName() const override { return "new-name"; }67 StringRef getDescription() const override {68 return "The new name to change the symbol to";69 }70};71 72// FIXME: Rewrite the Actions to avoid duplication of descriptions/names with73// rules.74class LocalRename final : public RefactoringAction {75public:76 StringRef getCommand() const override { return "local-rename"; }77 78 StringRef getDescription() const override {79 return "Finds and renames symbols in code with no indexer support";80 }81 82 /// Returns a set of refactoring actions rules that are defined by this83 /// action.84 RefactoringActionRules createActionRules() const override {85 RefactoringActionRules Rules;86 Rules.push_back(createRefactoringActionRule<RenameOccurrences>(87 SourceRangeSelectionRequirement(), OptionRequirement<NewNameOption>()));88 // FIXME: Use NewNameOption.89 Rules.push_back(createRefactoringActionRule<QualifiedRenameRule>(90 OptionRequirement<OldQualifiedNameOption>(),91 OptionRequirement<NewQualifiedNameOption>()));92 return Rules;93 }94};95 96} // end anonymous namespace97 98std::vector<std::unique_ptr<RefactoringAction>> createRefactoringActions() {99 std::vector<std::unique_ptr<RefactoringAction>> Actions;100 101 Actions.push_back(std::make_unique<LocalRename>());102 Actions.push_back(std::make_unique<ExtractRefactoring>());103 104 return Actions;105}106 107RefactoringActionRules RefactoringAction::createActiveActionRules() {108 // FIXME: Filter out rules that are not supported by a particular client.109 return createActionRules();110}111 112} // end namespace tooling113} // end namespace clang114