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