diff --git a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java index 356aa34790b..fcdc000978d 100644 --- a/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java +++ b/js/js.tests/test/org/jetbrains/k2js/test/semantics/MiscTest.java @@ -64,4 +64,8 @@ public final class MiscTest extends AbstractExpressionTest { public void testKt740() throws Exception { checkFooBoxIsTrue("KT-740.kt"); } + + public void testKt740_2() throws Exception { + checkFooBoxIsOk("KT-740-2.kt"); + } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java index d2bdc5b97dc..9c8f630f445 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/AccessTranslator.java @@ -22,7 +22,7 @@ import org.jetbrains.annotations.NotNull; /** * @author Pavel Talanov *

- * Abstract entity for language constructs that you can get/set. Also dispatches to the real implemntation. + * Abstract entity for language constructs that you can get/set. */ public interface AccessTranslator { @@ -32,6 +32,7 @@ public interface AccessTranslator { @NotNull JsExpression translateAsSet(@NotNull JsExpression setTo); + //TODO: remove that method @NotNull CachedAccessTranslator getCached(); } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java index f4bf9919d9f..ec67d0e756b 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/ArrayAccessTranslator.java @@ -19,23 +19,18 @@ package org.jetbrains.k2js.translate.reference; import com.google.common.collect.Lists; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; -import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.psi.JetArrayAccessExpression; import org.jetbrains.k2js.translate.context.TranslationContext; import org.jetbrains.k2js.translate.general.AbstractTranslator; import org.jetbrains.k2js.translate.general.Translation; +import org.jetbrains.k2js.translate.utils.BindingUtils; import org.jetbrains.k2js.translate.utils.TranslationUtils; import java.util.List; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getDescriptorForReferenceExpression; -import static org.jetbrains.k2js.translate.utils.BindingUtils.getResolvedCall; - /** * @author Pavel Talanov */ - -//TODO: inspect not clear how the class handles set and get operations differently public class ArrayAccessTranslator extends AbstractTranslator implements AccessTranslator { /*package*/ @@ -46,16 +41,11 @@ public class ArrayAccessTranslator extends AbstractTranslator implements AccessT @NotNull private final JetArrayAccessExpression expression; - @NotNull - private final FunctionDescriptor methodDescriptor; protected ArrayAccessTranslator(@NotNull JetArrayAccessExpression expression, @NotNull TranslationContext context) { super(context); this.expression = expression; - //TODO: that is strange - this.methodDescriptor = (FunctionDescriptor) - getDescriptorForReferenceExpression(context.bindingContext(), expression); } @NotNull @@ -67,7 +57,7 @@ public class ArrayAccessTranslator extends AbstractTranslator implements AccessT @NotNull protected JsExpression translateAsGet(@NotNull JsExpression arrayExpression, @NotNull List indexExpression) { - return translateAsMethodCall(arrayExpression, indexExpression); + return translateAsMethodCall(arrayExpression, indexExpression, /*isGetter = */ true); } @NotNull @@ -80,16 +70,17 @@ public class ArrayAccessTranslator extends AbstractTranslator implements AccessT protected JsExpression translateAsSet(@NotNull JsExpression arrayExpression, @NotNull List indexExpressions, @NotNull JsExpression toSetTo) { List arguments = Lists.newArrayList(indexExpressions); arguments.add(toSetTo); - return translateAsMethodCall(arrayExpression, arguments); + return translateAsMethodCall(arrayExpression, arguments, /*isGetter = */ false); } @NotNull - private JsExpression translateAsMethodCall(@NotNull JsExpression arrayExpression, @NotNull List arguments) { + private JsExpression translateAsMethodCall(@NotNull JsExpression arrayExpression, + @NotNull List arguments, + boolean isGetter) { return CallBuilder.build(context()) .receiver(arrayExpression) .args(arguments) - .resolvedCall(getResolvedCall(bindingContext(), expression)) - .descriptor(methodDescriptor) + .resolvedCall(BindingUtils.getResolvedCallForArrayAccess(bindingContext(), expression, isGetter)) .translate(); } @@ -106,6 +97,6 @@ public class ArrayAccessTranslator extends AbstractTranslator implements AccessT @NotNull @Override public CachedAccessTranslator getCached() { - return null; //To change body of implemented methods use File | Settings | File Templates. + return new CachedArrayAccessTranslator(expression, context()); } } diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CachedArrayAccessTranslator.java b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CachedArrayAccessTranslator.java index 4222d50b53d..f747788350e 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/reference/CachedArrayAccessTranslator.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/reference/CachedArrayAccessTranslator.java @@ -38,8 +38,8 @@ public final class CachedArrayAccessTranslator extends ArrayAccessTranslator imp @NotNull private final List indexExpressions; - private CachedArrayAccessTranslator(@NotNull JetArrayAccessExpression expression, - @NotNull TranslationContext context) { + /*package*/ CachedArrayAccessTranslator(@NotNull JetArrayAccessExpression expression, + @NotNull TranslationContext context) { super(expression, context); arrayExpression = context.declareTemporary(translateArrayExpression()); indexExpressions = fromExpressionList(translateIndexExpressions(), context); diff --git a/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java b/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java index d81ea4025c5..96b54b2db63 100644 --- a/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java +++ b/js/js.translator/src/org/jetbrains/k2js/translate/utils/BindingUtils.java @@ -25,13 +25,15 @@ import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; -import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import org.jetbrains.jet.lang.types.JetType; +import org.jetbrains.jet.lang.types.lang.JetStandardClasses; import java.util.ArrayList; import java.util.List; import java.util.Set; +import static org.jetbrains.jet.lang.resolve.BindingContext.INDEXED_LVALUE_GET; +import static org.jetbrains.jet.lang.resolve.BindingContext.INDEXED_LVALUE_SET; import static org.jetbrains.k2js.translate.utils.DescriptorUtils.*; /** @@ -332,4 +334,16 @@ public final class BindingUtils { assert type != null; return type; } + + @NotNull + public static ResolvedCall getResolvedCallForArrayAccess(@NotNull BindingContext context, + @NotNull JetArrayAccessExpression arrayAccessExpression, + boolean isGet + ) { + ResolvedCall resolvedCall = context.get(isGet + ? INDEXED_LVALUE_GET + : INDEXED_LVALUE_SET, arrayAccessExpression); + assert resolvedCall != null; + return resolvedCall; + } } diff --git a/js/js.translator/testFiles/expression/misc/cases/KT-740-2.kt b/js/js.translator/testFiles/expression/misc/cases/KT-740-2.kt new file mode 100644 index 00000000000..6c6d6066b41 --- /dev/null +++ b/js/js.translator/testFiles/expression/misc/cases/KT-740-2.kt @@ -0,0 +1,59 @@ +package foo + +var c0 = 0 +var c1 = 0 +var c2 = 0 + +class A() { + var p = 0 + fun get(i : Int) : Int { + c1++ + return 0 + } + + fun set(i : Int, value : Int) { + c2++ + } + +} + +val a : A = A() +get() { + c0++ + return $a +} + +fun box() : String { + + var d = a[1] + if (c0 != 1) { + return "1" + } + if (c1 != 1) { + return "2" + } + ++a[1] + if (c0 != 2) { + return "3" + } + if (c1 != 2) { + return "4" + } + if (c2 != 1) { + return "5" + } + --a[1] + if (c0 != 3) { + return "6" + } + if (c1 != 3) { + return "7" + } + if (c2 != 2) { + return "8" + } + + + return "OK" + +} \ No newline at end of file diff --git a/js/js.translator/testFiles/expression/misc/cases/KT-740.kt b/js/js.translator/testFiles/expression/misc/cases/KT-740.kt index d113b08e4ce..0b666fa616f 100644 --- a/js/js.translator/testFiles/expression/misc/cases/KT-740.kt +++ b/js/js.translator/testFiles/expression/misc/cases/KT-740.kt @@ -19,8 +19,4 @@ fun box() : Boolean { return false; } return true -} - -fun main(args : Array) { - println(box()) } \ No newline at end of file