xref: /llvm-project/mlir/lib/Query/Matcher/Diagnostics.h (revision 02d9f4d1f128e17e04ab6e602d3c9b9942612428)
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 // Diagnostics class to manage error messages. Implementation shares similarity
10 // to clang-query Diagnostics.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef MLIR_TOOLS_MLIRQUERY_MATCHER_DIAGNOSTICS_H
15 #define MLIR_TOOLS_MLIRQUERY_MATCHER_DIAGNOSTICS_H
16 
17 #include "mlir/Query/Matcher/ErrorBuilder.h"
18 #include "llvm/ADT/ArrayRef.h"
19 #include "llvm/ADT/StringRef.h"
20 #include "llvm/ADT/Twine.h"
21 #include "llvm/Support/raw_ostream.h"
22 #include <string>
23 #include <vector>
24 
25 namespace mlir::query::matcher::internal {
26 
27 // Diagnostics class to manage error messages.
28 class Diagnostics {
29 public:
30   // Helper stream class for constructing error messages.
31   class ArgStream {
32   public:
ArgStream(std::vector<std::string> * out)33     ArgStream(std::vector<std::string> *out) : out(out) {}
34     template <class T>
35     ArgStream &operator<<(const T &arg) {
36       return operator<<(llvm::Twine(arg));
37     }
38     ArgStream &operator<<(const llvm::Twine &arg);
39 
40   private:
41     std::vector<std::string> *out;
42   };
43 
44   // Add an error message with the specified range and error type.
45   // Returns an ArgStream object to allow constructing the error message using
46   // the << operator.
47   ArgStream addError(SourceRange range, ErrorType error);
48 
49   // Print all error messages to the specified output stream.
50   void print(llvm::raw_ostream &os) const;
51 
52 private:
53   // Information stored for one frame of the context.
54   struct ContextFrame {
55     SourceRange range;
56     std::vector<std::string> args;
57   };
58 
59   // Information stored for each error found.
60   struct ErrorContent {
61     std::vector<ContextFrame> contextStack;
62     struct Message {
63       SourceRange range;
64       ErrorType type;
65       std::vector<std::string> args;
66     };
67     std::vector<Message> messages;
68   };
69 
70   void printMessage(const ErrorContent::Message &message,
71                     const llvm::Twine Prefix, llvm::raw_ostream &os) const;
72 
73   void printErrorContent(const ErrorContent &content,
74                          llvm::raw_ostream &os) const;
75 
76   std::vector<ContextFrame> contextStack;
77   std::vector<ErrorContent> errorValues;
78 };
79 
80 } // namespace mlir::query::matcher::internal
81 
82 #endif // MLIR_TOOLS_MLIRQUERY_MATCHER_DIAGNOSTICS_H
83