aboutsummaryrefslogtreecommitdiff
path: root/src/deps/skia/include/sksl/SkSLErrorReporter.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/deps/skia/include/sksl/SkSLErrorReporter.h')
-rw-r--r--src/deps/skia/include/sksl/SkSLErrorReporter.h115
1 files changed, 115 insertions, 0 deletions
diff --git a/src/deps/skia/include/sksl/SkSLErrorReporter.h b/src/deps/skia/include/sksl/SkSLErrorReporter.h
new file mode 100644
index 000000000..48cc0958e
--- /dev/null
+++ b/src/deps/skia/include/sksl/SkSLErrorReporter.h
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2021 Google LLC.
+ *
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file.
+ */
+
+#ifndef SKSL_ERROR_REPORTER
+#define SKSL_ERROR_REPORTER
+
+#include "include/core/SkStringView.h"
+#include "include/core/SkTypes.h"
+#include "include/private/SkSLString.h"
+
+#include <string>
+#include <vector>
+
+namespace SkSL {
+
+#ifndef __has_builtin
+ #define __has_builtin(x) 0
+#endif
+
+class PositionInfo {
+public:
+ PositionInfo(const char* file = nullptr, int line = -1)
+ : fFile(file)
+ , fLine(line) {}
+
+#if __has_builtin(__builtin_FILE) && __has_builtin(__builtin_LINE)
+ static PositionInfo Capture(const char* file = __builtin_FILE(), int line = __builtin_LINE()) {
+ return PositionInfo(file, line);
+ }
+#else
+ static PositionInfo Capture() { return PositionInfo(); }
+#endif // __has_builtin(__builtin_FILE) && __has_builtin(__builtin_LINE)
+
+ const char* file_name() const {
+ return fFile;
+ }
+
+ int line() const {
+ return fLine;
+ }
+
+private:
+ const char* fFile = nullptr;
+ int32_t fLine = -1;
+};
+
+/**
+ * Class which is notified in the event of an error.
+ */
+class ErrorReporter {
+public:
+ ErrorReporter() {}
+
+ virtual ~ErrorReporter() {
+ SkASSERT(fPendingErrors.empty());
+ }
+
+ void error(skstd::string_view msg, PositionInfo position);
+
+ /**
+ * Reports an error message at the given line of the source text. Errors reported
+ * with a line of -1 will be queued until line number information can be determined.
+ */
+ void error(int line, skstd::string_view msg);
+
+ const char* source() const { return fSource; }
+
+ void setSource(const char* source) { fSource = source; }
+
+ void reportPendingErrors(PositionInfo pos) {
+ for (const String& msg : fPendingErrors) {
+ this->handleError(msg, pos);
+ }
+ fPendingErrors.clear();
+ }
+
+ int errorCount() const {
+ return fErrorCount;
+ }
+
+ void resetErrorCount() {
+ fErrorCount = 0;
+ }
+
+protected:
+ /**
+ * Called when an error is reported.
+ */
+ virtual void handleError(skstd::string_view msg, PositionInfo position) = 0;
+
+private:
+ PositionInfo position(int offset) const;
+
+ const char* fSource = nullptr;
+ std::vector<String> fPendingErrors;
+ int fErrorCount = 0;
+};
+
+/**
+ * Error reporter for tests that need an SkSL context; aborts immediately if an error is reported.
+ */
+class TestingOnly_AbortErrorReporter : public ErrorReporter {
+public:
+ void handleError(skstd::string_view msg, PositionInfo pos) override {
+ SK_ABORT("%.*s", (int)msg.length(), msg.data());
+ }
+};
+
+} // namespace SkSL
+
+#endif