From 27a1a17c096617ee23dcbea14b40b8d02a7106f4 Mon Sep 17 00:00:00 2001 From: Michael Bogdanov Date: Tue, 13 Oct 2015 11:40:08 +0300 Subject: [PATCH] Deprecate non-const properties copies in interface --- .../src/org/jetbrains/kotlin/codegen/AsmUtil.java | 9 ++++++--- .../kotlin/codegen/ImplementationBodyCodegen.java | 3 ++- .../properties/classObjectProperties/Test.java | 5 ++++- .../classObjectProperties/classObjectProperties.kt | 3 ++- .../property/classObject/trait/internalConstVal.kt | 2 +- .../writeFlags/property/classObject/trait/internalVal.kt | 2 +- .../writeFlags/property/classObject/trait/publicVal.kt | 2 +- 7 files changed, 17 insertions(+), 9 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java index a20c9e76182..41fb48bf426 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/AsmUtil.java @@ -786,10 +786,13 @@ public class AsmUtil { } public static boolean isPropertyWithBackingFieldCopyInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { + boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null; DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration(); - return propertyDescriptor.isConst() - && isInterfaceCompanionObject(propertyContainer) - && propertyDescriptor.getVisibility() == Visibilities.PUBLIC; + return !propertyDescriptor.isVar() + && !isExtensionProperty + && isCompanionObject(propertyContainer) && isInterface(propertyContainer.getContainingDeclaration()) + && areBothAccessorDefault(propertyDescriptor) + && getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC; } public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java index c8efe47ca2d..6de8e557047 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/ImplementationBodyCodegen.java @@ -1024,8 +1024,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { PropertyDescriptor property = info.descriptor; Type type = typeMapper.mapType(property); + int modifiers = ACC_STATIC | ACC_FINAL | ACC_PUBLIC | (property.isConst() ? 0 : ACC_DEPRECATED); FieldVisitor fv = v.newField(Synthetic(DescriptorToSourceUtils.descriptorToDeclaration(property), property), - ACC_STATIC | ACC_FINAL | ACC_PUBLIC, context.getFieldName(property, false), + modifiers, context.getFieldName(property, false), type.getDescriptor(), typeMapper.mapFieldSignature(property.getType()), info.defaultValue); diff --git a/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/Test.java b/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/Test.java index 28cf20463a5..faeab128d3b 100644 --- a/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/Test.java +++ b/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/Test.java @@ -8,8 +8,11 @@ class Test { s = Trait.NAME; if (!s.equals("Trait")) throw new AssertionError("Fail interface: " + s); + s = Trait.DEPRECATED; + if (!s.equals("DEPRECATED")) throw new AssertionError("Fail interface: " + s); + s = Enoom.NAME; - if (!s.equals("Enoom")) throw new AssertionError("Fail enum: " + s); + if (!s.equals("Enum")) throw new AssertionError("Fail enum: " + s); return "OK"; } diff --git a/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/classObjectProperties.kt b/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/classObjectProperties.kt index e683f86290d..c019de4c440 100644 --- a/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/classObjectProperties.kt +++ b/compiler/testData/codegen/boxWithJava/properties/classObjectProperties/classObjectProperties.kt @@ -7,13 +7,14 @@ class Klass { interface Trait { companion object { const val NAME = "Trait" + val DEPRECATED = "DEPRECATED" } } enum class Enoom { ; companion object { - const val NAME = "Enoom" + const val NAME = "Enum" } } diff --git a/compiler/testData/writeFlags/property/classObject/trait/internalConstVal.kt b/compiler/testData/writeFlags/property/classObject/trait/internalConstVal.kt index 64cdcad38f2..147ae2ce4f9 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/internalConstVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/internalConstVal.kt @@ -6,7 +6,7 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test, prop -// ABSENT: TRUE +// FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop diff --git a/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt b/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt index bca293f84ba..360719695e2 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/internalVal.kt @@ -6,7 +6,7 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test, prop -// ABSENT: TRUE +// FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC, ACC_DEPRECATED // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop diff --git a/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt b/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt index 372cce68f04..540b75877b1 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/publicVal.kt @@ -6,7 +6,7 @@ interface Test { // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test, prop -// ABSENT: TRUE +// FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC, ACC_DEPRECATED // TESTED_OBJECT_KIND: property // TESTED_OBJECTS: Test$Companion, prop