1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2021 Google LLC 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLPostfixExpression.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/sksl/SkSLErrorReporter.h" 11cb93a386Sopenharmony_ci#include "src/sksl/SkSLAnalysis.h" 12cb93a386Sopenharmony_ci#include "src/sksl/SkSLContext.h" 13cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLVariableReference.h" 14cb93a386Sopenharmony_ci 15cb93a386Sopenharmony_cinamespace SkSL { 16cb93a386Sopenharmony_ci 17cb93a386Sopenharmony_cistd::unique_ptr<Expression> PostfixExpression::Convert(const Context& context, 18cb93a386Sopenharmony_ci std::unique_ptr<Expression> base, 19cb93a386Sopenharmony_ci Operator op) { 20cb93a386Sopenharmony_ci const Type& baseType = base->type(); 21cb93a386Sopenharmony_ci if (!baseType.isNumber()) { 22cb93a386Sopenharmony_ci context.fErrors->error(base->fLine, 23cb93a386Sopenharmony_ci "'" + String(op.operatorName()) + "' cannot operate on '" + 24cb93a386Sopenharmony_ci baseType.displayName() + "'"); 25cb93a386Sopenharmony_ci return nullptr; 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci if (!Analysis::UpdateVariableRefKind(base.get(), VariableRefKind::kReadWrite, 28cb93a386Sopenharmony_ci context.fErrors)) { 29cb93a386Sopenharmony_ci return nullptr; 30cb93a386Sopenharmony_ci } 31cb93a386Sopenharmony_ci return PostfixExpression::Make(context, std::move(base), op); 32cb93a386Sopenharmony_ci} 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_cistd::unique_ptr<Expression> PostfixExpression::Make(const Context&, 35cb93a386Sopenharmony_ci std::unique_ptr<Expression> base, 36cb93a386Sopenharmony_ci Operator op) { 37cb93a386Sopenharmony_ci SkASSERT(base->type().isNumber()); 38cb93a386Sopenharmony_ci SkASSERT(Analysis::IsAssignable(*base)); 39cb93a386Sopenharmony_ci return std::make_unique<PostfixExpression>(std::move(base), op); 40cb93a386Sopenharmony_ci} 41cb93a386Sopenharmony_ci 42cb93a386Sopenharmony_ci} // namespace SkSL 43