Fix for KT-13374: CompilationException: Inline function call with anonymous object implementing an interface by delegation
#KT-13374 Fixed
This commit is contained in:
@@ -1166,7 +1166,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
KotlinType expressionType = expression != null ? bindingContext.getType(expression) : null;
|
KotlinType expressionType = expression != null ? bindingContext.getType(expression) : null;
|
||||||
Type asmType =
|
Type asmType =
|
||||||
expressionType != null ? typeMapper.mapType(expressionType) : typeMapper.mapType(getSuperClass(specifier));
|
expressionType != null ? typeMapper.mapType(expressionType) : typeMapper.mapType(getSuperClass(specifier));
|
||||||
result.addField((KtDelegatedSuperTypeEntry) specifier, asmType, "$delegate_" + n);
|
result.addField((KtDelegatedSuperTypeEntry) specifier, asmType, JvmAbi.DELEGATE_SUPER_FIELD_PREFIX + n);
|
||||||
}
|
}
|
||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,16 +24,16 @@ class Test3() : Test2() {
|
|||||||
|
|
||||||
fun box(): String {
|
fun box(): String {
|
||||||
try {
|
try {
|
||||||
Test::class.java.getDeclaredField("\$delegate_0")
|
Test::class.java.getDeclaredField("\$\$delegate_0")
|
||||||
return "\$delegate_0 field generated for class Test but should not"
|
return "\$\$delegate_0 field generated for class Test but should not"
|
||||||
}
|
}
|
||||||
catch (e: NoSuchFieldException) {
|
catch (e: NoSuchFieldException) {
|
||||||
// ok
|
// ok
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Test2::class.java.getDeclaredField("\$delegate_0")
|
Test2::class.java.getDeclaredField("\$\$delegate_0")
|
||||||
return "\$delegate_0 field generated for class Test but should not"
|
return "\$\$delegate_0 field generated for class Test but should not"
|
||||||
}
|
}
|
||||||
catch (e: NoSuchFieldException) {
|
catch (e: NoSuchFieldException) {
|
||||||
// ok
|
// ok
|
||||||
|
|||||||
@@ -0,0 +1,37 @@
|
|||||||
|
// FILE: 1.kt
|
||||||
|
|
||||||
|
package test
|
||||||
|
|
||||||
|
interface IZ {
|
||||||
|
fun z()
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IZZ : IZ {
|
||||||
|
fun zz()
|
||||||
|
}
|
||||||
|
|
||||||
|
inline fun implZZ(zImpl: IZ, crossinline zzImpl: () -> Unit): IZZ =
|
||||||
|
object : IZZ, IZ by zImpl {
|
||||||
|
override fun zz() = zzImpl()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
|
||||||
|
import test.*
|
||||||
|
|
||||||
|
var result = "fail";
|
||||||
|
|
||||||
|
object ZImpl : IZ {
|
||||||
|
override fun z() {
|
||||||
|
result = "O"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val zz = implZZ(ZImpl) { result += "K" }
|
||||||
|
zz.z()
|
||||||
|
zz.zz()
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
interface Foo
|
interface Foo
|
||||||
|
|
||||||
class <!CONFLICTING_JVM_DECLARATIONS!>Bar(f: Foo)<!> : Foo by f {
|
class <!CONFLICTING_JVM_DECLARATIONS!>Bar(f: Foo)<!> : Foo by f {
|
||||||
<!CONFLICTING_JVM_DECLARATIONS!>val `$delegate_0`: Foo?<!> = null
|
<!CONFLICTING_JVM_DECLARATIONS!>val `$$delegate_0`: Foo?<!> = null
|
||||||
}
|
}
|
||||||
+1
-1
@@ -2,7 +2,7 @@ package
|
|||||||
|
|
||||||
public final class Bar : Foo {
|
public final class Bar : Foo {
|
||||||
public constructor Bar(/*0*/ f: Foo)
|
public constructor Bar(/*0*/ f: Foo)
|
||||||
public final val `$delegate_0`: Foo? = null
|
public final val `$$delegate_0`: Foo? = null
|
||||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||||
|
|||||||
@@ -133,6 +133,12 @@ public class BlackBoxInlineCodegenTestGenerated extends AbstractBlackBoxInlineCo
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt13374.kt")
|
||||||
|
public void testKt13374() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt13374.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt6552.kt")
|
@TestMetadata("kt6552.kt")
|
||||||
public void testKt6552() throws Exception {
|
public void testKt6552() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
||||||
|
|||||||
+6
@@ -133,6 +133,12 @@ public class CompileKotlinAgainstInlineKotlinTestGenerated extends AbstractCompi
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt13374.kt")
|
||||||
|
public void testKt13374() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt13374.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("kt6552.kt")
|
@TestMetadata("kt6552.kt")
|
||||||
public void testKt6552() throws Exception {
|
public void testKt6552() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/boxInline/anonymousObject/kt6552.kt");
|
||||||
|
|||||||
@@ -43,6 +43,7 @@ public final class JvmAbi {
|
|||||||
|
|
||||||
public static final String DELEGATED_PROPERTY_NAME_SUFFIX = "$delegate";
|
public static final String DELEGATED_PROPERTY_NAME_SUFFIX = "$delegate";
|
||||||
public static final String DELEGATED_PROPERTIES_ARRAY_NAME = "$$delegatedProperties";
|
public static final String DELEGATED_PROPERTIES_ARRAY_NAME = "$$delegatedProperties";
|
||||||
|
public static final String DELEGATE_SUPER_FIELD_PREFIX = "$$delegate_";
|
||||||
public static final String ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX = "$annotations";
|
public static final String ANNOTATED_PROPERTY_METHOD_NAME_SUFFIX = "$annotations";
|
||||||
|
|
||||||
public static final String INSTANCE_FIELD = "INSTANCE";
|
public static final String INSTANCE_FIELD = "INSTANCE";
|
||||||
|
|||||||
Reference in New Issue
Block a user