diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index 94eac1ca165..16d5c3cfaec 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -5797,6 +5797,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("js/js.translator/testData/box/operatorOverloading"), Pattern.compile("^([^_](.+))\\.kt$"), true); } + @TestMetadata("augmentedAssignmentLhs.kt") + public void testAugmentedAssignmentLhs() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/operatorOverloading/augmentedAssignmentLhs.kt"); + doTest(fileName); + } + @TestMetadata("binaryDivOverload.kt") public void testBinaryDivOverload() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("js/js.translator/testData/box/operatorOverloading/binaryDivOverload.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java index cb090745940..12167986526 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/AccessTranslationUtils.java @@ -18,10 +18,9 @@ package org.jetbrains.kotlin.js.translate.reference; import com.google.dart.compiler.backend.js.ast.JsExpression; import org.jetbrains.annotations.NotNull; -import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.general.Translation; -import org.jetbrains.kotlin.js.translate.utils.TranslationUtils; +import org.jetbrains.kotlin.psi.*; import java.util.LinkedHashMap; import java.util.Map; @@ -47,8 +46,10 @@ public final class AccessTranslationUtils { if (referenceExpression instanceof KtSimpleNameExpression) { return ReferenceTranslator.getAccessTranslator((KtSimpleNameExpression) referenceExpression, context); } - assert referenceExpression instanceof KtArrayAccessExpression; - return getArrayAccessTranslator((KtArrayAccessExpression) referenceExpression, context, forceOrderOfEvaluation); + if (referenceExpression instanceof KtArrayAccessExpression) { + return getArrayAccessTranslator((KtArrayAccessExpression) referenceExpression, context, forceOrderOfEvaluation); + } + return new DefaultAccessTranslator(referenceExpression, context); } @NotNull diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/DefaultAccessTranslator.java b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/DefaultAccessTranslator.java new file mode 100644 index 00000000000..40cca8f2db5 --- /dev/null +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/reference/DefaultAccessTranslator.java @@ -0,0 +1,51 @@ +/* + * Copyright 2010-2016 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.kotlin.js.translate.reference; + +import com.google.dart.compiler.backend.js.ast.JsExpression; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.js.translate.context.TranslationContext; +import org.jetbrains.kotlin.js.translate.general.Translation; +import org.jetbrains.kotlin.psi.KtExpression; + +public class DefaultAccessTranslator implements AccessTranslator { + private final KtExpression expression; + private final TranslationContext context; + + public DefaultAccessTranslator(@NotNull KtExpression expression, @NotNull TranslationContext context) { + this.expression = expression; + this.context = context; + } + + @NotNull + @Override + public JsExpression translateAsGet() { + return Translation.translateAsExpression(expression, context); + } + + @NotNull + @Override + public JsExpression translateAsSet(@NotNull JsExpression setTo) { + throw new UnsupportedOperationException("This method is not meant to be supported in in DefaultAccessTranslator"); + } + + @NotNull + @Override + public AccessTranslator getCached() { + throw new UnsupportedOperationException("This method is not meant to be supported in in DefaultAccessTranslator"); + } +} diff --git a/js/js.translator/testData/box/operatorOverloading/augmentedAssignmentLhs.kt b/js/js.translator/testData/box/operatorOverloading/augmentedAssignmentLhs.kt new file mode 100644 index 00000000000..61aa0e0a241 --- /dev/null +++ b/js/js.translator/testData/box/operatorOverloading/augmentedAssignmentLhs.kt @@ -0,0 +1,19 @@ +package foo + +object Host { + var result: String = "" + get + private set + + operator fun plusAssign(s: String) { + result += s + } +} + +fun bar() = Host + +fun box(): String { + bar() += "O" + bar() += "K" + return Host.result +} \ No newline at end of file