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    
010    /**
011     * Represents a javascript expression for array access.
012     */
013    public final class JsArrayAccess extends JsExpressionImpl {
014        private JsExpression arrayExpression;
015        private JsExpression indexExpression;
016    
017        public JsArrayAccess() {
018            super();
019        }
020    
021        public JsArrayAccess(JsExpression arrayExpression, JsExpression indexExpression) {
022            this.arrayExpression = arrayExpression;
023            this.indexExpression = indexExpression;
024        }
025    
026        public JsExpression getArrayExpression() {
027            return arrayExpression;
028        }
029    
030        public JsExpression getIndexExpression() {
031            return indexExpression;
032        }
033    
034        public void setArrayExpression(JsExpression arrayExpression) {
035            this.arrayExpression = arrayExpression;
036        }
037    
038        public void setIndexExpression(JsExpression indexExpression) {
039            this.indexExpression = indexExpression;
040        }
041    
042        @Override
043        public void accept(JsVisitor v) {
044            v.visitArrayAccess(this);
045        }
046    
047        @Override
048        public void acceptChildren(JsVisitor visitor) {
049            visitor.accept(arrayExpression);
050            visitor.accept(indexExpression);
051        }
052    
053        @Override
054        public void traverse(JsVisitorWithContext v, JsContext ctx) {
055            if (v.visit(this, ctx)) {
056                arrayExpression = v.accept(arrayExpression);
057                indexExpression = v.accept(indexExpression);
058            }
059            v.endVisit(this, ctx);
060        }
061    
062        @NotNull
063        @Override
064        public JsArrayAccess deepCopy() {
065            JsExpression arrayCopy = AstUtil.deepCopy(arrayExpression);
066            JsExpression indexCopy = AstUtil.deepCopy(indexExpression);
067    
068            return new JsArrayAccess(arrayCopy, indexCopy).withMetadataFrom(this);
069        }
070    }