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