10 #ifndef LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULES_INTERNAL_H 11 #define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULES_INTERNAL_H 18 #include "llvm/Support/Error.h" 19 #include <type_traits> 29 template <
typename FirstT,
typename... RestT>
32 llvm::consumeError(First.takeError());
38 template <
typename FirstT,
typename... RestT>
42 return First.takeError();
47 template <
typename RuleType,
typename... RequirementTypes,
size_t... Is>
50 const std::tuple<RequirementTypes...> &Requirements,
51 llvm::index_sequence<Is...>) {
54 std::make_tuple(std::get<Is>(Requirements).evaluate(Context)...);
55 auto Err =
findError(std::get<Is>(Values)...);
61 RuleType::initiate(Context, std::move((*std::get<Is>(Values)))...);
64 Rule->invoke(Consumer, Context);
71 template <
typename FirstT,
typename... RestT>
73 const FirstT &First,
const RestT &... Rest) {
74 struct OptionGatherer {
79 Option->passToVisitor(Visitor);
83 (OptionGatherer{Visitor})(First);
87 template <
typename... RequirementTypes,
size_t... Is>
90 const std::tuple<RequirementTypes...> &Requirements,
91 llvm::index_sequence<Is...>) {
97 template <
typename Base,
typename First,
typename... Rest>
98 struct HasBaseOf : std::conditional<HasBaseOf<Base, First>::value ||
99 HasBaseOf<Base, Rest...>::value,
100 std::true_type, std::false_type>
::type {};
102 template <
typename Base,
typename T>
107 template <
typename Base,
typename First,
typename... Rest>
108 struct AreBaseOf : std::conditional<AreBaseOf<Base, First>::value &&
109 AreBaseOf<Base, Rest...>::value,
110 std::true_type, std::false_type>
::type {};
112 template <
typename Base,
typename T>
117 template <
typename RuleType,
typename... RequirementTypes>
118 std::unique_ptr<RefactoringActionRule>
120 static_assert(std::is_base_of<RefactoringActionRuleBase, RuleType>::value,
121 "Expected a refactoring action rule type");
123 RequirementTypes...>::value,
124 "Expected a list of refactoring action rules");
128 Rule(std::tuple<RequirementTypes...> Requirements)
129 : Requirements(Requirements) {}
133 internal::invokeRuleAfterValidatingRequirements<RuleType>(
134 Consumer, Context, Requirements,
135 llvm::index_sequence_for<RequirementTypes...>());
138 bool hasSelectionRequirement()
override {
140 RequirementTypes...>::value;
145 Visitor, Requirements,
146 llvm::index_sequence_for<RequirementTypes...>());
149 std::tuple<RequirementTypes...> Requirements;
152 return llvm::make_unique<Rule>(std::make_tuple(Requirements...));
158 #endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_ACTION_RULES_INTERNAL_H
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified...
The refactoring rule context stores all of the inputs that might be needed by a refactoring action ru...
const FunctionProtoType * T
Dataflow Directional Tag Classes.