1b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/*
2b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Copyright 2016 Google Inc.
3b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas *
4b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * Use of this source code is governed by a BSD-style license that can be
5b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas * found in the LICENSE file.
6b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */
7b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
8b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#ifndef SKSL_ASTBINARYEXPRESSION
9b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#define SKSL_ASTBINARYEXPRESSION
10b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
11b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "SkSLASTExpression.h"
12b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#include "../SkSLToken.h"
13b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
14b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasnamespace SkSL {
15b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
16b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas/**
170df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas * Represents a binary operation, with the operator represented by the token's type.
18b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas */
19b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholasstruct ASTBinaryExpression : public ASTExpression {
20b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    ASTBinaryExpression(std::unique_ptr<ASTExpression> left, Token op,
21b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas                        std::unique_ptr<ASTExpression> right)
22b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    : INHERITED(op.fPosition, kBinary_Kind)
23b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fLeft(std::move(left))
24b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fOperator(op.fKind)
25b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    , fRight(std::move(right)) {}
26b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
270df1b04db87c3d86ee0b0bd6aa2cb5b6be32cac2Ethan Nicholas    String description() const override {
28b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas        return "(" + fLeft->description() + " " + Token::OperatorName(fOperator) + " " +
29b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas               fRight->description() + ")";
30b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    }
31b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
32b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    const std::unique_ptr<ASTExpression> fLeft;
33b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    const Token::Kind fOperator;
34b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    const std::unique_ptr<ASTExpression> fRight;
35b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
36b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas    typedef ASTExpression INHERITED;
37b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas};
38b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
39b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas} // namespace
40b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas
41b3058bdb1049ca75d526eb9f11e1a42a49e63585ethannicholas#endif
42