From 93f868fb96dcfcf490644fc8231b026b4b15d348 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 16 Nov 2020 11:30:37 +0300 Subject: [PATCH] KT-43196 member extension property can't be "primary" in inline class --- .../inlineClasses/memberExtensionProperty.kt | 15 +++++ .../inlineClasses/memberExtensionProperty.txt | 63 +++++++++++++++++++ .../codegen/BytecodeListingTestGenerated.java | 5 ++ .../ir/IrBytecodeListingTestGenerated.java | 5 ++ .../kotlin/resolve/inlineClassesUtils.kt | 2 +- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt create mode 100644 compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.txt diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt b/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt new file mode 100644 index 00000000000..4b319b0b470 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt @@ -0,0 +1,15 @@ +inline class Z1(val s: Int) { + val String.ext: Int get() = 239 +} + +inline class Z2(val s: Int) { + val String.s: Int get() = 239 +} + +interface StrS { + val String.s: Int +} + +inline class Z3(val s: Int) : StrS { + override val String.s: Int get() = 239 +} \ No newline at end of file diff --git a/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.txt b/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.txt new file mode 100644 index 00000000000..586ae04b510 --- /dev/null +++ b/compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.txt @@ -0,0 +1,63 @@ +@kotlin.Metadata +public interface StrS { + // source: 'memberExtensionProperty.kt' + public abstract method getS(@org.jetbrains.annotations.NotNull p0: java.lang.String): int +} + +@kotlin.Metadata +public final class Z1 { + // source: 'memberExtensionProperty.kt' + private final field s: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): Z1 + public static method constructor-impl(p0: int): int + public method equals(p0: java.lang.Object): boolean + public static method equals-impl(p0: int, p1: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: int): boolean + public final static method getExt-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int + public final method getS(): int + public method hashCode(): int + public static method hashCode-impl(p0: int): int + public method toString(): java.lang.String + public static method toString-impl(p0: int): java.lang.String + public synthetic final method unbox-impl(): int +} + +@kotlin.Metadata +public final class Z2 { + // source: 'memberExtensionProperty.kt' + private final field s: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): Z2 + public static method constructor-impl(p0: int): int + public method equals(p0: java.lang.Object): boolean + public static method equals-impl(p0: int, p1: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: int): boolean + public final method getS(): int + public final static method getS-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int + public method hashCode(): int + public static method hashCode-impl(p0: int): int + public method toString(): java.lang.String + public static method toString-impl(p0: int): java.lang.String + public synthetic final method unbox-impl(): int +} + +@kotlin.Metadata +public final class Z3 { + // source: 'memberExtensionProperty.kt' + private final field s: int + private synthetic method (p0: int): void + public synthetic final static method box-impl(p0: int): Z3 + public static method constructor-impl(p0: int): int + public method equals(p0: java.lang.Object): boolean + public static method equals-impl(p0: int, p1: java.lang.Object): boolean + public final static method equals-impl0(p0: int, p1: int): boolean + public final method getS(): int + public method getS(@org.jetbrains.annotations.NotNull p0: java.lang.String): int + public static method getS-impl(p0: int, @org.jetbrains.annotations.NotNull p1: java.lang.String): int + public method hashCode(): int + public static method hashCode-impl(p0: int): int + public method toString(): java.lang.String + public static method toString-impl(p0: int): java.lang.String + public synthetic final method unbox-impl(): int +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java index 898cf963fbb..c9a948b528b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BytecodeListingTestGenerated.java @@ -957,6 +957,11 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt"); } + @TestMetadata("memberExtensionProperty.kt") + public void testMemberExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt"); + } + @TestMetadata("noArgConstructorForInlineClassParameter.kt") public void testNoArgConstructorForInlineClassParameter() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java index 44d221d5ca9..7a53947c3de 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBytecodeListingTestGenerated.java @@ -927,6 +927,11 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/inlineClassWithManyKindsOfMembers.kt"); } + @TestMetadata("memberExtensionProperty.kt") + public void testMemberExtensionProperty() throws Exception { + runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/memberExtensionProperty.kt"); + } + @TestMetadata("noArgConstructorForInlineClassParameter.kt") public void testNoArgConstructorForInlineClassParameter() throws Exception { runTest("compiler/testData/codegen/bytecodeListing/inlineClasses/noArgConstructorForInlineClassParameter.kt"); diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt index 91d6094ee33..2c3a5bf9ea6 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/inlineClassesUtils.kt @@ -6,7 +6,6 @@ package org.jetbrains.kotlin.resolve import org.jetbrains.kotlin.descriptors.* -import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeSubstitutor import org.jetbrains.kotlin.types.TypeUtils @@ -64,6 +63,7 @@ fun CallableDescriptor.isGetterOfUnderlyingPropertyOfInlineClass() = this is PropertyGetterDescriptor && correspondingProperty.isUnderlyingPropertyOfInlineClass() fun VariableDescriptor.isUnderlyingPropertyOfInlineClass(): Boolean { + if (extensionReceiverParameter != null) return false val containingDeclaration = this.containingDeclaration if (!containingDeclaration.isInlineClass()) return false