skia2/tests/SkSLDSLErrorLineNumbers.cpp
Ethan Nicholas 4a5e22a8c8 Further unified error handling between SkSL and DSL
This eliminates the SkSL ErrorReporter class and funnels everything
through the DSL ErrorHandler. Since the DSL error handler can be
changed, this required a number of updates to ensure that things work
properly in the face of custom error handlers. There is probably more
work to be done in that area, but this at least passes all existing
tests.

Change-Id: Iaee27b79fc4ed426c484ccab257c09d28619ead5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/438116
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
2021-08-13 22:26:10 +00:00

113 lines
3.2 KiB
C++

/*
* Copyright 2021 Google LLC.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "include/private/SkSLIRNode.h"
#include "include/sksl/DSL.h"
#include "src/gpu/GrDirectContextPriv.h"
#include "src/gpu/GrGpu.h"
#include "src/sksl/SkSLCompiler.h"
#include "src/sksl/SkSLIRGenerator.h"
#include "src/sksl/dsl/priv/DSLWriter.h"
#include "tests/Test.h"
#include <limits>
using namespace SkSL::dsl;
#if defined(__GNUC__) || defined(__clang__)
class ExpectErrorLineNumber : public SkSL::ErrorReporter {
public:
ExpectErrorLineNumber(skiatest::Reporter* reporter, const char* msg, int line)
: fMsg(msg)
, fLine(line)
, fReporter(reporter)
, fOldReporter(&GetErrorReporter()) {
SetErrorReporter(this);
}
~ExpectErrorLineNumber() override {
REPORTER_ASSERT(fReporter, !fMsg);
SetErrorReporter(fOldReporter);
}
void handleError(const char* msg, SkSL::PositionInfo pos) override {
REPORTER_ASSERT(fReporter, !strcmp(msg, fMsg),
"Error mismatch: expected:\n%sbut received:\n%s", fMsg, msg);
REPORTER_ASSERT(fReporter, pos.line() == fLine,
"Line number mismatch: expected %d, but received %d\n", fLine, pos.line());
DSLWriter::Compiler().handleError(msg, pos);
fMsg = nullptr;
}
private:
const char* fMsg;
int fLine;
skiatest::Reporter* fReporter;
ErrorReporter* fOldReporter;
};
DEF_GPUTEST_FOR_MOCK_CONTEXT(DSLErrorLineNumbers, r, ctxInfo) {
Start(ctxInfo.directContext()->priv().getGpu()->shaderCompiler());
{
ExpectErrorLineNumber error(r, "type mismatch: '+' cannot operate on 'float', 'bool'",
__LINE__ + 1);
(Float(1) + true).release();
}
{
Var a(kBool_Type);
DSLWriter::MarkDeclared(a);
ExpectErrorLineNumber error(r, "type mismatch: '=' cannot operate on 'bool', 'float'",
__LINE__ + 1);
(a = 5.0f).release();
}
{
Var a(Array(kInt_Type, 5));
DSLWriter::MarkDeclared(a);
ExpectErrorLineNumber error(r, "expected 'int', but found 'bool'", __LINE__ + 1);
(a[true]).release();
}
{
Var a(Array(kInt_Type, 5));
DSLWriter::MarkDeclared(a);
ExpectErrorLineNumber error(r, "'++' cannot operate on 'int[5]'", __LINE__ + 1);
(++a).release();
}
{
ExpectErrorLineNumber error(r, "expected 'bool', but found 'int'", __LINE__ + 1);
Do(Discard(), 5).release();
}
{
ExpectErrorLineNumber error(r, "expected 'bool', but found 'int'", __LINE__ + 1);
For(DSLStatement(), 5, DSLExpression(), Block()).release();
}
{
ExpectErrorLineNumber error(r, "expected 'bool', but found 'int'", __LINE__ + 1);
If(5, Discard()).release();
}
{
ExpectErrorLineNumber error(r, "expected 'bool', but found 'int'", __LINE__ + 1);
While(5, Discard()).release();
}
{
ExpectErrorLineNumber error(r, "no match for abs(bool)", __LINE__ + 1);
Abs(true).release();
}
End();
}
#endif // defined(__GNUC__) || defined(__clang__)