1 //===--- Diagnostics.h - Helper class for error diagnostics -----*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 /// \brief Diagnostics class to manage error messages.
13 //===----------------------------------------------------------------------===//
15 #ifndef LLVM_CLANG_AST_MATCHERS_DYNAMIC_DIAGNOSTICS_H
16 #define LLVM_CLANG_AST_MATCHERS_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/StringRef.h"
25 #include "llvm/ADT/Twine.h"
26 #include "llvm/Support/raw_ostream.h"
29 namespace ast_matchers {
32 struct SourceLocation {
33 SourceLocation() : Line(), Column() {}
43 /// \brief A VariantValue instance annotated with its parser context.
45 ParserValue() : Text(), Range(), Value() {}
51 /// \brief Helper class to manage error messages.
54 /// \brief Parser context types.
57 CT_MatcherConstruct = 1
60 /// \brief All errors from the system.
64 ET_RegistryNotFound = 1,
65 ET_RegistryWrongArgCount = 2,
66 ET_RegistryWrongArgType = 3,
67 ET_RegistryNotBindable = 4,
68 ET_RegistryAmbiguousOverload = 5,
70 ET_ParserStringError = 100,
71 ET_ParserNoOpenParen = 101,
72 ET_ParserNoCloseParen = 102,
73 ET_ParserNoComma = 103,
74 ET_ParserNoCode = 104,
75 ET_ParserNotAMatcher = 105,
76 ET_ParserInvalidToken = 106,
77 ET_ParserMalformedBindExpr = 107,
78 ET_ParserTrailingCode = 108,
79 ET_ParserUnsignedError = 109,
80 ET_ParserOverloadedType = 110
83 /// \brief Helper stream class.
86 ArgStream(std::vector<std::string> *Out) : Out(Out) {}
87 template <class T> ArgStream &operator<<(const T &Arg) {
88 return operator<<(Twine(Arg));
90 ArgStream &operator<<(const Twine &Arg);
93 std::vector<std::string> *Out;
96 /// \brief Class defining a parser context.
98 /// Used by the parser to specify (possibly recursive) contexts where the
99 /// parsing/construction can fail. Any error triggered within a context will
100 /// keep information about the context chain.
101 /// This class should be used as a RAII instance in the stack.
104 /// \brief About to call the constructor for a matcher.
105 enum ConstructMatcherEnum { ConstructMatcher };
106 Context(ConstructMatcherEnum, Diagnostics *Error, StringRef MatcherName,
107 const SourceRange &MatcherRange);
108 /// \brief About to recurse into parsing one argument for a matcher.
109 enum MatcherArgEnum { MatcherArg };
110 Context(MatcherArgEnum, Diagnostics *Error, StringRef MatcherName,
111 const SourceRange &MatcherRange, unsigned ArgNumber);
115 Diagnostics *const Error;
118 /// \brief Context for overloaded matcher construction.
120 /// This context will take care of merging all errors that happen within it
121 /// as "candidate" overloads for the same matcher.
122 struct OverloadContext {
124 OverloadContext(Diagnostics* Error);
127 /// \brief Revert all errors that happened within this context.
131 Diagnostics *const Error;
135 /// \brief Add an error to the diagnostics.
137 /// All the context information will be kept on the error message.
138 /// \return a helper class to allow the caller to pass the arguments for the
139 /// error message, using the << operator.
140 ArgStream addError(const SourceRange &Range, ErrorType Error);
142 /// \brief Information stored for one frame of the context.
143 struct ContextFrame {
146 std::vector<std::string> Args;
149 /// \brief Information stored for each error found.
150 struct ErrorContent {
151 std::vector<ContextFrame> ContextStack;
155 std::vector<std::string> Args;
157 std::vector<Message> Messages;
159 ArrayRef<ErrorContent> errors() const { return Errors; }
161 /// \brief Returns a simple string representation of each error.
163 /// Each error only shows the error message without any context.
164 void printToStream(llvm::raw_ostream &OS) const;
165 std::string toString() const;
167 /// \brief Returns the full string representation of each error.
169 /// Each error message contains the full context.
170 void printToStreamFull(llvm::raw_ostream &OS) const;
171 std::string toStringFull() const;
174 /// \brief Helper function used by the constructors of ContextFrame.
175 ArgStream pushContextFrame(ContextType Type, SourceRange Range);
177 std::vector<ContextFrame> ContextStack;
178 std::vector<ErrorContent> Errors;
181 } // namespace dynamic
182 } // namespace ast_matchers
185 #endif // LLVM_CLANG_AST_MATCHERS_DYNAMIC_DIAGNOSTICS_H