1/** 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16#ifndef ES2PANDA_IR_EXPRESSION_BINARY_EXPRESSION_H 17#define ES2PANDA_IR_EXPRESSION_BINARY_EXPRESSION_H 18 19#include <ir/expression.h> 20#include <lexer/token/tokenType.h> 21 22namespace panda::es2panda::compiler { 23class PandaGen; 24} // namespace panda::es2panda::compiler 25 26namespace panda::es2panda::checker { 27class Checker; 28class Type; 29} // namespace panda::es2panda::checker 30 31namespace panda::es2panda::ir { 32class PrivateNameFindResult; 33 34class BinaryExpression : public Expression { 35public: 36 explicit BinaryExpression(Expression *leftExpr, Expression *rightExpr, lexer::TokenType operatorType) 37 : Expression(AstNodeType::BINARY_EXPRESSION), left_(leftExpr), right_(rightExpr), operator_(operatorType) 38 { 39 if (right_->IsPrivateIdentifier()) { 40 throw Error{ErrorType::SYNTAX, "Unexpect private identifier", right_->Start().line, right_->Start().index}; 41 } 42 } 43 44 const Expression *Left() const 45 { 46 return left_; 47 } 48 49 Expression *Left() 50 { 51 return left_; 52 } 53 54 const Expression *Right() const 55 { 56 return right_; 57 } 58 59 Expression *Right() 60 { 61 return right_; 62 } 63 64 lexer::TokenType OperatorType() const 65 { 66 return operator_; 67 } 68 69 bool IsLogical() const 70 { 71 return operator_ <= lexer::TokenType::PUNCTUATOR_LOGICAL_AND; 72 } 73 74 void SetLeft(Expression *expr) 75 { 76 left_ = expr; 77 SetStart(left_->Start()); 78 } 79 80 void SetOperator(lexer::TokenType operatorType) 81 { 82 operator_ = operatorType; 83 type_ = AstNodeType::BINARY_EXPRESSION; 84 } 85 86 void Iterate(const NodeTraverser &cb) const override; 87 void Dump(ir::AstDumper *dumper) const override; 88 void Compile(compiler::PandaGen *pg) const override; 89 void CompileLogical(compiler::PandaGen *pg) const; 90 checker::Type *Check(checker::Checker *checker) const override; 91 void UpdateSelf(const NodeUpdater &cb, [[maybe_unused]] binder::Binder *binder) override; 92 93private: 94 void CompilePrivateIn(compiler::PandaGen *pg) const; 95 Expression *left_; 96 Expression *right_; 97 lexer::TokenType operator_; 98}; 99 100} // namespace panda::es2panda::ir 101 102#endif 103