| 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 | |