1 //===--- RefactoringOptions.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_OPTIONS_H 10 #define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_OPTIONS_H 11 12 #include "clang/Basic/LLVM.h" 13 #include "clang/Tooling/Refactoring/RefactoringActionRuleRequirements.h" 14 #include "clang/Tooling/Refactoring/RefactoringOption.h" 15 #include "clang/Tooling/Refactoring/RefactoringOptionVisitor.h" 16 #include "llvm/Support/Error.h" 17 #include <type_traits> 18 19 namespace clang { 20 namespace tooling { 21 22 /// A refactoring option that stores a value of type \c T. 23 template <typename T, 24 typename = std::enable_if_t<traits::IsValidOptionType<T>::value>> 25 class OptionalRefactoringOption : public RefactoringOption { 26 public: passToVisitor(RefactoringOptionVisitor & Visitor)27 void passToVisitor(RefactoringOptionVisitor &Visitor) final override { 28 Visitor.visit(*this, Value); 29 } 30 isRequired()31 bool isRequired() const override { return false; } 32 33 using ValueType = Optional<T>; 34 getValue()35 const ValueType &getValue() const { return Value; } 36 37 protected: 38 Optional<T> Value; 39 }; 40 41 /// A required refactoring option that stores a value of type \c T. 42 template <typename T, 43 typename = std::enable_if_t<traits::IsValidOptionType<T>::value>> 44 class RequiredRefactoringOption : public OptionalRefactoringOption<T> { 45 public: 46 using ValueType = T; 47 getValue()48 const ValueType &getValue() const { 49 return *OptionalRefactoringOption<T>::Value; 50 } isRequired()51 bool isRequired() const final override { return true; } 52 }; 53 54 } // end namespace tooling 55 } // end namespace clang 56 57 #endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_OPTIONS_H 58