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    public abstract class JsUnaryOperation extends JsExpressionImpl {
008    
009        private JsExpression arg;
010    
011        private final JsUnaryOperator op;
012    
013        public JsUnaryOperation(JsUnaryOperator op, JsExpression arg) {
014            super();
015            this.op = op;
016            this.arg = arg;
017        }
018    
019        public JsExpression getArg() {
020            return arg;
021        }
022    
023        public JsUnaryOperator getOperator() {
024            return op;
025        }
026    
027        public void setArg(JsExpression arg) {
028            this.arg = arg;
029        }
030    
031        @Override
032        public void acceptChildren(JsVisitor visitor) {
033            if (op.isModifying()) {
034                // The delete operator is practically like an assignment of undefined, so
035                // for practical purposes we're treating it as an lvalue.
036                visitor.acceptLvalue(arg);
037            }
038            else {
039                visitor.accept(arg);
040            }
041        }
042    
043        @Override
044        public void traverse(JsVisitorWithContext v, JsContext ctx) {
045            if (op.isModifying()) {
046          /*
047           * The delete operator is practically like an assignment of undefined, so for practical
048           * purposes we're treating it as an lvalue.
049           */
050                arg = v.acceptLvalue(arg);
051            } else {
052                arg = v.accept(arg);
053            }
054        }
055    }