clang  6.0.0svn
Registry.h
Go to the documentation of this file.
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 
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 } // namespace internal
38 
40 
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,
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,
129  Diagnostics *Error);
130 };
131 
132 } // namespace dynamic
133 } // namespace ast_matchers
134 } // namespace clang
135 
136 #endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_REGISTRY_H
std::string MatcherDecl
The "declaration" of the matcher, with type information.
Definition: Registry.h:56
Diagnostics class to manage error messages.
bool operator==(const MatcherCompletion &Other) const
Definition: Registry.h:48
Helper class to manage error messages.
Definition: Diagnostics.h:51
unsigned Specificity
Value corresponding to the "specificity" of the converted matcher.
Definition: Registry.h:63
std::string TypedText
The text to type to select this matcher.
Definition: Registry.h:53
Dataflow Directional Tag Classes.
MatcherCompletion(StringRef TypedText, StringRef MatcherDecl, unsigned Specificity)
Definition: Registry.h:43
Polymorphic value type.