From eacc94a89dcd38bcd01d2aad612ee40256643dea Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Wed, 14 Oct 2020 23:05:50 +0300 Subject: [PATCH] Do not hide synthetic properties except `isEmpty` from Java In order to hide synthetic property isEmpty from JDK 15, there was added additional logic in 5cc12b49fcaf828c4bf4279293b1c8a1f61a114f but it also lead to the fact that now it's impossible to call synthetic property `declaringClass` on `Enum` as it's in the same list as method isEmpty(). Note that it's questionable behavior, probably we should also hide `declaringClass` as well but for now we turn it back to preserve compatibility #KT-42467 Fixed --- .../codegen/ir/FirBlackBoxCodegenTestGenerated.java | 5 +++++ .../synthetic/JavaSyntheticPropertiesScope.kt | 4 ++-- .../codegen/box/enum/declaringClassOnEnumObject.kt | 13 +++++++++++++ .../codegen/BlackBoxCodegenTestGenerated.java | 5 +++++ .../codegen/LightAnalysisModeTestGenerated.java | 5 +++++ .../codegen/ir/IrBlackBoxCodegenTestGenerated.java | 5 +++++ 6 files changed, 35 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java index 62c90293987..86df109ae8f 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/codegen/ir/FirBlackBoxCodegenTestGenerated.java @@ -11045,6 +11045,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT runTest("compiler/testData/codegen/box/enum/constructorWithReordering.kt"); } + @TestMetadata("declaringClassOnEnumObject.kt") + public void testDeclaringClassOnEnumObject() throws Exception { + runTest("compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt"); + } + @TestMetadata("deepInnerClassInEnumEntryClass.kt") public void testDeepInnerClassInEnumEntryClass() throws Exception { runTest("compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt"); diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt index 138ab8ef42d..fe9441cbfe0 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/synthetic/JavaSyntheticPropertiesScope.kt @@ -162,7 +162,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l return descriptor.valueParameters.isEmpty() && descriptor.typeParameters.isEmpty() && descriptor.visibility.isVisibleOutside() - && !descriptor.isHiddenForResolutionEverywhereBesideSupercalls + && !(descriptor.isHiddenForResolutionEverywhereBesideSupercalls && descriptor.name.asString() == "isEmpty") // CharSequence.isEmpty() from JDK15 } private fun isGoodSetMethod(descriptor: FunctionDescriptor, getMethod: FunctionDescriptor): Boolean { @@ -179,7 +179,7 @@ class JavaSyntheticPropertiesScope(storageManager: StorageManager, private val l return parameter.varargElementType == null && descriptor.typeParameters.isEmpty() && descriptor.visibility.isVisibleOutside() - && !descriptor.isHiddenForResolutionEverywhereBesideSupercalls + && !(descriptor.isHiddenForResolutionEverywhereBesideSupercalls && descriptor.name.asString() == "isEmpty") // CharSequence.isEmpty() from JDK15 } private fun FunctionDescriptor.findOverridden(condition: (FunctionDescriptor) -> Boolean): FunctionDescriptor? { diff --git a/compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt b/compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt new file mode 100644 index 00000000000..b0a709c813c --- /dev/null +++ b/compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt @@ -0,0 +1,13 @@ +// TARGET_BACKEND: JVM +// IGNORE_BACKEND_FIR: JVM_IR + +enum class KEnum { A } + +fun test(e: KEnum): String { + return e.declaringClass.toString() +} + +fun box(): String { + val result = test(KEnum.A) + return if (result == "class KEnum") "OK" else "fail: $result" +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java index ce7808eb62a..e369dea175d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/BlackBoxCodegenTestGenerated.java @@ -12440,6 +12440,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest { runTest("compiler/testData/codegen/box/enum/constructorWithReordering.kt"); } + @TestMetadata("declaringClassOnEnumObject.kt") + public void testDeclaringClassOnEnumObject() throws Exception { + runTest("compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt"); + } + @TestMetadata("deepInnerClassInEnumEntryClass.kt") public void testDeepInnerClassInEnumEntryClass() throws Exception { runTest("compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java index 49bde71b5b5..a1541f95c47 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/LightAnalysisModeTestGenerated.java @@ -12440,6 +12440,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes runTest("compiler/testData/codegen/box/enum/constructorWithReordering.kt"); } + @TestMetadata("declaringClassOnEnumObject.kt") + public void testDeclaringClassOnEnumObject() throws Exception { + runTest("compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt"); + } + @TestMetadata("deepInnerClassInEnumEntryClass.kt") public void testDeepInnerClassInEnumEntryClass() throws Exception { runTest("compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java index 7031cdcb634..769d37db42d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrBlackBoxCodegenTestGenerated.java @@ -11045,6 +11045,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes runTest("compiler/testData/codegen/box/enum/constructorWithReordering.kt"); } + @TestMetadata("declaringClassOnEnumObject.kt") + public void testDeclaringClassOnEnumObject() throws Exception { + runTest("compiler/testData/codegen/box/enum/declaringClassOnEnumObject.kt"); + } + @TestMetadata("deepInnerClassInEnumEntryClass.kt") public void testDeepInnerClassInEnumEntryClass() throws Exception { runTest("compiler/testData/codegen/box/enum/deepInnerClassInEnumEntryClass.kt");