[JVM] Retain deprecated status for interface companion const property.
Create the field directly and maintain the fact that its corresponding property is the companion object property. That property has the deprecated annotation which puts the deprecated marker on the field when code generating the field. ^KT-54840 Fixed
This commit is contained in:
committed by
Alexander Udalov
parent
7b3ce35613
commit
636024f676
+19
-24
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
|
||||
import org.jetbrains.kotlin.backend.jvm.ir.replaceThisByStaticReference
|
||||
import org.jetbrains.kotlin.backend.jvm.propertiesPhase
|
||||
import org.jetbrains.kotlin.descriptors.DescriptorVisibilities
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.addField
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.addProperty
|
||||
import org.jetbrains.kotlin.ir.builders.declarations.buildField
|
||||
import org.jetbrains.kotlin.ir.builders.irCall
|
||||
@@ -106,33 +107,27 @@ private class MoveOrCopyCompanionObjectFieldsLowering(val context: JvmBackendCon
|
||||
}
|
||||
}
|
||||
|
||||
private fun copyConstProperty(oldProperty: IrProperty, newParent: IrClass): IrProperty =
|
||||
newParent.addProperty() {
|
||||
updateFrom(oldProperty)
|
||||
name = oldProperty.name
|
||||
isConst = true
|
||||
}.also { property ->
|
||||
val oldField = oldProperty.backingField!!
|
||||
property.backingField = context.irFactory.buildField {
|
||||
updateFrom(oldField)
|
||||
name = oldField.name
|
||||
isStatic = true
|
||||
}.apply {
|
||||
parent = newParent
|
||||
correspondingPropertySymbol = property.symbol
|
||||
annotations += oldField.annotations
|
||||
initializer = oldField.initializer?.run {
|
||||
IrExpressionBodyImpl(startOffset, endOffset, (expression as IrConst<*>).shallowCopy())
|
||||
}
|
||||
|
||||
if (oldProperty.parentAsClass.visibility == DescriptorVisibilities.PRIVATE) {
|
||||
context.createJvmIrBuilder(this.symbol).run {
|
||||
annotations = filterOutAnnotations(DeprecationResolver.JAVA_DEPRECATED, annotations) +
|
||||
irCall(irSymbols.javaLangDeprecatedConstructorWithDeprecatedFlag)
|
||||
}
|
||||
private fun copyConstProperty(oldProperty: IrProperty, newParent: IrClass): IrField {
|
||||
val oldField = oldProperty.backingField!!
|
||||
return newParent.addField {
|
||||
updateFrom(oldField)
|
||||
name = oldField.name
|
||||
isStatic = true
|
||||
}.apply {
|
||||
parent = newParent
|
||||
correspondingPropertySymbol = oldProperty.symbol
|
||||
initializer = oldField.initializer?.run {
|
||||
IrExpressionBodyImpl(startOffset, endOffset, (expression as IrConst<*>).shallowCopy())
|
||||
}
|
||||
annotations += oldField.annotations
|
||||
if (oldProperty.parentAsClass.visibility == DescriptorVisibilities.PRIVATE) {
|
||||
context.createJvmIrBuilder(this.symbol).run {
|
||||
annotations = filterOutAnnotations(DeprecationResolver.JAVA_DEPRECATED, annotations) +
|
||||
irCall(irSymbols.javaLangDeprecatedConstructorWithDeprecatedFlag)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private class RemapObjectFieldAccesses(val context: JvmBackendContext) : FileLoweringPass, IrElementTransformerVoid() {
|
||||
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
interface A {
|
||||
companion object {
|
||||
@Deprecated("no")
|
||||
const val s = "yes"
|
||||
}
|
||||
}
|
||||
|
||||
class B {
|
||||
companion object {
|
||||
@Deprecated("no")
|
||||
const val s = "yes"
|
||||
}
|
||||
}
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
@kotlin.Metadata
|
||||
public final class A$Companion {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
synthetic final static field $$INSTANCE: A$Companion
|
||||
public deprecated final static @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
private method <init>(): void
|
||||
public synthetic deprecated static @kotlin.Deprecated(message="no") method getS$annotations(): void
|
||||
public final inner class A$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public interface A {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
public final static @org.jetbrains.annotations.NotNull field Companion: A$Companion
|
||||
public final static @kotlin.Deprecated(message="no") @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
public final inner class A$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class B$Companion {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
private method <init>(): void
|
||||
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||
public synthetic deprecated static @kotlin.Deprecated(message="no") method getS$annotations(): void
|
||||
public final inner class B$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class B {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
public final static @org.jetbrains.annotations.NotNull field Companion: B$Companion
|
||||
public deprecated final static @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
public method <init>(): void
|
||||
public final inner class B$Companion
|
||||
}
|
||||
Vendored
+38
@@ -0,0 +1,38 @@
|
||||
@kotlin.Metadata
|
||||
public final class A$Companion {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
synthetic final static field $$INSTANCE: A$Companion
|
||||
public deprecated final static @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
private method <init>(): void
|
||||
public synthetic deprecated static @kotlin.Deprecated(message="no") method getS$annotations(): void
|
||||
public final inner class A$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public interface A {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
public final static @org.jetbrains.annotations.NotNull field Companion: A$Companion
|
||||
public deprecated final static @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
public final inner class A$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class B$Companion {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
private method <init>(): void
|
||||
public synthetic method <init>(p0: kotlin.jvm.internal.DefaultConstructorMarker): void
|
||||
public synthetic deprecated static @kotlin.Deprecated(message="no") method getS$annotations(): void
|
||||
public final inner class B$Companion
|
||||
}
|
||||
|
||||
@kotlin.Metadata
|
||||
public final class B {
|
||||
// source: 'deprecatedConstantPropertyInterfaceCompanion.kt'
|
||||
public final static @org.jetbrains.annotations.NotNull field Companion: B$Companion
|
||||
public deprecated final static @org.jetbrains.annotations.NotNull field s: java.lang.String
|
||||
static method <clinit>(): void
|
||||
public method <init>(): void
|
||||
public final inner class B$Companion
|
||||
}
|
||||
+6
@@ -97,6 +97,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/delegationToJavaInterfaceWithWildcardType.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("deprecatedConstantPropertyInterfaceCompanion.kt")
|
||||
public void testDeprecatedConstantPropertyInterfaceCompanion() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/deprecatedConstantPropertyInterfaceCompanion.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("deserializeLambdaMethod.kt")
|
||||
public void testDeserializeLambdaMethod() throws Exception {
|
||||
|
||||
+6
@@ -97,6 +97,12 @@ public class IrBytecodeListingTestGenerated extends AbstractIrBytecodeListingTes
|
||||
runTest("compiler/testData/codegen/bytecodeListing/delegationToJavaInterfaceWithWildcardType.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("deprecatedConstantPropertyInterfaceCompanion.kt")
|
||||
public void testDeprecatedConstantPropertyInterfaceCompanion() throws Exception {
|
||||
runTest("compiler/testData/codegen/bytecodeListing/deprecatedConstantPropertyInterfaceCompanion.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("deserializeLambdaMethod.kt")
|
||||
public void testDeserializeLambdaMethod() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user