/Users/buildslave/jenkins/workspace/coverage/llvm-project/clang/include/clang/ASTMatchers/Dynamic/Diagnostics.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- Diagnostics.h - Helper class for error diagnostics -----*- C++ -*-===// |
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 | | /// \file |
10 | | /// Diagnostics class to manage error messages. |
11 | | /// |
12 | | //===----------------------------------------------------------------------===// |
13 | | |
14 | | #ifndef LLVM_CLANG_ASTMATCHERS_DYNAMIC_DIAGNOSTICS_H |
15 | | #define LLVM_CLANG_ASTMATCHERS_DYNAMIC_DIAGNOSTICS_H |
16 | | |
17 | | #include "clang/ASTMatchers/Dynamic/VariantValue.h" |
18 | | #include "clang/Basic/LLVM.h" |
19 | | #include "llvm/ADT/ArrayRef.h" |
20 | | #include "llvm/ADT/StringRef.h" |
21 | | #include "llvm/ADT/Twine.h" |
22 | | #include "llvm/Support/raw_ostream.h" |
23 | | #include <string> |
24 | | #include <vector> |
25 | | |
26 | | namespace clang { |
27 | | namespace ast_matchers { |
28 | | namespace dynamic { |
29 | | |
30 | | struct SourceLocation { |
31 | 3.08k | SourceLocation() : Line(), Column() {} |
32 | | unsigned Line; |
33 | | unsigned Column; |
34 | | }; |
35 | | |
36 | | struct SourceRange { |
37 | | SourceLocation Start; |
38 | | SourceLocation End; |
39 | | }; |
40 | | |
41 | | /// A VariantValue instance annotated with its parser context. |
42 | | struct ParserValue { |
43 | 182 | ParserValue() {} |
44 | | StringRef Text; |
45 | | SourceRange Range; |
46 | | VariantValue Value; |
47 | | }; |
48 | | |
49 | | /// Helper class to manage error messages. |
50 | | class Diagnostics { |
51 | | public: |
52 | | /// Parser context types. |
53 | | enum ContextType { |
54 | | CT_MatcherArg = 0, |
55 | | CT_MatcherConstruct = 1 |
56 | | }; |
57 | | |
58 | | /// All errors from the system. |
59 | | enum ErrorType { |
60 | | ET_None = 0, |
61 | | |
62 | | ET_RegistryMatcherNotFound = 1, |
63 | | ET_RegistryWrongArgCount = 2, |
64 | | ET_RegistryWrongArgType = 3, |
65 | | ET_RegistryNotBindable = 4, |
66 | | ET_RegistryAmbiguousOverload = 5, |
67 | | ET_RegistryValueNotFound = 6, |
68 | | ET_RegistryUnknownEnumWithReplace = 7, |
69 | | ET_RegistryNonNodeMatcher = 8, |
70 | | ET_RegistryMatcherNoWithSupport = 9, |
71 | | |
72 | | ET_ParserStringError = 100, |
73 | | ET_ParserNoOpenParen = 101, |
74 | | ET_ParserNoCloseParen = 102, |
75 | | ET_ParserNoComma = 103, |
76 | | ET_ParserNoCode = 104, |
77 | | ET_ParserNotAMatcher = 105, |
78 | | ET_ParserInvalidToken = 106, |
79 | | ET_ParserMalformedBindExpr = 107, |
80 | | ET_ParserTrailingCode = 108, |
81 | | ET_ParserNumberError = 109, |
82 | | ET_ParserOverloadedType = 110, |
83 | | ET_ParserMalformedChainedExpr = 111, |
84 | | ET_ParserFailedToBuildMatcher = 112 |
85 | | }; |
86 | | |
87 | | /// Helper stream class. |
88 | | class ArgStream { |
89 | | public: |
90 | 189 | ArgStream(std::vector<std::string> *Out) : Out(Out) {} |
91 | 297 | template <class T> ArgStream &operator<<(const T &Arg) { |
92 | 297 | return operator<<(Twine(Arg)); |
93 | 297 | } clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<llvm::StringRef>(llvm::StringRef const&) Line | Count | Source | 91 | 145 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 145 | return operator<<(Twine(Arg)); | 93 | 145 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<unsigned int>(unsigned int const&) Line | Count | Source | 91 | 76 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 76 | return operator<<(Twine(Arg)); | 93 | 76 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<unsigned long>(unsigned long const&) Line | Count | Source | 91 | 7 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 7 | return operator<<(Twine(Arg)); | 93 | 7 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<char [10]>(char const (&) [10]) Line | Count | Source | 91 | 1 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 1 | return operator<<(Twine(Arg)); | 93 | 1 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > >(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) Line | Count | Source | 91 | 46 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 46 | return operator<<(Twine(Arg)); | 93 | 46 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<char [8]>(char const (&) [8]) Line | Count | Source | 91 | 1 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 1 | return operator<<(Twine(Arg)); | 93 | 1 | } |
clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<int>(int const&) Line | Count | Source | 91 | 21 | template <class T> ArgStream &operator<<(const T &Arg) { | 92 | 21 | return operator<<(Twine(Arg)); | 93 | 21 | } |
Unexecuted instantiation: clang::ast_matchers::dynamic::Diagnostics::ArgStream& clang::ast_matchers::dynamic::Diagnostics::ArgStream::operator<<<char [7]>(char const (&) [7]) |
94 | | ArgStream &operator<<(const Twine &Arg); |
95 | | |
96 | | private: |
97 | | std::vector<std::string> *Out; |
98 | | }; |
99 | | |
100 | | /// Class defining a parser context. |
101 | | /// |
102 | | /// Used by the parser to specify (possibly recursive) contexts where the |
103 | | /// parsing/construction can fail. Any error triggered within a context will |
104 | | /// keep information about the context chain. |
105 | | /// This class should be used as a RAII instance in the stack. |
106 | | struct Context { |
107 | | public: |
108 | | /// About to call the constructor for a matcher. |
109 | | enum ConstructMatcherEnum { ConstructMatcher }; |
110 | | Context(ConstructMatcherEnum, Diagnostics *Error, StringRef MatcherName, |
111 | | SourceRange MatcherRange); |
112 | | /// About to recurse into parsing one argument for a matcher. |
113 | | enum MatcherArgEnum { MatcherArg }; |
114 | | Context(MatcherArgEnum, Diagnostics *Error, StringRef MatcherName, |
115 | | SourceRange MatcherRange, unsigned ArgNumber); |
116 | | ~Context(); |
117 | | |
118 | | private: |
119 | | Diagnostics *const Error; |
120 | | }; |
121 | | |
122 | | /// Context for overloaded matcher construction. |
123 | | /// |
124 | | /// This context will take care of merging all errors that happen within it |
125 | | /// as "candidate" overloads for the same matcher. |
126 | | struct OverloadContext { |
127 | | public: |
128 | | OverloadContext(Diagnostics* Error); |
129 | | ~OverloadContext(); |
130 | | |
131 | | /// Revert all errors that happened within this context. |
132 | | void revertErrors(); |
133 | | |
134 | | private: |
135 | | Diagnostics *const Error; |
136 | | unsigned BeginIndex; |
137 | | }; |
138 | | |
139 | | /// Add an error to the diagnostics. |
140 | | /// |
141 | | /// All the context information will be kept on the error message. |
142 | | /// \return a helper class to allow the caller to pass the arguments for the |
143 | | /// error message, using the << operator. |
144 | | ArgStream addError(SourceRange Range, ErrorType Error); |
145 | | |
146 | | /// Information stored for one frame of the context. |
147 | | struct ContextFrame { |
148 | | ContextType Type; |
149 | | SourceRange Range; |
150 | | std::vector<std::string> Args; |
151 | | }; |
152 | | |
153 | | /// Information stored for each error found. |
154 | | struct ErrorContent { |
155 | | std::vector<ContextFrame> ContextStack; |
156 | | struct Message { |
157 | | SourceRange Range; |
158 | | ErrorType Type; |
159 | | std::vector<std::string> Args; |
160 | | }; |
161 | | std::vector<Message> Messages; |
162 | | }; |
163 | 0 | ArrayRef<ErrorContent> errors() const { return Errors; } |
164 | | |
165 | | /// Returns a simple string representation of each error. |
166 | | /// |
167 | | /// Each error only shows the error message without any context. |
168 | | void printToStream(llvm::raw_ostream &OS) const; |
169 | | std::string toString() const; |
170 | | |
171 | | /// Returns the full string representation of each error. |
172 | | /// |
173 | | /// Each error message contains the full context. |
174 | | void printToStreamFull(llvm::raw_ostream &OS) const; |
175 | | std::string toStringFull() const; |
176 | | |
177 | | private: |
178 | | /// Helper function used by the constructors of ContextFrame. |
179 | | ArgStream pushContextFrame(ContextType Type, SourceRange Range); |
180 | | |
181 | | std::vector<ContextFrame> ContextStack; |
182 | | std::vector<ErrorContent> Errors; |
183 | | }; |
184 | | |
185 | | } // namespace dynamic |
186 | | } // namespace ast_matchers |
187 | | } // namespace clang |
188 | | |
189 | | #endif // LLVM_CLANG_ASTMATCHERS_DYNAMIC_DIAGNOSTICS_H |