From 9095fa2844d14cb83e2dbdadedf9e664e290f9dc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 7 Aug 2015 16:00:22 +0300 Subject: [PATCH] Make PropertyMetadataImpl a data class To allow property delegates to use property metadata as a key in the hash map, and to improve debugging experience --- compiler/testData/builtin-classes.txt | 4 ++- .../propertyMetadataEqualsHashCodeToString.kt | 36 +++++++++++++++++++ .../BlackBoxCodegenTestGenerated.java | 6 ++++ core/builtins/src/kotlin/PropertyMetadata.kt | 4 ++- 4 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/delegatedProperty/propertyMetadataEqualsHashCodeToString.kt diff --git a/compiler/testData/builtin-classes.txt b/compiler/testData/builtin-classes.txt index 3452f73d152..6a8c0af0162 100644 --- a/compiler/testData/builtin-classes.txt +++ b/compiler/testData/builtin-classes.txt @@ -1076,10 +1076,12 @@ public interface PropertyMetadata { public abstract fun (): kotlin.String } -public final class PropertyMetadataImpl : kotlin.PropertyMetadata { +kotlin.data() public final class PropertyMetadataImpl : kotlin.PropertyMetadata { /*primary*/ public constructor PropertyMetadataImpl(/*0*/ name: kotlin.String) public open override /*1*/ val name: kotlin.String public open override /*1*/ fun (): kotlin.String + public final /*synthesized*/ fun component1(): kotlin.String + public final /*synthesized*/ fun copy(/*0*/ name: kotlin.String = ...): kotlin.PropertyMetadataImpl } public interface Range> { diff --git a/compiler/testData/codegen/box/delegatedProperty/propertyMetadataEqualsHashCodeToString.kt b/compiler/testData/codegen/box/delegatedProperty/propertyMetadataEqualsHashCodeToString.kt new file mode 100644 index 00000000000..98b22dc2b43 --- /dev/null +++ b/compiler/testData/codegen/box/delegatedProperty/propertyMetadataEqualsHashCodeToString.kt @@ -0,0 +1,36 @@ +import java.util.HashSet + +class A { + val foo: String by O + val Int.foo: String by O + + fun foo42() = 42.foo +} + +val foo: String by O +val Int.foo: String by O + +object O { + val metadatas = HashSet() + + fun get(t: Any?, p: PropertyMetadata): String { + metadatas.add(p) + return "" + } +} + +fun box(): String { + A().foo + A().foo42() + foo + 42.foo + + if (O.metadatas.size() != 1) + return "Too many different PropertyMetadata instances: ${O.metadatas}" + + val m = O.metadatas.iterator().next() + if (m.toString() != "PropertyMetadata(name=foo)") + return "Wrong toString(): $m" + + return "OK" +} diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java index 04c4ed5eec1..6f45a9dfe9b 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/generated/BlackBoxCodegenTestGenerated.java @@ -2851,6 +2851,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { doTest(fileName); } + @TestMetadata("propertyMetadataEqualsHashCodeToString.kt") + public void testPropertyMetadataEqualsHashCodeToString() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/propertyMetadataEqualsHashCodeToString.kt"); + doTest(fileName); + } + @TestMetadata("propertyMetadataShouldBeCached.kt") public void testPropertyMetadataShouldBeCached() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/box/delegatedProperty/propertyMetadataShouldBeCached.kt"); diff --git a/core/builtins/src/kotlin/PropertyMetadata.kt b/core/builtins/src/kotlin/PropertyMetadata.kt index 48b7c957de4..83d654bec26 100644 --- a/core/builtins/src/kotlin/PropertyMetadata.kt +++ b/core/builtins/src/kotlin/PropertyMetadata.kt @@ -29,4 +29,6 @@ public interface PropertyMetadata { /** * @suppress */ -public class PropertyMetadataImpl(override val name: String): PropertyMetadata +public data class PropertyMetadataImpl(override val name: String): PropertyMetadata { + override fun toString() = "PropertyMetadata(name=$name)" +}