Interface companion object backing fields become static

This commit is contained in:
Michael Bogdanov
2015-10-07 17:15:38 +03:00
parent 8f20595e8c
commit a9aa2bc147
18 changed files with 31 additions and 20 deletions
@@ -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) {
@@ -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
@@ -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
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -11,4 +11,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -11,4 +11,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -13,4 +13,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE, ACC_FINAL
// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC
@@ -10,4 +10,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -13,4 +13,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -11,4 +11,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -11,4 +11,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -11,4 +11,4 @@ interface Test {
// TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop
// FLAGS: ACC_PRIVATE
// FLAGS: ACC_PRIVATE, ACC_STATIC
@@ -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);
}