26 std::unique_ptr<Expression> left,
28 std::unique_ptr<Expression> right) {
32 const Type* rawLeftType = (
left->isIntLiteral() &&
right->type().isInteger())
35 const Type* rawRightType = (
right->isIntLiteral() &&
left->type().isInteger())
50 const Type* rightType;
51 const Type* resultType;
53 &leftType, &rightType, &resultType)) {
55 "' cannot operate on '" +
left->type().displayName() +
"', '" +
56 right->type().displayName() +
"'");
62 "' are not permitted");
83 "' can not operate on arrays (or structs containing arrays)");
99 std::unique_ptr<Expression> left,
101 std::unique_ptr<Expression> right) {
103 const Type* leftType;
104 const Type* rightType;
105 const Type* resultType;
107 &leftType, &rightType, &resultType));
114 std::unique_ptr<Expression> left,
116 std::unique_ptr<Expression> right,
117 const Type* resultType) {
128 left->type().checkForOutOfRangeLiteral(context, *
right);
133 op, *
right, *resultType)) {
137 return std::make_unique<BinaryExpression>(
pos, std::move(
left), op,
138 std::move(
right), resultType);
141bool BinaryExpression::CheckRef(
const Expression& expr) {
142 switch (expr.
kind()) {
143 case Expression::Kind::kFieldAccess:
149 case Expression::Kind::kSwizzle:
152 case Expression::Kind::kTernary: {
156 case Expression::Kind::kVariableReference: {
157 const VariableReference& ref = expr.
as<VariableReference>();
167 return std::make_unique<BinaryExpression>(
pos,
176 bool needsParens = (operatorPrecedence >= parentPrecedence);
177 return std::string(needsParens ?
"(" :
"") +
178 this->
left()->description(operatorPrecedence) +
180 this->
right()->description(operatorPrecedence) +
181 std::string(needsParens ?
")" :
"");
SkAssertResult(font.textToGlyphs("Hello", 5, SkTextEncoding::kUTF8, glyphs, std::size(glyphs))==count)
static std::unique_ptr< Expression > Convert(const Context &context, Position pos, std::unique_ptr< Expression > left, Operator op, std::unique_ptr< Expression > right)
std::unique_ptr< Expression > & left()
std::unique_ptr< Expression > & right()
static std::unique_ptr< Expression > Make(const Context &context, Position pos, std::unique_ptr< Expression > left, Operator op, std::unique_ptr< Expression > right)
VariableReference * isAssignmentIntoVariable()
Operator getOperator() const
static std::unique_ptr< Expression > Simplify(const Context &context, Position pos, const Expression &left, Operator op, const Expression &right, const Type &resultType)
void error(Position position, std::string_view msg)
std::unique_ptr< Expression > clone() const
const Type & type() const
std::string description() const final
std::unique_ptr< Expression > & base()
Position position() const
std::unique_ptr< Expression > & base()
std::string_view tightOperatorName() const
OperatorPrecedence getBinaryPrecedence() const
const char * operatorName() const
bool determineBinaryType(const Context &context, const Type &left, const Type &right, const Type **outLeftType, const Type **outRightType, const Type **outResultType) const
bool isAllowedInStrictES2Mode() const
bool isAssignment() const
std::unique_ptr< Expression > & base()
std::unique_ptr< Expression > & ifTrue()
std::unique_ptr< Expression > & ifFalse()
std::unique_ptr< Expression > coerceExpression(std::unique_ptr< Expression > expr, const Context &context) const
virtual const Type & componentType() const
virtual bool isOrContainsArray() const
virtual bool isOrContainsAtomic() const
bool UpdateVariableRefKind(Expression *expr, VariableRefKind kind, ErrorReporter *errors=nullptr)
bool IsAssignable(Expression &expr, AssignmentInfo *info=nullptr, ErrorReporter *errors=nullptr)
VariableReference * fAssignedVar
bool strictES2Mode() const