From ae6fdcc6731c34b0a8cefd8eac84107d6ed0d534 Mon Sep 17 00:00:00 2001 From: Erokhin Stanislav Date: Mon, 30 Dec 2013 18:15:45 +0400 Subject: [PATCH] JS backend: Fix cache receiver in VariableAccess (KT-740-1) --- .../QualifiedExpressionTranslator.java | 4 +- .../reference/ReferenceTranslator.java | 2 +- ...SimpleWrappedVariableAccessTranslator.java | 71 ------------ .../reference/VariableAccessTranslator.java | 103 ++++++++++++++++++ 4 files changed, 106 insertions(+), 74 deletions(-) delete mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/reference/SimpleWrappedVariableAccessTranslator.java create mode 100644 js/js.translator/src/org/jetbrains/k2js/translate/reference/VariableAccessTranslator.java diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java index 56b547723ec..4358becf436 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/QualifiedExpressionTranslator.java @@ -40,7 +40,7 @@ public final class QualifiedExpressionTranslator { public static AccessTranslator getAccessTranslator(@NotNull JetQualifiedExpression expression, @NotNull TranslationContext context) { JsExpression receiver = translateReceiver(expression, context); - return new SimpleWrappedVariableAccessTranslator(context, getNotNullSimpleNameSelector(expression), receiver); + return VariableAccessTranslator.newInstance(context, getNotNullSimpleNameSelector(expression), receiver); } @NotNull @@ -61,7 +61,7 @@ public final class QualifiedExpressionTranslator { ) { if (ReferenceTranslator.canBePropertyAccess(selector, context)) { assert selector instanceof JetSimpleNameExpression : "Selectors for properties must be simple names."; - return new SimpleWrappedVariableAccessTranslator(context, (JetSimpleNameExpression)selector, receiver).translateAsGet(); + return VariableAccessTranslator.newInstance(context, (JetSimpleNameExpression)selector, receiver).translateAsGet(); } if (selector instanceof JetCallExpression) { return invokeCallExpressionTranslator(receiver, selector, callType, context); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java index 08d2cdfaf5e..10d86ef2bd0 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ReferenceTranslator.java @@ -76,7 +76,7 @@ public final class ReferenceTranslator { return BackingFieldAccessTranslator.newInstance(referenceExpression, context); } if (canBePropertyAccess(referenceExpression, context)) { - return new SimpleWrappedVariableAccessTranslator(context, referenceExpression, receiver); + return VariableAccessTranslator.newInstance(context, referenceExpression, receiver); } if (ClassObjectAccessTranslator.isClassObjectReference(referenceExpression, context)) { return ClassObjectAccessTranslator.newInstance(referenceExpression, context); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/SimpleWrappedVariableAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/SimpleWrappedVariableAccessTranslator.java deleted file mode 100644 index 1ca8fd488b5..00000000000 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/SimpleWrappedVariableAccessTranslator.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.k2js.translate.reference; - -import com.google.dart.compiler.backend.js.ast.JsExpression; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.VariableDescriptor; -import org.jetbrains.jet.lang.psi.JetReferenceExpression; -import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; -import org.jetbrains.k2js.translate.context.TemporaryVariable; -import org.jetbrains.k2js.translate.context.TranslationContext; -import org.jetbrains.k2js.translate.utils.BindingUtils; - -import java.util.Collections; -import java.util.List; - -public class SimpleWrappedVariableAccessTranslator implements CachedAccessTranslator { - private final TranslationContext context; - private final ResolvedCall resolvedCall; - private final JsExpression receiver; - - public SimpleWrappedVariableAccessTranslator( - @NotNull TranslationContext context, - @NotNull JetReferenceExpression referenceExpression, - JsExpression receiver - ) { - this.context = context; - this.receiver = receiver; - ResolvedCall resolvedCall = BindingUtils.getResolvedCallForProperty(context.bindingContext(), referenceExpression); - assert resolvedCall.getResultingDescriptor() instanceof VariableDescriptor; - this.resolvedCall = (ResolvedCall) resolvedCall; - } - - @NotNull - @Override - public JsExpression translateAsGet() { - return ReferencePackage.buildGet(context, resolvedCall, receiver); - } - - @NotNull - @Override - public JsExpression translateAsSet(@NotNull JsExpression setTo) { - return ReferencePackage.buildSet(context, resolvedCall, setTo, receiver); - } - - @NotNull - @Override - public CachedAccessTranslator getCached() { - return this; - } - - @NotNull - @Override - public List declaredTemporaries() { // TODO : fix this - return Collections.emptyList(); - } -} diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/VariableAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/VariableAccessTranslator.java new file mode 100644 index 00000000000..a68ecda7cee --- /dev/null +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/VariableAccessTranslator.java @@ -0,0 +1,103 @@ +/* + * Copyright 2010-2013 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.k2js.translate.reference; + +import com.google.dart.compiler.backend.js.ast.JsExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.lang.descriptors.VariableDescriptor; +import org.jetbrains.jet.lang.psi.JetReferenceExpression; +import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; +import org.jetbrains.k2js.translate.context.TemporaryVariable; +import org.jetbrains.k2js.translate.context.TranslationContext; +import org.jetbrains.k2js.translate.general.AbstractTranslator; +import org.jetbrains.k2js.translate.utils.BindingUtils; + +import java.util.Collections; +import java.util.List; + +public class VariableAccessTranslator extends AbstractTranslator implements AccessTranslator { + public static VariableAccessTranslator newInstance( + @NotNull TranslationContext context, + @NotNull JetReferenceExpression referenceExpression, + @Nullable JsExpression receiver + ) { + ResolvedCall resolvedCall = BindingUtils.getResolvedCallForProperty(context.bindingContext(), referenceExpression); + assert resolvedCall.getResultingDescriptor() instanceof VariableDescriptor; + return new VariableAccessTranslator(context, (ResolvedCall) resolvedCall, receiver); + } + + + private final ResolvedCall resolvedCall; + private final JsExpression receiver; + + private VariableAccessTranslator( + @NotNull TranslationContext context, + @NotNull ResolvedCall resolvedCall, + @Nullable JsExpression receiver + ) { + super(context); + this.receiver = receiver; + this.resolvedCall = resolvedCall; + } + + @NotNull + @Override + public JsExpression translateAsGet() { + return ReferencePackage.buildGet(context(), resolvedCall, receiver); + } + + @NotNull + @Override + public JsExpression translateAsSet(@NotNull JsExpression setTo) { + return ReferencePackage.buildSet(context(), resolvedCall, setTo, receiver); + } + + @NotNull + @Override + public CachedAccessTranslator getCached() { + TemporaryVariable temporaryVariable = receiver == null ? null : context().declareTemporary(receiver); + return new CachedVariableAccessTranslator(context(), resolvedCall, temporaryVariable); + } + + private static class CachedVariableAccessTranslator extends VariableAccessTranslator implements CachedAccessTranslator { + @Nullable + private final TemporaryVariable cachedReceiver; + + public CachedVariableAccessTranslator( + @NotNull TranslationContext context, + @NotNull ResolvedCall resolvedCall, + @Nullable TemporaryVariable cachedReceiver + ) { + super(context, resolvedCall, cachedReceiver == null ? null : cachedReceiver.reference()); + this.cachedReceiver = cachedReceiver; + } + + @NotNull + @Override + public List declaredTemporaries() { + return cachedReceiver == null ? Collections.emptyList() : Collections.singletonList(cachedReceiver); + } + + @NotNull + @Override + public CachedAccessTranslator getCached() { + return this; + } + } + +}