1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2020 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 "include/sksl/DSLExpression.h" 9cb93a386Sopenharmony_ci 10cb93a386Sopenharmony_ci#include "include/sksl/DSLCore.h" 11cb93a386Sopenharmony_ci#include "include/sksl/DSLVar.h" 12cb93a386Sopenharmony_ci#include "src/sksl/SkSLCompiler.h" 13cb93a386Sopenharmony_ci#include "src/sksl/SkSLThreadContext.h" 14cb93a386Sopenharmony_ci#include "src/sksl/dsl/priv/DSLWriter.h" 15cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLBinaryExpression.h" 16cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLFieldAccess.h" 17cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLFunctionCall.h" 18cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLIndexExpression.h" 19cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLLiteral.h" 20cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLPoison.h" 21cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLPostfixExpression.h" 22cb93a386Sopenharmony_ci#include "src/sksl/ir/SkSLPrefixExpression.h" 23cb93a386Sopenharmony_ci 24cb93a386Sopenharmony_ci#include "math.h" 25cb93a386Sopenharmony_ci 26cb93a386Sopenharmony_ci#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 27cb93a386Sopenharmony_ci#include "src/gpu/glsl/GrGLSLFragmentShaderBuilder.h" 28cb93a386Sopenharmony_ci#endif 29cb93a386Sopenharmony_ci 30cb93a386Sopenharmony_cinamespace SkSL { 31cb93a386Sopenharmony_ci 32cb93a386Sopenharmony_cinamespace dsl { 33cb93a386Sopenharmony_ci 34cb93a386Sopenharmony_ciDSLExpression::DSLExpression() {} 35cb93a386Sopenharmony_ci 36cb93a386Sopenharmony_ciDSLExpression::DSLExpression(DSLExpression&& other) 37cb93a386Sopenharmony_ci : fExpression(std::move(other.fExpression)) {} 38cb93a386Sopenharmony_ci 39cb93a386Sopenharmony_ciDSLExpression::DSLExpression(std::unique_ptr<SkSL::Expression> expression) 40cb93a386Sopenharmony_ci : fExpression(std::move(expression)) { 41cb93a386Sopenharmony_ci SkASSERT(this->hasValue()); 42cb93a386Sopenharmony_ci} 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ciDSLExpression::DSLExpression(float value, PositionInfo pos) 45cb93a386Sopenharmony_ci : fExpression(SkSL::Literal::MakeFloat(ThreadContext::Context(), 46cb93a386Sopenharmony_ci pos.line(), 47cb93a386Sopenharmony_ci value)) { 48cb93a386Sopenharmony_ci if (!isfinite(value)) { 49cb93a386Sopenharmony_ci if (isinf(value)) { 50cb93a386Sopenharmony_ci ThreadContext::ReportError("floating point value is infinite"); 51cb93a386Sopenharmony_ci } else if (isnan(value)) { 52cb93a386Sopenharmony_ci ThreadContext::ReportError("floating point value is NaN"); 53cb93a386Sopenharmony_ci } 54cb93a386Sopenharmony_ci } 55cb93a386Sopenharmony_ci} 56cb93a386Sopenharmony_ci 57cb93a386Sopenharmony_ciDSLExpression::DSLExpression(int value, PositionInfo pos) 58cb93a386Sopenharmony_ci : fExpression(SkSL::Literal::MakeInt(ThreadContext::Context(), 59cb93a386Sopenharmony_ci pos.line(), 60cb93a386Sopenharmony_ci value)) {} 61cb93a386Sopenharmony_ci 62cb93a386Sopenharmony_ciDSLExpression::DSLExpression(int64_t value, PositionInfo pos) 63cb93a386Sopenharmony_ci : fExpression(SkSL::Literal::MakeInt(ThreadContext::Context(), 64cb93a386Sopenharmony_ci pos.line(), 65cb93a386Sopenharmony_ci value)) {} 66cb93a386Sopenharmony_ci 67cb93a386Sopenharmony_ciDSLExpression::DSLExpression(unsigned int value, PositionInfo pos) 68cb93a386Sopenharmony_ci : fExpression(SkSL::Literal::MakeInt(ThreadContext::Context(), 69cb93a386Sopenharmony_ci pos.line(), 70cb93a386Sopenharmony_ci value)) {} 71cb93a386Sopenharmony_ci 72cb93a386Sopenharmony_ciDSLExpression::DSLExpression(bool value, PositionInfo pos) 73cb93a386Sopenharmony_ci : fExpression(SkSL::Literal::MakeBool(ThreadContext::Context(), 74cb93a386Sopenharmony_ci pos.line(), 75cb93a386Sopenharmony_ci value)) {} 76cb93a386Sopenharmony_ci 77cb93a386Sopenharmony_ciDSLExpression::DSLExpression(DSLVarBase& var, PositionInfo pos) { 78cb93a386Sopenharmony_ci fExpression = std::make_unique<SkSL::VariableReference>(pos.line(), DSLWriter::Var(var), 79cb93a386Sopenharmony_ci SkSL::VariableReference::RefKind::kRead); 80cb93a386Sopenharmony_ci} 81cb93a386Sopenharmony_ci 82cb93a386Sopenharmony_ciDSLExpression::DSLExpression(DSLVarBase&& var, PositionInfo pos) 83cb93a386Sopenharmony_ci : DSLExpression(var) {} 84cb93a386Sopenharmony_ci 85cb93a386Sopenharmony_ciDSLExpression::DSLExpression(DSLPossibleExpression expr, PositionInfo pos) { 86cb93a386Sopenharmony_ci ThreadContext::ReportErrors(pos); 87cb93a386Sopenharmony_ci if (expr.valid()) { 88cb93a386Sopenharmony_ci fExpression = std::move(expr.fExpression); 89cb93a386Sopenharmony_ci } else { 90cb93a386Sopenharmony_ci fExpression = SkSL::Poison::Make(pos.line(), ThreadContext::Context()); 91cb93a386Sopenharmony_ci } 92cb93a386Sopenharmony_ci} 93cb93a386Sopenharmony_ci 94cb93a386Sopenharmony_ciDSLExpression DSLExpression::Poison(PositionInfo pos) { 95cb93a386Sopenharmony_ci return DSLExpression(SkSL::Poison::Make(pos.line(), ThreadContext::Context())); 96cb93a386Sopenharmony_ci} 97cb93a386Sopenharmony_ci 98cb93a386Sopenharmony_ciDSLExpression::~DSLExpression() { 99cb93a386Sopenharmony_ci#if !defined(SKSL_STANDALONE) && SK_SUPPORT_GPU 100cb93a386Sopenharmony_ci if (fExpression && ThreadContext::InFragmentProcessor()) { 101cb93a386Sopenharmony_ci ThreadContext::CurrentEmitArgs()->fFragBuilder->codeAppend( 102cb93a386Sopenharmony_ci DSLStatement(this->release()).release()); 103cb93a386Sopenharmony_ci return; 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci#endif 106cb93a386Sopenharmony_ci SkASSERTF(!fExpression || !ThreadContext::Settings().fAssertDSLObjectsReleased, 107cb93a386Sopenharmony_ci "Expression destroyed without being incorporated into program (see " 108cb93a386Sopenharmony_ci "ProgramSettings::fAssertDSLObjectsReleased)"); 109cb93a386Sopenharmony_ci} 110cb93a386Sopenharmony_ci 111cb93a386Sopenharmony_cibool DSLExpression::isValid() const { 112cb93a386Sopenharmony_ci return this->hasValue() && !fExpression->is<SkSL::Poison>(); 113cb93a386Sopenharmony_ci} 114cb93a386Sopenharmony_ci 115cb93a386Sopenharmony_civoid DSLExpression::swap(DSLExpression& other) { 116cb93a386Sopenharmony_ci std::swap(fExpression, other.fExpression); 117cb93a386Sopenharmony_ci} 118cb93a386Sopenharmony_ci 119cb93a386Sopenharmony_cistd::unique_ptr<SkSL::Expression> DSLExpression::release() { 120cb93a386Sopenharmony_ci SkASSERT(this->hasValue()); 121cb93a386Sopenharmony_ci return std::move(fExpression); 122cb93a386Sopenharmony_ci} 123cb93a386Sopenharmony_ci 124cb93a386Sopenharmony_cistd::unique_ptr<SkSL::Expression> DSLExpression::releaseIfPossible() { 125cb93a386Sopenharmony_ci return std::move(fExpression); 126cb93a386Sopenharmony_ci} 127cb93a386Sopenharmony_ci 128cb93a386Sopenharmony_ciDSLType DSLExpression::type() { 129cb93a386Sopenharmony_ci if (!this->hasValue()) { 130cb93a386Sopenharmony_ci return kVoid_Type; 131cb93a386Sopenharmony_ci } 132cb93a386Sopenharmony_ci return &fExpression->type(); 133cb93a386Sopenharmony_ci} 134cb93a386Sopenharmony_ci 135cb93a386Sopenharmony_ciDSLExpression DSLExpression::x(PositionInfo pos) { 136cb93a386Sopenharmony_ci return Swizzle(std::move(*this), X, pos); 137cb93a386Sopenharmony_ci} 138cb93a386Sopenharmony_ci 139cb93a386Sopenharmony_ciDSLExpression DSLExpression::y(PositionInfo pos) { 140cb93a386Sopenharmony_ci return Swizzle(std::move(*this), Y, pos); 141cb93a386Sopenharmony_ci} 142cb93a386Sopenharmony_ci 143cb93a386Sopenharmony_ciDSLExpression DSLExpression::z(PositionInfo pos) { 144cb93a386Sopenharmony_ci return Swizzle(std::move(*this), Z, pos); 145cb93a386Sopenharmony_ci} 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ciDSLExpression DSLExpression::w(PositionInfo pos) { 148cb93a386Sopenharmony_ci return Swizzle(std::move(*this), W, pos); 149cb93a386Sopenharmony_ci} 150cb93a386Sopenharmony_ci 151cb93a386Sopenharmony_ciDSLExpression DSLExpression::r(PositionInfo pos) { 152cb93a386Sopenharmony_ci return Swizzle(std::move(*this), R, pos); 153cb93a386Sopenharmony_ci} 154cb93a386Sopenharmony_ci 155cb93a386Sopenharmony_ciDSLExpression DSLExpression::g(PositionInfo pos) { 156cb93a386Sopenharmony_ci return Swizzle(std::move(*this), G, pos); 157cb93a386Sopenharmony_ci} 158cb93a386Sopenharmony_ci 159cb93a386Sopenharmony_ciDSLExpression DSLExpression::b(PositionInfo pos) { 160cb93a386Sopenharmony_ci return Swizzle(std::move(*this), B, pos); 161cb93a386Sopenharmony_ci} 162cb93a386Sopenharmony_ci 163cb93a386Sopenharmony_ciDSLExpression DSLExpression::a(PositionInfo pos) { 164cb93a386Sopenharmony_ci return Swizzle(std::move(*this), A, pos); 165cb93a386Sopenharmony_ci} 166cb93a386Sopenharmony_ci 167cb93a386Sopenharmony_ciDSLExpression DSLExpression::field(skstd::string_view name, PositionInfo pos) { 168cb93a386Sopenharmony_ci return DSLExpression(FieldAccess::Convert(ThreadContext::Context(), 169cb93a386Sopenharmony_ci *ThreadContext::SymbolTable(), this->release(), name), pos); 170cb93a386Sopenharmony_ci} 171cb93a386Sopenharmony_ci 172cb93a386Sopenharmony_ciDSLPossibleExpression DSLExpression::operator=(DSLExpression right) { 173cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), this->release(), 174cb93a386Sopenharmony_ci SkSL::Token::Kind::TK_EQ, right.release()); 175cb93a386Sopenharmony_ci} 176cb93a386Sopenharmony_ci 177cb93a386Sopenharmony_ciDSLPossibleExpression DSLExpression::operator[](DSLExpression right) { 178cb93a386Sopenharmony_ci return IndexExpression::Convert(ThreadContext::Context(), *ThreadContext::SymbolTable(), 179cb93a386Sopenharmony_ci this->release(), right.release()); 180cb93a386Sopenharmony_ci} 181cb93a386Sopenharmony_ci 182cb93a386Sopenharmony_ciDSLPossibleExpression DSLExpression::operator()(SkTArray<DSLWrapper<DSLExpression>> args, 183cb93a386Sopenharmony_ci PositionInfo pos) { 184cb93a386Sopenharmony_ci ExpressionArray converted; 185cb93a386Sopenharmony_ci converted.reserve_back(args.count()); 186cb93a386Sopenharmony_ci for (DSLWrapper<DSLExpression>& arg : args) { 187cb93a386Sopenharmony_ci converted.push_back(arg->release()); 188cb93a386Sopenharmony_ci } 189cb93a386Sopenharmony_ci return (*this)(std::move(converted), pos); 190cb93a386Sopenharmony_ci} 191cb93a386Sopenharmony_ci 192cb93a386Sopenharmony_ciDSLPossibleExpression DSLExpression::operator()(ExpressionArray args, PositionInfo pos) { 193cb93a386Sopenharmony_ci return SkSL::FunctionCall::Convert(ThreadContext::Context(), pos.line(), this->release(), 194cb93a386Sopenharmony_ci std::move(args)); 195cb93a386Sopenharmony_ci} 196cb93a386Sopenharmony_ci 197cb93a386Sopenharmony_ci#define OP(op, token) \ 198cb93a386Sopenharmony_ciDSLPossibleExpression operator op(DSLExpression left, DSLExpression right) { \ 199cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), left.release(), \ 200cb93a386Sopenharmony_ci SkSL::Token::Kind::token, right.release()); \ 201cb93a386Sopenharmony_ci} 202cb93a386Sopenharmony_ci 203cb93a386Sopenharmony_ci#define PREFIXOP(op, token) \ 204cb93a386Sopenharmony_ciDSLPossibleExpression operator op(DSLExpression expr) { \ 205cb93a386Sopenharmony_ci return PrefixExpression::Convert(ThreadContext::Context(), SkSL::Token::Kind::token, \ 206cb93a386Sopenharmony_ci expr.release()); \ 207cb93a386Sopenharmony_ci} 208cb93a386Sopenharmony_ci 209cb93a386Sopenharmony_ci#define POSTFIXOP(op, token) \ 210cb93a386Sopenharmony_ciDSLPossibleExpression operator op(DSLExpression expr, int) { \ 211cb93a386Sopenharmony_ci return PostfixExpression::Convert(ThreadContext::Context(), expr.release(), \ 212cb93a386Sopenharmony_ci SkSL::Token::Kind::token); \ 213cb93a386Sopenharmony_ci} 214cb93a386Sopenharmony_ci 215cb93a386Sopenharmony_ciOP(+, TK_PLUS) 216cb93a386Sopenharmony_ciOP(+=, TK_PLUSEQ) 217cb93a386Sopenharmony_ciOP(-, TK_MINUS) 218cb93a386Sopenharmony_ciOP(-=, TK_MINUSEQ) 219cb93a386Sopenharmony_ciOP(*, TK_STAR) 220cb93a386Sopenharmony_ciOP(*=, TK_STAREQ) 221cb93a386Sopenharmony_ciOP(/, TK_SLASH) 222cb93a386Sopenharmony_ciOP(/=, TK_SLASHEQ) 223cb93a386Sopenharmony_ciOP(%, TK_PERCENT) 224cb93a386Sopenharmony_ciOP(%=, TK_PERCENTEQ) 225cb93a386Sopenharmony_ciOP(<<, TK_SHL) 226cb93a386Sopenharmony_ciOP(<<=, TK_SHLEQ) 227cb93a386Sopenharmony_ciOP(>>, TK_SHR) 228cb93a386Sopenharmony_ciOP(>>=, TK_SHREQ) 229cb93a386Sopenharmony_ciOP(&&, TK_LOGICALAND) 230cb93a386Sopenharmony_ciOP(||, TK_LOGICALOR) 231cb93a386Sopenharmony_ciOP(&, TK_BITWISEAND) 232cb93a386Sopenharmony_ciOP(&=, TK_BITWISEANDEQ) 233cb93a386Sopenharmony_ciOP(|, TK_BITWISEOR) 234cb93a386Sopenharmony_ciOP(|=, TK_BITWISEOREQ) 235cb93a386Sopenharmony_ciOP(^, TK_BITWISEXOR) 236cb93a386Sopenharmony_ciOP(^=, TK_BITWISEXOREQ) 237cb93a386Sopenharmony_ciDSLPossibleExpression LogicalXor(DSLExpression left, DSLExpression right) { 238cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), left.release(), 239cb93a386Sopenharmony_ci SkSL::Token::Kind::TK_LOGICALXOR, right.release()); 240cb93a386Sopenharmony_ci} 241cb93a386Sopenharmony_ciOP(==, TK_EQEQ) 242cb93a386Sopenharmony_ciOP(!=, TK_NEQ) 243cb93a386Sopenharmony_ciOP(>, TK_GT) 244cb93a386Sopenharmony_ciOP(<, TK_LT) 245cb93a386Sopenharmony_ciOP(>=, TK_GTEQ) 246cb93a386Sopenharmony_ciOP(<=, TK_LTEQ) 247cb93a386Sopenharmony_ci 248cb93a386Sopenharmony_ciPREFIXOP(+, TK_PLUS) 249cb93a386Sopenharmony_ciPREFIXOP(-, TK_MINUS) 250cb93a386Sopenharmony_ciPREFIXOP(!, TK_LOGICALNOT) 251cb93a386Sopenharmony_ciPREFIXOP(~, TK_BITWISENOT) 252cb93a386Sopenharmony_ciPREFIXOP(++, TK_PLUSPLUS) 253cb93a386Sopenharmony_ciPOSTFIXOP(++, TK_PLUSPLUS) 254cb93a386Sopenharmony_ciPREFIXOP(--, TK_MINUSMINUS) 255cb93a386Sopenharmony_ciPOSTFIXOP(--, TK_MINUSMINUS) 256cb93a386Sopenharmony_ci 257cb93a386Sopenharmony_ciDSLPossibleExpression operator,(DSLExpression left, DSLExpression right) { 258cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), left.release(), 259cb93a386Sopenharmony_ci SkSL::Token::Kind::TK_COMMA, right.release()); 260cb93a386Sopenharmony_ci} 261cb93a386Sopenharmony_ci 262cb93a386Sopenharmony_ciDSLPossibleExpression operator,(DSLPossibleExpression left, DSLExpression right) { 263cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), 264cb93a386Sopenharmony_ci DSLExpression(std::move(left)).release(), SkSL::Token::Kind::TK_COMMA, right.release()); 265cb93a386Sopenharmony_ci} 266cb93a386Sopenharmony_ci 267cb93a386Sopenharmony_ciDSLPossibleExpression operator,(DSLExpression left, DSLPossibleExpression right) { 268cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), left.release(), 269cb93a386Sopenharmony_ci SkSL::Token::Kind::TK_COMMA, DSLExpression(std::move(right)).release()); 270cb93a386Sopenharmony_ci} 271cb93a386Sopenharmony_ci 272cb93a386Sopenharmony_ciDSLPossibleExpression operator,(DSLPossibleExpression left, DSLPossibleExpression right) { 273cb93a386Sopenharmony_ci return BinaryExpression::Convert(ThreadContext::Context(), 274cb93a386Sopenharmony_ci DSLExpression(std::move(left)).release(), SkSL::Token::Kind::TK_COMMA, 275cb93a386Sopenharmony_ci DSLExpression(std::move(right)).release()); 276cb93a386Sopenharmony_ci} 277cb93a386Sopenharmony_ci 278cb93a386Sopenharmony_ciDSLPossibleExpression::DSLPossibleExpression(std::unique_ptr<SkSL::Expression> expr) 279cb93a386Sopenharmony_ci : fExpression(std::move(expr)) {} 280cb93a386Sopenharmony_ci 281cb93a386Sopenharmony_ciDSLPossibleExpression::DSLPossibleExpression(DSLPossibleExpression&& other) 282cb93a386Sopenharmony_ci : fExpression(std::move(other.fExpression)) {} 283cb93a386Sopenharmony_ci 284cb93a386Sopenharmony_ciDSLPossibleExpression::~DSLPossibleExpression() { 285cb93a386Sopenharmony_ci if (fExpression) { 286cb93a386Sopenharmony_ci // this handles incorporating the expression into the output tree 287cb93a386Sopenharmony_ci DSLExpression(std::move(fExpression)); 288cb93a386Sopenharmony_ci } 289cb93a386Sopenharmony_ci} 290cb93a386Sopenharmony_ci 291cb93a386Sopenharmony_civoid DSLPossibleExpression::reportErrors(PositionInfo pos) { 292cb93a386Sopenharmony_ci SkASSERT(!this->valid()); 293cb93a386Sopenharmony_ci ThreadContext::ReportErrors(pos); 294cb93a386Sopenharmony_ci} 295cb93a386Sopenharmony_ci 296cb93a386Sopenharmony_ciDSLType DSLPossibleExpression::type() { 297cb93a386Sopenharmony_ci if (!this->valid()) { 298cb93a386Sopenharmony_ci return kVoid_Type; 299cb93a386Sopenharmony_ci } 300cb93a386Sopenharmony_ci return &fExpression->type(); 301cb93a386Sopenharmony_ci} 302cb93a386Sopenharmony_ci 303cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::x(PositionInfo pos) { 304cb93a386Sopenharmony_ci return DSLExpression(this->release()).x(pos); 305cb93a386Sopenharmony_ci} 306cb93a386Sopenharmony_ci 307cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::y(PositionInfo pos) { 308cb93a386Sopenharmony_ci return DSLExpression(this->release()).y(pos); 309cb93a386Sopenharmony_ci} 310cb93a386Sopenharmony_ci 311cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::z(PositionInfo pos) { 312cb93a386Sopenharmony_ci return DSLExpression(this->release()).z(pos); 313cb93a386Sopenharmony_ci} 314cb93a386Sopenharmony_ci 315cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::w(PositionInfo pos) { 316cb93a386Sopenharmony_ci return DSLExpression(this->release()).w(pos); 317cb93a386Sopenharmony_ci} 318cb93a386Sopenharmony_ci 319cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::r(PositionInfo pos) { 320cb93a386Sopenharmony_ci return DSLExpression(this->release()).r(pos); 321cb93a386Sopenharmony_ci} 322cb93a386Sopenharmony_ci 323cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::g(PositionInfo pos) { 324cb93a386Sopenharmony_ci return DSLExpression(this->release()).g(pos); 325cb93a386Sopenharmony_ci} 326cb93a386Sopenharmony_ci 327cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::b(PositionInfo pos) { 328cb93a386Sopenharmony_ci return DSLExpression(this->release()).b(pos); 329cb93a386Sopenharmony_ci} 330cb93a386Sopenharmony_ci 331cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::a(PositionInfo pos) { 332cb93a386Sopenharmony_ci return DSLExpression(this->release()).a(pos); 333cb93a386Sopenharmony_ci} 334cb93a386Sopenharmony_ci 335cb93a386Sopenharmony_ciDSLExpression DSLPossibleExpression::field(skstd::string_view name, PositionInfo pos) { 336cb93a386Sopenharmony_ci return DSLExpression(this->release()).field(name, pos); 337cb93a386Sopenharmony_ci} 338cb93a386Sopenharmony_ci 339cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator=(DSLExpression expr) { 340cb93a386Sopenharmony_ci return DSLExpression(this->release()) = std::move(expr); 341cb93a386Sopenharmony_ci} 342cb93a386Sopenharmony_ci 343cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator=(int expr) { 344cb93a386Sopenharmony_ci return this->operator=(DSLExpression(expr)); 345cb93a386Sopenharmony_ci} 346cb93a386Sopenharmony_ci 347cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator=(float expr) { 348cb93a386Sopenharmony_ci return this->operator=(DSLExpression(expr)); 349cb93a386Sopenharmony_ci} 350cb93a386Sopenharmony_ci 351cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator=(double expr) { 352cb93a386Sopenharmony_ci return this->operator=(DSLExpression(expr)); 353cb93a386Sopenharmony_ci} 354cb93a386Sopenharmony_ci 355cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator[](DSLExpression index) { 356cb93a386Sopenharmony_ci return DSLExpression(this->release())[std::move(index)]; 357cb93a386Sopenharmony_ci} 358cb93a386Sopenharmony_ci 359cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator()(SkTArray<DSLWrapper<DSLExpression>> args, 360cb93a386Sopenharmony_ci PositionInfo pos) { 361cb93a386Sopenharmony_ci return DSLExpression(this->release())(std::move(args), pos); 362cb93a386Sopenharmony_ci} 363cb93a386Sopenharmony_ci 364cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator()(ExpressionArray args, PositionInfo pos) { 365cb93a386Sopenharmony_ci return DSLExpression(this->release())(std::move(args), pos); 366cb93a386Sopenharmony_ci} 367cb93a386Sopenharmony_ci 368cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator++() { 369cb93a386Sopenharmony_ci return ++DSLExpression(this->release()); 370cb93a386Sopenharmony_ci} 371cb93a386Sopenharmony_ci 372cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator++(int) { 373cb93a386Sopenharmony_ci return DSLExpression(this->release())++; 374cb93a386Sopenharmony_ci} 375cb93a386Sopenharmony_ci 376cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator--() { 377cb93a386Sopenharmony_ci return --DSLExpression(this->release()); 378cb93a386Sopenharmony_ci} 379cb93a386Sopenharmony_ci 380cb93a386Sopenharmony_ciDSLPossibleExpression DSLPossibleExpression::operator--(int) { 381cb93a386Sopenharmony_ci return DSLExpression(this->release())--; 382cb93a386Sopenharmony_ci} 383cb93a386Sopenharmony_ci 384cb93a386Sopenharmony_cistd::unique_ptr<SkSL::Expression> DSLPossibleExpression::release(PositionInfo pos) { 385cb93a386Sopenharmony_ci return DSLExpression(std::move(*this), pos).release(); 386cb93a386Sopenharmony_ci} 387cb93a386Sopenharmony_ci 388cb93a386Sopenharmony_ci} // namespace dsl 389cb93a386Sopenharmony_ci 390cb93a386Sopenharmony_ci} // namespace SkSL 391