1 | //===- ErrorCollector.h -----------------------------------------*- 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 | /// This class collects errors that should be reported or ignored in aggregate. |
10 | /// |
11 | /// Like llvm::Error, an ErrorCollector cannot be copied. Unlike llvm::Error, |
12 | /// an ErrorCollector may be destroyed if it was originally constructed to treat |
13 | /// errors as non-fatal. In this case, all Errors are consumed upon destruction. |
14 | /// An ErrorCollector may be initially constructed (or escalated) such that |
15 | /// errors are treated as fatal. This causes a crash if an attempt is made to |
16 | /// delete the ErrorCollector when some Errors have not been retrieved via |
17 | /// makeError(). |
18 | /// |
19 | //===-----------------------------------------------------------------------===/ |
20 | |
21 | #ifndef LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H |
22 | #define LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H |
23 | |
24 | #include "llvm/Support/Error.h" |
25 | #include "llvm/Support/raw_ostream.h" |
26 | #include <vector> |
27 | |
28 | namespace llvm { |
29 | |
30 | namespace ifs { |
31 | |
32 | class ErrorCollector { |
33 | public: |
34 | /// Upon destruction, an ErrorCollector will crash if UseFatalErrors=true and |
35 | /// there are remaining errors that haven't been fetched by makeError(). |
36 | ErrorCollector(bool UseFatalErrors = true) : ErrorsAreFatal(UseFatalErrors) {} |
37 | // Don't allow copying. |
38 | ErrorCollector(const ErrorCollector &Stub) = delete; |
39 | ErrorCollector &operator=(const ErrorCollector &Other) = delete; |
40 | ~ErrorCollector(); |
41 | |
42 | // TODO: Add move constructor and operator= when a testable situation arises. |
43 | |
44 | /// Returns a single error that contains messages for all stored Errors. |
45 | Error makeError(); |
46 | |
47 | /// Adds an error with a descriptive tag that helps with identification. |
48 | /// If the error is an Error::success(), it is checked and discarded. |
49 | void addError(Error &&E, StringRef Tag); |
50 | |
51 | /// This ensures an ErrorCollector will treat unhandled errors as fatal. |
52 | /// This function should be called if errors that usually can be ignored |
53 | /// are suddenly of concern (i.e. attempt multiple things that return Error, |
54 | /// but only care about the Errors if no attempt succeeds). |
55 | void escalateToFatal(); |
56 | |
57 | private: |
58 | /// Logs all errors to a raw_ostream. |
59 | void log(raw_ostream &OS); |
60 | |
61 | /// Returns true if all errors have been retrieved through makeError(), or |
62 | /// false if errors have been added since the last makeError() call. |
63 | bool allErrorsHandled() const; |
64 | |
65 | /// Dump output and crash. |
66 | [[noreturn]] void fatalUnhandledError(); |
67 | |
68 | bool ErrorsAreFatal; |
69 | std::vector<Error> Errors; |
70 | std::vector<std::string> Tags; |
71 | }; |
72 | |
73 | } // end namespace ifs |
74 | } // end namespace llvm |
75 | |
76 | #endif // LLVM_TOOLS_LLVM_IFS_ERRORCOLLECTOR_H |
77 | |