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