Properly capture extension receiver for array convention expressions in object constructor

#KT-19389 Fixed
This commit is contained in:
Mikhael Bogdanov
2019-02-05 11:37:23 +01:00
parent 3943bd1b15
commit 9ab6062295
12 changed files with 155 additions and 0 deletions
@@ -69,6 +69,8 @@ import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.*;
import static org.jetbrains.kotlin.codegen.binding.CodegenBinding.enumEntryNeedSubclass;
import static org.jetbrains.kotlin.codegen.inline.InlineCodegenUtils2Kt.initDefaultSourceMappingIfNeeded;
import static org.jetbrains.kotlin.load.java.JvmAbi.*;
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_GET;
import static org.jetbrains.kotlin.resolve.BindingContext.INDEXED_LVALUE_SET;
import static org.jetbrains.kotlin.resolve.BindingContextUtils.getNotNull;
import static org.jetbrains.kotlin.resolve.DescriptorToSourceUtils.descriptorToDeclaration;
import static org.jetbrains.kotlin.resolve.DescriptorUtils.*;
@@ -1021,6 +1023,22 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
public void visitSuperExpression(@NotNull KtSuperExpression expression) {
lookupInContext(ExpressionCodegen.getSuperCallLabelTarget(context, expression));
}
@Override
public void visitArrayAccessExpression(@NotNull KtArrayAccessExpression expression) {
ResolvedCall<FunctionDescriptor> resolvedGetCall = bindingContext.get(INDEXED_LVALUE_GET, expression);
if (resolvedGetCall != null) {
ReceiverValue receiver = resolvedGetCall.getDispatchReceiver();
lookupReceiver(receiver);
}
ResolvedCall<FunctionDescriptor> resolvedSetCall = bindingContext.get(INDEXED_LVALUE_SET, expression);
if (resolvedSetCall != null) {
ReceiverValue receiver = resolvedSetCall.getDispatchReceiver();
lookupReceiver(receiver);
}
super.visitArrayAccessExpression(expression);
}
};
for (KtDeclaration declaration : myClass.getDeclarations()) {
+21
View File
@@ -0,0 +1,21 @@
public fun <T, R> myWith(receiver: T, block: T.() -> R): R {
return receiver.block()
}
object Foo2 {
operator fun Any?.get(key: String) = "OK"
}
object Main {
fun bar() = myWith(Foo2) {
val x = object {
val y = 38["Hello!"]
}
x.y
}
}
fun box(): String {
return Main.bar()
}
+27
View File
@@ -0,0 +1,27 @@
var result = "fail"
public fun <T, R> myWith(receiver: T, block: T.() -> R): R {
return receiver.block()
}
object Foo2 {
operator fun Any?.get(key: String) = "OK"
operator fun Any?.set(key: String, value: String) {
result = value
}
}
object Main {
fun bar() = myWith(Foo2) {
val x = object {
init {
38["Hello!"] = "OK"
}
}
result
}
}
fun box(): String {
return Main.bar()
}
@@ -0,0 +1,24 @@
// FILE: 1.kt
public inline fun <T, R> myWith(receiver: T, block: T.() -> R): R {
return receiver.block()
}
// FILE: 2.kt
//NO_CHECK_LAMBDA_INLINING
object Foo2 {
operator fun Any?.get(key: String) = "OK"
}
object Main {
fun bar() = myWith(Foo2) {
val x = object {
val y = 38["Hello!"]
}
x.y
}
}
fun box(): String {
return Main.bar()
}
@@ -3736,6 +3736,16 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/closures/kt11634_4.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389.kt");
}
@TestMetadata("kt19389_set.kt")
public void testKt19389_set() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389_set.kt");
}
@TestMetadata("kt2151.kt")
public void testKt2151() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt2151.kt");
@@ -186,6 +186,11 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super3.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19389.kt");
}
@TestMetadata("kt19399.kt")
public void testKt19399() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19399.kt");
@@ -186,6 +186,11 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super3.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19389.kt");
}
@TestMetadata("kt19399.kt")
public void testKt19399() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19399.kt");
@@ -3736,6 +3736,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/closures/kt11634_4.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389.kt");
}
@TestMetadata("kt19389_set.kt")
public void testKt19389_set() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389_set.kt");
}
@TestMetadata("kt2151.kt")
public void testKt2151() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt2151.kt");
@@ -3736,6 +3736,16 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/closures/kt11634_4.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389.kt");
}
@TestMetadata("kt19389_set.kt")
public void testKt19389_set() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389_set.kt");
}
@TestMetadata("kt2151.kt")
public void testKt2151() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt2151.kt");
@@ -186,6 +186,11 @@ public class IrBlackBoxInlineCodegenTestGenerated extends AbstractIrBlackBoxInli
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt17972_super3.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19389.kt");
}
@TestMetadata("kt19399.kt")
public void testKt19399() throws Exception {
runTest("compiler/testData/codegen/boxInline/anonymousObject/kt19399.kt");
@@ -3136,6 +3136,16 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/closures/kt11634_4.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389.kt");
}
@TestMetadata("kt19389_set.kt")
public void testKt19389_set() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389_set.kt");
}
@TestMetadata("kt2151.kt")
public void testKt2151() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt2151.kt");
@@ -3136,6 +3136,16 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/closures/kt11634_4.kt");
}
@TestMetadata("kt19389.kt")
public void testKt19389() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389.kt");
}
@TestMetadata("kt19389_set.kt")
public void testKt19389_set() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt19389_set.kt");
}
@TestMetadata("kt2151.kt")
public void testKt2151() throws Exception {
runTest("compiler/testData/codegen/box/closures/kt2151.kt");