KT-13830: support case when LHS of augmented assignment is something different than qualified expression or array access

This commit is contained in:
Alexey Andreev
2016-09-27 19:32:22 +03:00
committed by Alexey Andreev
parent afe8244183
commit 30c2c85c94
4 changed files with 81 additions and 4 deletions
@@ -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");
@@ -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
@@ -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");
}
}
@@ -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
}