clang  19.0.0git
Diagnostics.h
Go to the documentation of this file.
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 
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 
31  SourceLocation() = default;
32  unsigned Line = 0;
33  unsigned Column = 0;
34 };
35 
36 struct SourceRange {
39 };
40 
41 /// A VariantValue instance annotated with its parser context.
42 struct ParserValue {
44  StringRef Text;
47 };
48 
49 /// Helper class to manage error messages.
50 class Diagnostics {
51 public:
52  /// Parser context types.
53  enum ContextType {
56  };
57 
58  /// All errors from the system.
59  enum ErrorType {
60  ET_None = 0,
61 
71 
85  };
86 
87  /// Helper stream class.
88  class ArgStream {
89  public:
90  ArgStream(std::vector<std::string> *Out) : Out(Out) {}
91  template <class T> ArgStream &operator<<(const T &Arg) {
92  return operator<<(Twine(Arg));
93  }
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.
110  Context(ConstructMatcherEnum, Diagnostics *Error, StringRef MatcherName,
111  SourceRange MatcherRange);
112  /// About to recurse into parsing one argument for a matcher.
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.
127  public:
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 {
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 {
159  std::vector<std::string> Args;
160  };
161  std::vector<Message> Messages;
162  };
163  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
Forward-declares and imports various common LLVM datatypes that clang wants to use unqualified.
Polymorphic value type.
The base class of the type hierarchy.
Definition: Type.h:1813
ArgStream(std::vector< std::string > *Out)
Definition: Diagnostics.h:90
Helper class to manage error messages.
Definition: Diagnostics.h:50
void printToStream(llvm::raw_ostream &OS) const
Returns a simple string representation of each error.
ArgStream addError(SourceRange Range, ErrorType Error)
Add an error to the diagnostics.
Definition: Diagnostics.cpp:65
ErrorType
All errors from the system.
Definition: Diagnostics.h:59
void printToStreamFull(llvm::raw_ostream &OS) const
Returns the full string representation of each error.
ArrayRef< ErrorContent > errors() const
Definition: Diagnostics.h:163
The JSON file list parser is used to communicate input to InstallAPI.
const FunctionProtoType * T
Information stored for one frame of the context.
Definition: Diagnostics.h:147
MatcherArgEnum
About to recurse into parsing one argument for a matcher.
Definition: Diagnostics.h:113
Context(ConstructMatcherEnum, Diagnostics *Error, StringRef MatcherName, SourceRange MatcherRange)
Definition: Diagnostics.cpp:23
ConstructMatcherEnum
About to call the constructor for a matcher.
Definition: Diagnostics.h:109
Information stored for each error found.
Definition: Diagnostics.h:154
Context for overloaded matcher construction.
Definition: Diagnostics.h:126
void revertErrors()
Revert all errors that happened within this context.
Definition: Diagnostics.cpp:55
A VariantValue instance annotated with its parser context.
Definition: Diagnostics.h:42