1//===--- RefactoringActionRule.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_REFACTOR_REFACTORING_ACTION_RULE_H 10#define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULE_H 11 12#include "clang/Basic/LLVM.h" 13#include "llvm/ADT/Optional.h" 14#include "llvm/ADT/StringRef.h" 15 16namespace clang { 17namespace tooling { 18 19class RefactoringOptionVisitor; 20class RefactoringResultConsumer; 21class RefactoringRuleContext; 22 23struct RefactoringDescriptor { 24 /// A unique identifier for the specific refactoring. 25 StringRef Name; 26 /// A human readable title for the refactoring. 27 StringRef Title; 28 /// A human readable description of what the refactoring does. 29 StringRef Description; 30}; 31 32/// A common refactoring action rule interface that defines the 'invoke' 33/// function that performs the refactoring operation (either fully or 34/// partially). 35class RefactoringActionRuleBase { 36public: 37 virtual ~RefactoringActionRuleBase() {} 38 39 /// Initiates and performs a specific refactoring action. 40 /// 41 /// The specific rule will invoke an appropriate \c handle method on a 42 /// consumer to propagate the result of the refactoring action. 43 virtual void invoke(RefactoringResultConsumer &Consumer, 44 RefactoringRuleContext &Context) = 0; 45 46 /// Returns the structure that describes the refactoring. 47 // static const RefactoringDescriptor &describe() = 0; 48}; 49 50/// A refactoring action rule is a wrapper class around a specific refactoring 51/// action rule (SourceChangeRefactoringRule, etc) that, in addition to invoking 52/// the action, describes the requirements that determine when the action can be 53/// initiated. 54class RefactoringActionRule : public RefactoringActionRuleBase { 55public: 56 /// Returns true when the rule has a source selection requirement that has 57 /// to be fulfilled before refactoring can be performed. 58 virtual bool hasSelectionRequirement() = 0; 59 60 /// Traverses each refactoring option used by the rule and invokes the 61 /// \c visit callback in the consumer for each option. 62 /// 63 /// Options are visited in the order of use, e.g. if a rule has two 64 /// requirements that use options, the options from the first requirement 65 /// are visited before the options in the second requirement. 66 virtual void visitRefactoringOptions(RefactoringOptionVisitor &Visitor) = 0; 67}; 68 69} // end namespace tooling 70} // end namespace clang 71 72#endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULE_H 73