001 /*
002 * Copyright 2010-2015 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.kotlin.js.translate.reference;
018
019 import com.google.dart.compiler.backend.js.ast.JsExpression;
020 import org.jetbrains.annotations.NotNull;
021 import org.jetbrains.kotlin.js.translate.context.TranslationContext;
022 import org.jetbrains.kotlin.js.translate.general.Translation;
023 import org.jetbrains.kotlin.psi.*;
024
025 import java.util.LinkedHashMap;
026 import java.util.Map;
027
028 public final class AccessTranslationUtils {
029 private AccessTranslationUtils() {
030 }
031
032 @NotNull
033 public static AccessTranslator getAccessTranslator(@NotNull KtExpression referenceExpression,
034 @NotNull TranslationContext context) {
035 return getAccessTranslator(referenceExpression, context, false);
036 }
037
038 @NotNull
039 public static AccessTranslator getAccessTranslator(@NotNull KtExpression referenceExpression,
040 @NotNull TranslationContext context, boolean forceOrderOfEvaluation) {
041 assert ((referenceExpression instanceof KtReferenceExpression) ||
042 (referenceExpression instanceof KtQualifiedExpression));
043 if (referenceExpression instanceof KtQualifiedExpression) {
044 return QualifiedExpressionTranslator.getAccessTranslator((KtQualifiedExpression) referenceExpression, context, forceOrderOfEvaluation);
045 }
046 if (referenceExpression instanceof KtSimpleNameExpression) {
047 return ReferenceTranslator.getAccessTranslator((KtSimpleNameExpression) referenceExpression, context);
048 }
049 if (referenceExpression instanceof KtArrayAccessExpression) {
050 return getArrayAccessTranslator((KtArrayAccessExpression) referenceExpression, context, forceOrderOfEvaluation);
051 }
052 return new DefaultAccessTranslator(referenceExpression, context);
053 }
054
055 @NotNull
056 private static AccessTranslator getArrayAccessTranslator(
057 @NotNull KtArrayAccessExpression expression,
058 @NotNull TranslationContext context,
059 boolean forceOrderOfEvaluation
060 ) {
061 TranslationContext accessArrayContext;
062 if (forceOrderOfEvaluation) {
063 Map<KtExpression, JsExpression> indexesMap = new LinkedHashMap<KtExpression, JsExpression>();
064 for(KtExpression indexExpression : expression.getIndexExpressions()) {
065 JsExpression jsIndexExpression = context.cacheExpressionIfNeeded(
066 Translation.translateAsExpression(indexExpression, context));
067 indexesMap.put(indexExpression, jsIndexExpression);
068 }
069 accessArrayContext = context.innerContextWithAliasesForExpressions(indexesMap);
070 } else {
071 accessArrayContext = context;
072 }
073
074 return ArrayAccessTranslator.newInstance(expression, accessArrayContext);
075 }
076
077 @NotNull
078 public static JsExpression translateAsGet(@NotNull KtExpression expression,
079 @NotNull TranslationContext context) {
080 return (getAccessTranslator(expression, context)).translateAsGet();
081 }
082 }