From a9aa2bc1479694c82b11cb67bc232df6114ed5b4 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Wed, 7 Oct 2015 17:15:38 +0300 Subject: [PATCH] Interface companion object backing fields become static --- .../src/org/jetbrains/kotlin/codegen/AsmUtil.java | 14 +++++++++++--- .../classObject/trait/delegatedProtectedVar.kt | 3 +-- .../classObject/trait/delegatedPublicVal.kt | 2 +- .../property/classObject/trait/internalVal.kt | 2 +- .../property/classObject/trait/internalVar.kt | 2 +- .../classObject/trait/internalVarPrivateSet.kt | 2 +- .../property/classObject/trait/privateVal.kt | 2 +- .../property/classObject/trait/privateVar.kt | 2 +- .../property/classObject/trait/protectedVal.kt | 2 +- .../classObject/trait/protectedVarPrivateSet.kt | 2 +- .../property/classObject/trait/publicVal.kt | 2 +- .../classObject/trait/publicValNonDefault.kt | 2 +- .../property/classObject/trait/publicVar.kt | 2 +- .../classObject/trait/publicVarNonDefault.kt | 2 +- .../classObject/trait/publicVarPrivateSet.kt | 2 +- .../classObject/trait/publicVarProtectedSet.kt | 2 +- .../classObject/trait/publicVarPublicSet.kt | 2 +- .../jetbrains/kotlin/resolve/DescriptorUtils.java | 4 ++++ 18 files changed, 31 insertions(+), 20 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index 8b5925825d5..129569b396f 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -747,7 +747,9 @@ public class AsmUtil { return false; } - return isNonCompanionObject(propertyDescriptor.getContainingDeclaration()) || isPropertyWithBackingFieldInOuterClass(propertyDescriptor); + return isNonCompanionObject(propertyDescriptor.getContainingDeclaration()) || + isPropertyWithBackingFieldInOuterClass(propertyDescriptor) || + isInterfaceCompanionObject(propertyDescriptor.getContainingDeclaration()); } public static boolean isPropertyWithBackingFieldInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { @@ -756,8 +758,14 @@ public class AsmUtil { } public static int getVisibilityForSpecialPropertyBackingField(@NotNull PropertyDescriptor propertyDescriptor, boolean isDelegate) { + return getVisibilityForSpecialPropertyBackingField(propertyDescriptor, isDelegate, false); + } + + public static int getVisibilityForSpecialPropertyBackingField(@NotNull PropertyDescriptor propertyDescriptor, boolean isDelegate, boolean skipInterfaceCheck) { boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null; - if (isDelegate || isExtensionProperty) { + if (isDelegate || + isExtensionProperty || + (!skipInterfaceCheck && isInterfaceCompanionObject(propertyDescriptor.getContainingDeclaration()))) { return ACC_PRIVATE; } else { @@ -783,7 +791,7 @@ public class AsmUtil { && !isExtensionProperty && isCompanionObject(propertyContainer) && isInterface(propertyContainer.getContainingDeclaration()) && areBothAccessorDefault(propertyDescriptor) - && getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC; + && getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false, true) == ACC_PUBLIC; } public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { diff --git a/compiler/testData/writeFlags/property/classObject/trait/delegatedProtectedVar.kt b/compiler/testData/writeFlags/property/classObject/trait/delegatedProtectedVar.kt index 9327e128689..9a73080c1ae 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/delegatedProtectedVar.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/delegatedProtectedVar.kt @@ -24,9 +24,8 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop$delegate -// FLAGS: ACC_FINAL, ACC_PRIVATE +// FLAGS: ACC_FINAL, ACC_PRIVATE, ACC_STATIC // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test, prop$delegate -// FLAGS: ACC_FINAL, ACC_PRIVATE // ABSENT: TRUE \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/delegatedPublicVal.kt b/compiler/testData/writeFlags/property/classObject/trait/delegatedPublicVal.kt index 8f2b1f37946..24d7b197abf 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/delegatedPublicVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/delegatedPublicVal.kt @@ -20,7 +20,7 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop$delegate -// FLAGS: ACC_FINAL, ACC_PRIVATE +// FLAGS: ACC_FINAL, ACC_PRIVATE, ACC_STATIC // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test, prop$delegate diff --git a/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt b/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt index 8efb6af7605..582d52688c7 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE, ACC_FINAL \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/internalVar.kt b/compiler/testData/writeFlags/property/classObject/trait/internalVar.kt index c0fab7bcef3..e75fc3a8520 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/internalVar.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/internalVar.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE +// FLAGS: ACC_PRIVATE, ACC_STATIC diff --git a/compiler/testData/writeFlags/property/classObject/trait/internalVarPrivateSet.kt b/compiler/testData/writeFlags/property/classObject/trait/internalVarPrivateSet.kt index 83c76732140..a40dfe660bc 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/internalVarPrivateSet.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/internalVarPrivateSet.kt @@ -11,4 +11,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/privateVal.kt b/compiler/testData/writeFlags/property/classObject/trait/privateVal.kt index 6d4377cf9a5..99c63881837 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/privateVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/privateVal.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE, ACC_FINAL \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/privateVar.kt b/compiler/testData/writeFlags/property/classObject/trait/privateVar.kt index 920ecceabbd..6939583cad7 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/privateVar.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/privateVar.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/protectedVal.kt b/compiler/testData/writeFlags/property/classObject/trait/protectedVal.kt index 1fa7908a250..5187c7818df 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/protectedVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/protectedVal.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE, ACC_FINAL \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/protectedVarPrivateSet.kt b/compiler/testData/writeFlags/property/classObject/trait/protectedVarPrivateSet.kt index 351d3c38462..3741b313b45 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/protectedVarPrivateSet.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/protectedVarPrivateSet.kt @@ -11,4 +11,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt index 2a7f7a435c9..f39d344eb04 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE, ACC_FINAL \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicValNonDefault.kt b/compiler/testData/writeFlags/property/classObject/trait/publicValNonDefault.kt index 8144a0c7864..c785d044a62 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicValNonDefault.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicValNonDefault.kt @@ -13,4 +13,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE, ACC_FINAL \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVar.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVar.kt index 0592a51be66..1e024c71530 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVar.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVar.kt @@ -10,4 +10,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVarNonDefault.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVarNonDefault.kt index 9d82c57e73b..68be7cdffc0 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVarNonDefault.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVarNonDefault.kt @@ -13,4 +13,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVarPrivateSet.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVarPrivateSet.kt index 6582aa047a3..a880caa6076 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVarPrivateSet.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVarPrivateSet.kt @@ -11,4 +11,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE \ No newline at end of file +// FLAGS: ACC_PRIVATE, ACC_STATIC \ No newline at end of file diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVarProtectedSet.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVarProtectedSet.kt index dae77bd9504..327755430c6 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVarProtectedSet.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVarProtectedSet.kt @@ -11,4 +11,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE +// FLAGS: ACC_PRIVATE, ACC_STATIC diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVarPublicSet.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVarPublicSet.kt index 1280dc23708..a362660a830 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVarPublicSet.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVarPublicSet.kt @@ -11,4 +11,4 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop -// FLAGS: ACC_PRIVATE +// FLAGS: ACC_PRIVATE, ACC_STATIC diff --git a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java index e1f1f8286fe..fab362487d9 100644 --- a/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java +++ b/core/descriptors/src/org/jetbrains/kotlin/resolve/DescriptorUtils.java @@ -305,6 +305,10 @@ public class DescriptorUtils { return isKindOf(descriptor, ClassKind.OBJECT) && !((ClassDescriptor) descriptor).isCompanionObject(); } + public static boolean isInterfaceCompanionObject(@NotNull DeclarationDescriptor descriptor) { + return isCompanionObject(descriptor) && isKindOf(descriptor.getContainingDeclaration(), ClassKind.INTERFACE); + } + public static boolean isObject(@NotNull DeclarationDescriptor descriptor) { return isKindOf(descriptor, ClassKind.OBJECT); }