#include "clang/Tooling/Refactoring/Extract/Extract.h"
#include "clang/Tooling/Refactoring/RefactoringAction.h"
#include "clang/Tooling/Refactoring/RefactoringOptions.h"
#include "clang/Tooling/Refactoring/Rename/RenamingAction.h"
namespace clang {
namespace tooling {
namespace {
class DeclNameOption final : public OptionalRefactoringOption<std::string> {
public:
StringRef getName() const override { return "name"; }
StringRef getDescription() const override {
return "Name of the extracted declaration";
}
};
class ExtractRefactoring final : public RefactoringAction {
public:
StringRef getCommand() const override { return "extract"; }
StringRef getDescription() const override {
return "(WIP action; use with caution!) Extracts code into a new function";
}
RefactoringActionRules createActionRules() const override {
RefactoringActionRules Rules;
Rules.push_back(createRefactoringActionRule<ExtractFunction>(
CodeRangeASTSelectionRequirement(),
OptionRequirement<DeclNameOption>()));
return Rules;
}
};
class OldQualifiedNameOption : public RequiredRefactoringOption<std::string> {
public:
StringRef getName() const override { return "old-qualified-name"; }
StringRef getDescription() const override {
return "The old qualified name to be renamed";
}
};
class NewQualifiedNameOption : public RequiredRefactoringOption<std::string> {
public:
StringRef getName() const override { return "new-qualified-name"; }
StringRef getDescription() const override {
return "The new qualified name to change the symbol to";
}
};
class NewNameOption : public RequiredRefactoringOption<std::string> {
public:
StringRef getName() const override { return "new-name"; }
StringRef getDescription() const override {
return "The new name to change the symbol to";
}
};
class LocalRename final : public RefactoringAction {
public:
StringRef getCommand() const override { return "local-rename"; }
StringRef getDescription() const override {
return "Finds and renames symbols in code with no indexer support";
}
RefactoringActionRules createActionRules() const override {
RefactoringActionRules Rules;
Rules.push_back(createRefactoringActionRule<RenameOccurrences>(
SourceRangeSelectionRequirement(), OptionRequirement<NewNameOption>()));
Rules.push_back(createRefactoringActionRule<QualifiedRenameRule>(
OptionRequirement<OldQualifiedNameOption>(),
OptionRequirement<NewQualifiedNameOption>()));
return Rules;
}
};
}
std::vector<std::unique_ptr<RefactoringAction>> createRefactoringActions() {
std::vector<std::unique_ptr<RefactoringAction>> Actions;
Actions.push_back(std::make_unique<LocalRename>());
Actions.push_back(std::make_unique<ExtractRefactoring>());
return Actions;
}
RefactoringActionRules RefactoringAction::createActiveActionRules() {
return createActionRules();
}
}
}