001 /*
002 * Copyright 2010-2013 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.k2js.translate.reference;
018
019 import com.google.common.collect.Lists;
020 import com.google.dart.compiler.backend.js.ast.JsExpression;
021 import org.jetbrains.annotations.NotNull;
022 import org.jetbrains.jet.lang.psi.JetArrayAccessExpression;
023 import org.jetbrains.jet.lang.psi.JetExpression;
024 import org.jetbrains.k2js.translate.context.TranslationContext;
025 import org.jetbrains.k2js.translate.general.AbstractTranslator;
026 import org.jetbrains.k2js.translate.general.Translation;
027 import org.jetbrains.k2js.translate.utils.BindingUtils;
028 import org.jetbrains.k2js.translate.utils.TranslationUtils;
029
030 import java.util.List;
031
032 public class ArrayAccessTranslator extends AbstractTranslator implements AccessTranslator {
033
034 /*package*/
035 static ArrayAccessTranslator newInstance(@NotNull JetArrayAccessExpression expression,
036 @NotNull TranslationContext context) {
037 return new ArrayAccessTranslator(expression, context);
038 }
039
040 @NotNull
041 private final JetArrayAccessExpression expression;
042
043 protected ArrayAccessTranslator(@NotNull JetArrayAccessExpression expression,
044 @NotNull TranslationContext context) {
045 super(context);
046 this.expression = expression;
047 }
048
049 @NotNull
050 @Override
051 public JsExpression translateAsGet() {
052 return translateAsGet(translateArrayExpression(), translateIndexExpressions());
053 }
054
055 @NotNull
056 protected JsExpression translateAsGet(@NotNull JsExpression arrayExpression,
057 @NotNull List<JsExpression> indexExpression) {
058 return translateAsMethodCall(arrayExpression, indexExpression, /*isGetter = */ true);
059 }
060
061 @NotNull
062 @Override
063 public JsExpression translateAsSet(@NotNull JsExpression setTo) {
064 return translateAsSet(translateArrayExpression(), translateIndexExpressions(), setTo);
065 }
066
067 @NotNull
068 protected JsExpression translateAsSet(@NotNull JsExpression arrayExpression, @NotNull List<JsExpression> indexExpressions, @NotNull JsExpression toSetTo) {
069 List<JsExpression> arguments = Lists.newArrayList(indexExpressions);
070 arguments.add(toSetTo);
071 return translateAsMethodCall(arrayExpression, arguments, /*isGetter = */ false);
072 }
073
074 @NotNull
075 private JsExpression translateAsMethodCall(@NotNull JsExpression arrayExpression,
076 @NotNull List<JsExpression> arguments,
077 boolean isGetter) {
078 return CallBuilder.build(context())
079 .receiver(arrayExpression)
080 .args(arguments)
081 .resolvedCall(BindingUtils.getResolvedCallForArrayAccess(bindingContext(), expression, isGetter))
082 .translate();
083 }
084
085 @NotNull
086 protected List<JsExpression> translateIndexExpressions() {
087 return TranslationUtils.translateExpressionList(context(), expression.getIndexExpressions());
088 }
089
090 @NotNull
091 protected JsExpression translateArrayExpression() {
092 JetExpression arrayExpression = expression.getArrayExpression();
093 assert arrayExpression != null : "Code with parsing errors shouldn't be translated";
094 return Translation.translateAsExpression(arrayExpression, context());
095 }
096
097 @NotNull
098 @Override
099 public CachedAccessTranslator getCached() {
100 return new CachedArrayAccessTranslator(expression, context());
101 }
102 }