diff options
Diffstat (limited to 'gfx/skia/skia/src/sksl/ir/SkSLPostfixExpression.cpp')
-rw-r--r-- | gfx/skia/skia/src/sksl/ir/SkSLPostfixExpression.cpp | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/gfx/skia/skia/src/sksl/ir/SkSLPostfixExpression.cpp b/gfx/skia/skia/src/sksl/ir/SkSLPostfixExpression.cpp new file mode 100644 index 0000000000..83d5856faf --- /dev/null +++ b/gfx/skia/skia/src/sksl/ir/SkSLPostfixExpression.cpp @@ -0,0 +1,50 @@ +/* + * 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 "src/sksl/ir/SkSLPostfixExpression.h" + +#include "include/core/SkTypes.h" +#include "include/sksl/SkSLErrorReporter.h" +#include "include/sksl/SkSLOperator.h" +#include "src/sksl/SkSLAnalysis.h" +#include "src/sksl/SkSLContext.h" +#include "src/sksl/ir/SkSLType.h" +#include "src/sksl/ir/SkSLVariableReference.h" + +namespace SkSL { + +std::unique_ptr<Expression> PostfixExpression::Convert(const Context& context, Position pos, + std::unique_ptr<Expression> base, Operator op) { + const Type& baseType = base->type(); + if (!baseType.isNumber()) { + context.fErrors->error(pos, "'" + std::string(op.tightOperatorName()) + + "' cannot operate on '" + baseType.displayName() + "'"); + return nullptr; + } + if (!Analysis::UpdateVariableRefKind(base.get(), VariableRefKind::kReadWrite, + context.fErrors)) { + return nullptr; + } + return PostfixExpression::Make(context, pos, std::move(base), op); +} + +std::unique_ptr<Expression> PostfixExpression::Make(const Context& context, Position pos, + std::unique_ptr<Expression> base, Operator op) { + SkASSERT(base->type().isNumber()); + SkASSERT(Analysis::IsAssignable(*base)); + return std::make_unique<PostfixExpression>(pos, std::move(base), op); +} + +std::string PostfixExpression::description(OperatorPrecedence parentPrecedence) const { + bool needsParens = (OperatorPrecedence::kPostfix >= parentPrecedence); + return std::string(needsParens ? "(" : "") + + this->operand()->description(OperatorPrecedence::kPostfix) + + std::string(this->getOperator().tightOperatorName()) + + std::string(needsParens ? ")" : ""); +} + +} // namespace SkSL |