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