提交 27a1a17c 编写于 作者: M Michael Bogdanov

Deprecate non-const properties copies in interface

上级 dbc0197a
...@@ -786,10 +786,13 @@ public class AsmUtil { ...@@ -786,10 +786,13 @@ public class AsmUtil {
} }
public static boolean isPropertyWithBackingFieldCopyInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) { public static boolean isPropertyWithBackingFieldCopyInOuterClass(@NotNull PropertyDescriptor propertyDescriptor) {
boolean isExtensionProperty = propertyDescriptor.getExtensionReceiverParameter() != null;
DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration(); DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration();
return propertyDescriptor.isConst() return !propertyDescriptor.isVar()
&& isInterfaceCompanionObject(propertyContainer) && !isExtensionProperty
&& propertyDescriptor.getVisibility() == Visibilities.PUBLIC; && isCompanionObject(propertyContainer) && isInterface(propertyContainer.getContainingDeclaration())
&& areBothAccessorDefault(propertyDescriptor)
&& getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC;
} }
public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) { public static boolean isCompanionObjectWithBackingFieldsInOuter(@NotNull DeclarationDescriptor companionObject) {
......
...@@ -1024,8 +1024,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen { ...@@ -1024,8 +1024,9 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
PropertyDescriptor property = info.descriptor; PropertyDescriptor property = info.descriptor;
Type type = typeMapper.mapType(property); 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), 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()), type.getDescriptor(), typeMapper.mapFieldSignature(property.getType()),
info.defaultValue); info.defaultValue);
......
...@@ -8,8 +8,11 @@ class Test { ...@@ -8,8 +8,11 @@ class Test {
s = Trait.NAME; s = Trait.NAME;
if (!s.equals("Trait")) throw new AssertionError("Fail interface: " + s); 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; 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"; return "OK";
} }
......
...@@ -7,13 +7,14 @@ class Klass { ...@@ -7,13 +7,14 @@ class Klass {
interface Trait { interface Trait {
companion object { companion object {
const val NAME = "Trait" const val NAME = "Trait"
val DEPRECATED = "DEPRECATED"
} }
} }
enum class Enoom { enum class Enoom {
; ;
companion object { companion object {
const val NAME = "Enoom" const val NAME = "Enum"
} }
} }
......
...@@ -6,7 +6,7 @@ interface Test { ...@@ -6,7 +6,7 @@ interface Test {
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop // TESTED_OBJECTS: Test, prop
// ABSENT: TRUE // FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop // TESTED_OBJECTS: Test$Companion, prop
......
...@@ -6,7 +6,7 @@ interface Test { ...@@ -6,7 +6,7 @@ interface Test {
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop // TESTED_OBJECTS: Test, prop
// ABSENT: TRUE // FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC, ACC_DEPRECATED
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop // TESTED_OBJECTS: Test$Companion, prop
......
...@@ -6,7 +6,7 @@ interface Test { ...@@ -6,7 +6,7 @@ interface Test {
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test, prop // TESTED_OBJECTS: Test, prop
// ABSENT: TRUE // FLAGS: ACC_PUBLIC, ACC_FINAL, ACC_STATIC, ACC_DEPRECATED
// TESTED_OBJECT_KIND: property // TESTED_OBJECT_KIND: property
// TESTED_OBJECTS: Test$Companion, prop // TESTED_OBJECTS: Test$Companion, prop
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册