001    // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
002    // for details. All rights reserved. Use of this source code is governed by a
003    // BSD-style license that can be found in the LICENSE file.
004    
005    package com.google.dart.compiler.backend.js.ast;
006    
007    import com.google.dart.compiler.util.AstUtil;
008    import org.jetbrains.annotations.NotNull;
009    import org.jetbrains.annotations.Nullable;
010    
011    public final class JsBinaryOperation extends JsExpressionImpl {
012        private JsExpression arg1;
013        private JsExpression arg2;
014    
015        @NotNull
016        private final JsBinaryOperator op;
017    
018        public JsBinaryOperation(@NotNull JsBinaryOperator op) {
019            this(op, null, null);
020        }
021    
022        public JsBinaryOperation(@NotNull JsBinaryOperator op, @Nullable JsExpression arg1, @Nullable JsExpression arg2) {
023            this.op = op;
024            this.arg1 = arg1;
025            this.arg2 = arg2;
026        }
027    
028        public JsExpression getArg1() {
029            return arg1;
030        }
031    
032        public JsExpression getArg2() {
033            return arg2;
034        }
035    
036        public void setArg1(JsExpression arg1) {
037            this.arg1 = arg1;
038        }
039    
040        public void setArg2(JsExpression arg2) {
041            this.arg2 = arg2;
042        }
043    
044        @NotNull
045        public JsBinaryOperator getOperator() {
046            return op;
047        }
048    
049        @Override
050        public void accept(JsVisitor v) {
051            v.visitBinaryExpression(this);
052        }
053    
054        @Override
055        public void acceptChildren(JsVisitor visitor) {
056            if (op.isAssignment()) {
057                visitor.acceptLvalue(arg1);
058            }
059            else {
060                visitor.accept(arg1);
061            }
062            visitor.accept(arg2);
063        }
064    
065        @Override
066        public void traverse(JsVisitorWithContext v, JsContext ctx) {
067            if (v.visit(this, ctx)) {
068                if (op.isAssignment()) {
069                    arg1 = v.acceptLvalue(arg1);
070                } else {
071                    arg1 = v.accept(arg1);
072                }
073                arg2 = v.accept(arg2);
074            }
075            v.endVisit(this, ctx);
076        }
077    
078        @NotNull
079        @Override
080        public JsExpression deepCopy() {
081            return new JsBinaryOperation(op, AstUtil.deepCopy(arg1), AstUtil.deepCopy(arg2)).withMetadataFrom(this);
082        }
083    }