Home | History | Annotate | Download | only in Dynamic
      1 //===--- Registry.h - Matcher registry -----*- C++ -*-===//
      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 /// \file
     11 /// \brief Registry of all known matchers.
     12 ///
     13 /// The registry provides a generic interface to construct any matcher by name.
     14 ///
     15 //===----------------------------------------------------------------------===//
     16 
     17 #ifndef LLVM_CLANG_ASTMATCHERS_DYNAMIC_REGISTRY_H
     18 #define LLVM_CLANG_ASTMATCHERS_DYNAMIC_REGISTRY_H
     19 
     20 #include "clang/ASTMatchers/Dynamic/Diagnostics.h"
     21 #include "clang/ASTMatchers/Dynamic/VariantValue.h"
     22 #include "clang/Basic/LLVM.h"
     23 #include "llvm/ADT/ArrayRef.h"
     24 #include "llvm/ADT/Optional.h"
     25 #include "llvm/ADT/StringRef.h"
     26 
     27 namespace clang {
     28 namespace ast_matchers {
     29 namespace dynamic {
     30 
     31 namespace internal {
     32 class MatcherDescriptor;
     33 }
     34 
     35 typedef const internal::MatcherDescriptor *MatcherCtor;
     36 
     37 struct MatcherCompletion {
     38   MatcherCompletion() {}
     39   MatcherCompletion(StringRef TypedText, StringRef MatcherDecl,
     40                     unsigned Specificity)
     41       : TypedText(TypedText), MatcherDecl(MatcherDecl),
     42         Specificity(Specificity) {}
     43 
     44   /// \brief The text to type to select this matcher.
     45   std::string TypedText;
     46 
     47   /// \brief The "declaration" of the matcher, with type information.
     48   std::string MatcherDecl;
     49 
     50   /// \brief Value corresponding to the "specificity" of the converted matcher.
     51   ///
     52   /// Zero specificity indicates that this conversion would produce a trivial
     53   /// matcher that will either always or never match.
     54   /// Such matchers are excluded from code completion results.
     55   unsigned Specificity;
     56 
     57   bool operator==(const MatcherCompletion &Other) const {
     58     return TypedText == Other.TypedText && MatcherDecl == Other.MatcherDecl;
     59   }
     60 };
     61 
     62 class Registry {
     63 public:
     64   /// \brief Look up a matcher in the registry by name,
     65   ///
     66   /// \return An opaque value which may be used to refer to the matcher
     67   /// constructor, or Optional<MatcherCtor>() if not found.
     68   static llvm::Optional<MatcherCtor> lookupMatcherCtor(StringRef MatcherName);
     69 
     70   /// \brief Compute the list of completion types for \p Context.
     71   ///
     72   /// Each element of \p Context represents a matcher invocation, going from
     73   /// outermost to innermost. Elements are pairs consisting of a reference to
     74   /// the matcher constructor and the index of the next element in the
     75   /// argument list of that matcher (or for the last element, the index of
     76   /// the completion point in the argument list). An empty list requests
     77   /// completion for the root matcher.
     78   static std::vector<ArgKind> getAcceptedCompletionTypes(
     79       llvm::ArrayRef<std::pair<MatcherCtor, unsigned>> Context);
     80 
     81   /// \brief Compute the list of completions that match any of
     82   /// \p AcceptedTypes.
     83   ///
     84   /// \param AcceptedTypes All types accepted for this completion.
     85   ///
     86   /// \return All completions for the specified types.
     87   /// Completions should be valid when used in \c lookupMatcherCtor().
     88   /// The matcher constructed from the return of \c lookupMatcherCtor()
     89   /// should be convertible to some type in \p AcceptedTypes.
     90   static std::vector<MatcherCompletion>
     91   getMatcherCompletions(ArrayRef<ArgKind> AcceptedTypes);
     92 
     93   /// \brief Construct a matcher from the registry.
     94   ///
     95   /// \param Ctor The matcher constructor to instantiate.
     96   ///
     97   /// \param NameRange The location of the name in the matcher source.
     98   ///   Useful for error reporting.
     99   ///
    100   /// \param Args The argument list for the matcher. The number and types of the
    101   ///   values must be valid for the matcher requested. Otherwise, the function
    102   ///   will return an error.
    103   ///
    104   /// \return The matcher object constructed if no error was found.
    105   ///   A null matcher if the number of arguments or argument types do not match
    106   ///   the signature.  In that case \c Error will contain the description of
    107   ///   the error.
    108   static VariantMatcher constructMatcher(MatcherCtor Ctor,
    109                                          SourceRange NameRange,
    110                                          ArrayRef<ParserValue> Args,
    111                                          Diagnostics *Error);
    112 
    113   /// \brief Construct a matcher from the registry and bind it.
    114   ///
    115   /// Similar the \c constructMatcher() above, but it then tries to bind the
    116   /// matcher to the specified \c BindID.
    117   /// If the matcher is not bindable, it sets an error in \c Error and returns
    118   /// a null matcher.
    119   static VariantMatcher constructBoundMatcher(MatcherCtor Ctor,
    120                                               SourceRange NameRange,
    121                                               StringRef BindID,
    122                                               ArrayRef<ParserValue> Args,
    123                                               Diagnostics *Error);
    124 
    125 private:
    126   Registry() = delete;
    127 };
    128 
    129 }  // namespace dynamic
    130 }  // namespace ast_matchers
    131 }  // namespace clang
    132 
    133 #endif  // LLVM_CLANG_AST_MATCHERS_DYNAMIC_REGISTRY_H
    134