From 9f3d8130dbad9c4fcf4996c44d0a8f7a69123d2d Mon Sep 17 00:00:00 2001 From: Johan Bay Date: Thu, 20 Oct 2022 10:11:44 +0200 Subject: [PATCH] Remove unnecessary deprecation annotation Private members on private companion objects have proper visibility so there is no need for the @Deprecated annotation. ^KT-54539 Fixed --- .../Annotations/Annotations.txt | 10 ------- .../PrivateConstField/PrivateConstField.txt | 10 ------- .../backend/jvm/JvmCachedDeclarations.kt | 26 +++++++++++-------- .../bytecodeListing/privateCompanionFields.kt | 11 +++++++- .../privateCompanionFields.txt | 22 ++++++++++++++++ .../privateCompanionFields_ir.txt | 22 ++++++++++++++++ 6 files changed, 69 insertions(+), 32 deletions(-) diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.txt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.txt index 62d59addf01..d305e7b135b 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.txt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/Annotations/Annotations.txt @@ -52,16 +52,6 @@ PsiJetFileStubImpl[package=] TYPE_REFERENCE USER_TYPE REFERENCE_EXPRESSION[referencedName=f] - ANNOTATION_ENTRY[hasValueArguments=false, shortName=Deprecated] - ANNOTATION_TARGET[useSiteTarget=FIELD] - CONSTRUCTOR_CALLEE - TYPE_REFERENCE - USER_TYPE - USER_TYPE - USER_TYPE - REFERENCE_EXPRESSION[referencedName=java] - REFERENCE_EXPRESSION[referencedName=lang] - REFERENCE_EXPRESSION[referencedName=Deprecated] TYPE_REFERENCE USER_TYPE USER_TYPE diff --git a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateConstField/PrivateConstField.txt b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateConstField/PrivateConstField.txt index 3751359f238..7f158512f19 100644 --- a/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateConstField/PrivateConstField.txt +++ b/analysis/decompiled/decompiler-to-file-stubs/testData/clsFileStubBuilder/PrivateConstField/PrivateConstField.txt @@ -58,16 +58,6 @@ PsiJetFileStubImpl[package=test] USER_TYPE REFERENCE_EXPRESSION[referencedName=test] REFERENCE_EXPRESSION[referencedName=A] - ANNOTATION_ENTRY[hasValueArguments=false, shortName=Deprecated] - ANNOTATION_TARGET[useSiteTarget=FIELD] - CONSTRUCTOR_CALLEE - TYPE_REFERENCE - USER_TYPE - USER_TYPE - USER_TYPE - REFERENCE_EXPRESSION[referencedName=java] - REFERENCE_EXPRESSION[referencedName=lang] - REFERENCE_EXPRESSION[referencedName=Deprecated] TYPE_REFERENCE USER_TYPE USER_TYPE diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt index b3f88dae703..fbe997dc28a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmCachedDeclarations.kt @@ -79,21 +79,25 @@ class JvmCachedDeclarations( // It is an error to annotate only some of the fields of an interface companion with // @JvmField, so checking the current field only should be enough. val hasJvmField = oldField.hasAnnotation(JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME) - if (oldParent.isCompanion && (!oldParent.parentAsClass.isJvmInterface || hasJvmField)) { - parent = oldParent.parentAsClass - annotations = if (DescriptorVisibilities.isPrivate(oldParent.visibility)) { - context.createJvmIrBuilder(this.symbol).run { - filterOutAnnotations( - DeprecationResolver.JAVA_DEPRECATED, - oldField.annotations - ) + irCall(irSymbols.javaLangDeprecatedConstructorWithDeprecatedFlag) - } - } else oldField.annotations + val shouldMoveFields = oldParent.isCompanion && (!oldParent.parentAsClass.isJvmInterface || hasJvmField) + if (shouldMoveFields) { + parent = oldParent.parentAsClass + val isPrivate = DescriptorVisibilities.isPrivate(oldField.visibility) + val parentIsPrivate = DescriptorVisibilities.isPrivate(oldParent.visibility) + annotations = if (parentIsPrivate && !isPrivate) { + context.createJvmIrBuilder(this.symbol).run { + filterOutAnnotations( + DeprecationResolver.JAVA_DEPRECATED, + oldField.annotations + ) + irCall(irSymbols.javaLangDeprecatedConstructorWithDeprecatedFlag) + } + } else { + oldField.annotations + } } else { parent = oldParent annotations = oldField.annotations } - initializer = oldField.initializer?.patchDeclarationParents(this) oldField.replaceThisByStaticReference(fieldsForObjectInstances, oldParent, oldParent.thisReceiver!!) origin = if (irProperty.parentAsClass.isCompanion) JvmLoweredDeclarationOrigin.COMPANION_PROPERTY_BACKING_FIELD else origin diff --git a/compiler/testData/codegen/bytecodeListing/privateCompanionFields.kt b/compiler/testData/codegen/bytecodeListing/privateCompanionFields.kt index 74e85d224c7..7269d9df499 100644 --- a/compiler/testData/codegen/bytecodeListing/privateCompanionFields.kt +++ b/compiler/testData/codegen/bytecodeListing/privateCompanionFields.kt @@ -16,6 +16,15 @@ class TestClass { } } +class TestClass2 { + + private companion object { + val testPublic: String = "1" + private val testPrivate: String = "2" + const val testPublicConst: String = "3" + } +} + interface TestConst { private companion object { @@ -29,4 +38,4 @@ interface TestJvmField { @JvmField val test3: String = "3" } -} \ No newline at end of file +} diff --git a/compiler/testData/codegen/bytecodeListing/privateCompanionFields.txt b/compiler/testData/codegen/bytecodeListing/privateCompanionFields.txt index 1dcbba75727..e07f939bd10 100644 --- a/compiler/testData/codegen/bytecodeListing/privateCompanionFields.txt +++ b/compiler/testData/codegen/bytecodeListing/privateCompanionFields.txt @@ -19,6 +19,28 @@ public final class TestClass { private final inner class TestClass$Companion } +@kotlin.Metadata +final class TestClass2$Companion { + // source: 'privateCompanionFields.kt' + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void + public final @org.jetbrains.annotations.NotNull method getTestPublic(): java.lang.String + private final inner class TestClass2$Companion +} + +@kotlin.Metadata +public final class TestClass2 { + // source: 'privateCompanionFields.kt' + private final static @org.jetbrains.annotations.NotNull field Companion: TestClass2$Companion + private deprecated final static @java.lang.Deprecated field testPrivate: java.lang.String + private deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field testPublic: java.lang.String + public deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field testPublicConst: java.lang.String + static method (): void + public method (): void + public synthetic final static method access$getTestPublic$cp(): java.lang.String + private final inner class TestClass2$Companion +} + @kotlin.Metadata final class TestConst$Companion { // source: 'privateCompanionFields.kt' diff --git a/compiler/testData/codegen/bytecodeListing/privateCompanionFields_ir.txt b/compiler/testData/codegen/bytecodeListing/privateCompanionFields_ir.txt index 3655a8501c8..96921dc8507 100644 --- a/compiler/testData/codegen/bytecodeListing/privateCompanionFields_ir.txt +++ b/compiler/testData/codegen/bytecodeListing/privateCompanionFields_ir.txt @@ -19,6 +19,28 @@ public final class TestClass { private final inner class TestClass$Companion } +@kotlin.Metadata +final class TestClass2$Companion { + // source: 'privateCompanionFields.kt' + private method (): void + public synthetic method (p0: kotlin.jvm.internal.DefaultConstructorMarker): void + public final @org.jetbrains.annotations.NotNull method getTestPublic(): java.lang.String + private final inner class TestClass2$Companion +} + +@kotlin.Metadata +public final class TestClass2 { + // source: 'privateCompanionFields.kt' + private final static @org.jetbrains.annotations.NotNull field Companion: TestClass2$Companion + private final static @org.jetbrains.annotations.NotNull field testPrivate: java.lang.String + private final static @org.jetbrains.annotations.NotNull field testPublic: java.lang.String + public deprecated final static @java.lang.Deprecated @org.jetbrains.annotations.NotNull field testPublicConst: java.lang.String + static method (): void + public method (): void + public synthetic final static method access$getTestPublic$cp(): java.lang.String + private final inner class TestClass2$Companion +} + @kotlin.Metadata final class TestConst$Companion { // source: 'privateCompanionFields.kt'