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
25namespace mlir::query::matcher::internal {
26
27// Diagnostics class to manage error messages.
28class Diagnostics {
29public:
30 // Helper stream class for constructing error messages.
31 class ArgStream {
32 public:
33 ArgStream(std::vector<std::string> *out) : out(out) {}
34 template <class T>
35 ArgStream &operator<<(const T &arg) {
36 return operator<<(arg: 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
52private:
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

source code of mlir/lib/Query/Matcher/Diagnostics.h