Support generating computable properties inside inline classes
This commit is contained in:
@@ -117,7 +117,7 @@ public class CallReceiver extends StackValue {
|
|||||||
// all the needed information, for example there's no way to find out whether or not a smart cast was applied to the receiver.
|
// all the needed information, for example there's no way to find out whether or not a smart cast was applied to the receiver.
|
||||||
if (container instanceof ClassDescriptor) {
|
if (container instanceof ClassDescriptor) {
|
||||||
ClassDescriptor classDescriptor = (ClassDescriptor) container;
|
ClassDescriptor classDescriptor = (ClassDescriptor) container;
|
||||||
return new AsmTypeAndKotlinType(typeMapper.mapClass(classDescriptor), classDescriptor.getDefaultType());
|
return new AsmTypeAndKotlinType(typeMapper.mapType(classDescriptor), classDescriptor.getDefaultType());
|
||||||
}
|
}
|
||||||
|
|
||||||
KotlinType dispatchReceiverType = dispatchReceiver.getReturnType();
|
KotlinType dispatchReceiverType = dispatchReceiver.getReturnType();
|
||||||
|
|||||||
@@ -243,7 +243,8 @@ public class FunctionCodegen {
|
|||||||
isClass(containingDeclaration) &&
|
isClass(containingDeclaration) &&
|
||||||
((ClassDescriptor) containingDeclaration).isInline() &&
|
((ClassDescriptor) containingDeclaration).isInline() &&
|
||||||
contextKind != OwnerKind.ERASED_INLINE_CLASS &&
|
contextKind != OwnerKind.ERASED_INLINE_CLASS &&
|
||||||
functionDescriptor instanceof SimpleFunctionDescriptor &&
|
!(functionDescriptor instanceof ConstructorDescriptor) &&
|
||||||
|
!KotlinTypeMapper.isAccessor(functionDescriptor) &&
|
||||||
origin.getOriginKind() != JvmDeclarationOriginKind.UNBOX_METHOD_OF_INLINE_CLASS;
|
origin.getOriginKind() != JvmDeclarationOriginKind.UNBOX_METHOD_OF_INLINE_CLASS;
|
||||||
|
|
||||||
if (isOpenSuspendInClass) {
|
if (isOpenSuspendInClass) {
|
||||||
|
|||||||
@@ -124,7 +124,8 @@ public class PropertyCodegen {
|
|||||||
@Nullable KtPropertyAccessor getter,
|
@Nullable KtPropertyAccessor getter,
|
||||||
@Nullable KtPropertyAccessor setter
|
@Nullable KtPropertyAccessor setter
|
||||||
) {
|
) {
|
||||||
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION || kind == OwnerKind.DEFAULT_IMPLS
|
assert kind == OwnerKind.PACKAGE || kind == OwnerKind.IMPLEMENTATION ||
|
||||||
|
kind == OwnerKind.DEFAULT_IMPLS || kind == OwnerKind.ERASED_INLINE_CLASS
|
||||||
: "Generating property with a wrong kind (" + kind + "): " + descriptor;
|
: "Generating property with a wrong kind (" + kind + "): " + descriptor;
|
||||||
|
|
||||||
genBackingFieldAndAnnotations(declaration, descriptor, false);
|
genBackingFieldAndAnnotations(declaration, descriptor, false);
|
||||||
|
|||||||
+24
@@ -0,0 +1,24 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
inline class Foo(val x: Int) {
|
||||||
|
fun empty() = ""
|
||||||
|
fun withParam(a: String) = a
|
||||||
|
fun withInlineClassParam(f: Foo) = f.toString()
|
||||||
|
|
||||||
|
fun test(): String {
|
||||||
|
val a = empty()
|
||||||
|
val b = withParam("hello")
|
||||||
|
val c = withInlineClassParam(this)
|
||||||
|
return a + b + c
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String {
|
||||||
|
return x.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val f = Foo(12)
|
||||||
|
return if (f.test() != "hello12") "fail" else "OK"
|
||||||
|
return "OK"
|
||||||
|
}
|
||||||
+10
@@ -0,0 +1,10 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
inline class UIntArray(private val intArray: IntArray) {
|
||||||
|
val size get() = intArray.size
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
val array = UIntArray(intArrayOf(1, 2, 3))
|
||||||
|
return if (array.size != 3) "fail" else "OK"
|
||||||
|
}
|
||||||
Vendored
+6
@@ -0,0 +1,6 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
inline class Foo(val x: Int) {
|
||||||
|
val prop: Int get() = 1
|
||||||
|
val asThis: Foo get() = this
|
||||||
|
}
|
||||||
Vendored
+16
@@ -0,0 +1,16 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final static class Foo$Erased {
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(p0: int): Foo
|
||||||
|
public final static method getAsThis(p0: int): int
|
||||||
|
public final static method getProp(p0: int): int
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class Foo {
|
||||||
|
private final field x: int
|
||||||
|
public method <init>(p0: int): void
|
||||||
|
public final method getAsThis(): int
|
||||||
|
public final method getProp(): int
|
||||||
|
public final method getX(): int
|
||||||
|
public final method unbox(): int
|
||||||
|
}
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
inline class UInt private constructor(val value: Int)
|
||||||
compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrivateConstructor.txt
Vendored
+12
@@ -0,0 +1,12 @@
|
|||||||
|
@kotlin.Metadata
|
||||||
|
public final static class UInt$Erased {
|
||||||
|
public final static @org.jetbrains.annotations.NotNull method box(p0: int): UInt
|
||||||
|
}
|
||||||
|
|
||||||
|
@kotlin.Metadata
|
||||||
|
public final class UInt {
|
||||||
|
private final field value: int
|
||||||
|
private method <init>(p0: int): void
|
||||||
|
public final method getValue(): int
|
||||||
|
public final method unbox(): int
|
||||||
|
}
|
||||||
+12
@@ -273,6 +273,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("computablePropertiesInsideInlineClass.kt")
|
||||||
|
public void testComputablePropertiesInsideInlineClass() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/computablePropertiesInsideInlineClass.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
@TestMetadata("noBridgesForErasedInlineClass.kt")
|
||||||
public void testNoBridgesForErasedInlineClass() throws Exception {
|
public void testNoBridgesForErasedInlineClass() throws Exception {
|
||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/noBridgesForErasedInlineClass.kt");
|
||||||
@@ -284,6 +290,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
|||||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.kt");
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrimitive.kt");
|
||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("shapeOfInlineClassWithPrivateConstructor.kt")
|
||||||
|
public void testShapeOfInlineClassWithPrivateConstructor() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/inlineClasses/shapeOfInlineClassWithPrivateConstructor.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("compiler/testData/codegen/bytecodeListing/specialBridges")
|
@TestMetadata("compiler/testData/codegen/bytecodeListing/specialBridges")
|
||||||
|
|||||||
Reference in New Issue
Block a user