Home | History | Annotate | Download | only in Refactoring
      1 //===--- RefactoringOptions.h - Clang refactoring library -----------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_OPTIONS_H
     11 #define LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_OPTIONS_H
     12 
     13 #include "clang/Basic/LLVM.h"
     14 #include "clang/Tooling/Refactoring/RefactoringActionRuleRequirements.h"
     15 #include "clang/Tooling/Refactoring/RefactoringOption.h"
     16 #include "clang/Tooling/Refactoring/RefactoringOptionVisitor.h"
     17 #include "llvm/Support/Error.h"
     18 #include <type_traits>
     19 
     20 namespace clang {
     21 namespace tooling {
     22 
     23 /// A refactoring option that stores a value of type \c T.
     24 template <typename T, typename = typename std::enable_if<
     25                           traits::IsValidOptionType<T>::value>::type>
     26 class OptionalRefactoringOption : public RefactoringOption {
     27 public:
     28   void passToVisitor(RefactoringOptionVisitor &Visitor) final override {
     29     Visitor.visit(*this, Value);
     30   }
     31 
     32   bool isRequired() const override { return false; }
     33 
     34   using ValueType = Optional<T>;
     35 
     36   const ValueType &getValue() const { return Value; }
     37 
     38 protected:
     39   Optional<T> Value;
     40 };
     41 
     42 /// A required refactoring option that stores a value of type \c T.
     43 template <typename T, typename = typename std::enable_if<
     44                           traits::IsValidOptionType<T>::value>::type>
     45 class RequiredRefactoringOption : public OptionalRefactoringOption<T> {
     46 public:
     47   using ValueType = T;
     48 
     49   const ValueType &getValue() const {
     50     return *OptionalRefactoringOption<T>::Value;
     51   }
     52   bool isRequired() const final override { return true; }
     53 };
     54 
     55 } // end namespace tooling
     56 } // end namespace clang
     57 
     58 #endif // LLVM_CLANG_TOOLING_REFACTOR_REFACTORING_OPTIONS_H
     59