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/SkSLDoStatement.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/SkSLProgramSettings.h"
14cb93a386Sopenharmony_ci
15cb93a386Sopenharmony_cinamespace SkSL {
16cb93a386Sopenharmony_ci
17cb93a386Sopenharmony_cistd::unique_ptr<Statement> DoStatement::Convert(const Context& context,
18cb93a386Sopenharmony_ci                                                std::unique_ptr<Statement> stmt,
19cb93a386Sopenharmony_ci                                                std::unique_ptr<Expression> test) {
20cb93a386Sopenharmony_ci    if (context.fConfig->strictES2Mode()) {
21cb93a386Sopenharmony_ci        context.fErrors->error(stmt->fLine, "do-while loops are not supported");
22cb93a386Sopenharmony_ci        return nullptr;
23cb93a386Sopenharmony_ci    }
24cb93a386Sopenharmony_ci    test = context.fTypes.fBool->coerceExpression(std::move(test), context);
25cb93a386Sopenharmony_ci    if (!test) {
26cb93a386Sopenharmony_ci        return nullptr;
27cb93a386Sopenharmony_ci    }
28cb93a386Sopenharmony_ci    if (Analysis::DetectVarDeclarationWithoutScope(*stmt, context.fErrors)) {
29cb93a386Sopenharmony_ci        return nullptr;
30cb93a386Sopenharmony_ci    }
31cb93a386Sopenharmony_ci    return DoStatement::Make(context, std::move(stmt), std::move(test));
32cb93a386Sopenharmony_ci}
33cb93a386Sopenharmony_ci
34cb93a386Sopenharmony_cistd::unique_ptr<Statement> DoStatement::Make(const Context& context,
35cb93a386Sopenharmony_ci                                             std::unique_ptr<Statement> stmt,
36cb93a386Sopenharmony_ci                                             std::unique_ptr<Expression> test) {
37cb93a386Sopenharmony_ci    SkASSERT(!context.fConfig->strictES2Mode());
38cb93a386Sopenharmony_ci    SkASSERT(test->type() == *context.fTypes.fBool);
39cb93a386Sopenharmony_ci    SkASSERT(!Analysis::DetectVarDeclarationWithoutScope(*stmt));
40cb93a386Sopenharmony_ci    return std::make_unique<DoStatement>(stmt->fLine, std::move(stmt), std::move(test));
41cb93a386Sopenharmony_ci}
42cb93a386Sopenharmony_ci
43cb93a386Sopenharmony_cistd::unique_ptr<Statement> DoStatement::clone() const {
44cb93a386Sopenharmony_ci    return std::make_unique<DoStatement>(fLine, this->statement()->clone(),
45cb93a386Sopenharmony_ci                                         this->test()->clone());
46cb93a386Sopenharmony_ci}
47cb93a386Sopenharmony_ci
48cb93a386Sopenharmony_ciString DoStatement::description() const {
49cb93a386Sopenharmony_ci    return "do " + this->statement()->description() +
50cb93a386Sopenharmony_ci           " while (" + this->test()->description() + ");";
51cb93a386Sopenharmony_ci}
52cb93a386Sopenharmony_ci
53cb93a386Sopenharmony_ci}  // namespace SkSL
54cb93a386Sopenharmony_ci
55