Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. //===--- RefactoringOptionVisitor.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_REFACTORING_REFACTORINGOPTIONVISITOR_H
  10. #define LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGOPTIONVISITOR_H
  11.  
  12. #include "clang/Basic/LLVM.h"
  13. #include <optional>
  14. #include <type_traits>
  15.  
  16. namespace clang {
  17. namespace tooling {
  18.  
  19. class RefactoringOption;
  20.  
  21. /// An interface that declares functions that handle different refactoring
  22. /// option types.
  23. ///
  24. /// A valid refactoring option type must have a corresponding \c visit
  25. /// declaration in this interface.
  26. class RefactoringOptionVisitor {
  27. public:
  28.   virtual ~RefactoringOptionVisitor() {}
  29.  
  30.   virtual void visit(const RefactoringOption &Opt,
  31.                      std::optional<std::string> &Value) = 0;
  32. };
  33.  
  34. namespace traits {
  35. namespace internal {
  36.  
  37. template <typename T> struct HasHandle {
  38. private:
  39.   template <typename ClassT>
  40.   static auto check(ClassT *) -> typename std::is_same<
  41.       decltype(std::declval<RefactoringOptionVisitor>().visit(
  42.           std::declval<RefactoringOption>(),
  43.           *std::declval<std::optional<T> *>())),
  44.       void>::type;
  45.  
  46.   template <typename> static std::false_type check(...);
  47.  
  48. public:
  49.   using Type = decltype(check<RefactoringOptionVisitor>(nullptr));
  50. };
  51.  
  52. } // end namespace internal
  53.  
  54. /// A type trait that returns true iff the given type is a type that can be
  55. /// stored in a refactoring option.
  56. template <typename T>
  57. struct IsValidOptionType : internal::HasHandle<T>::Type {};
  58.  
  59. } // end namespace traits
  60. } // end namespace tooling
  61. } // end namespace clang
  62.  
  63. #endif // LLVM_CLANG_TOOLING_REFACTORING_REFACTORINGOPTIONVISITOR_H
  64.