JVM IR: generate ACC_SYNTHETIC for deprecated-hidden declarations correctly

Extract the logic that computes ACC_SYNTHETIC flag for deprecated
declarations, and use `DeprecationResolver` as the old backend does in
`DescriptorAsmUtil.getCommonCallableFlags`. Creating IR-based
descriptors for each function to pass it there is a bit costly though,
so as a small optimization, use `allOverridden` to check if anything in
the method hierarchy is deprecated.

Also optimize `allOverridden` for the case of linear inheritance which
is far more common.

 #KT-43199 Fixed
This commit is contained in:
Alexander Udalov
2020-11-06 17:26:03 +01:00
committed by Alexander Udalov
parent d9efc2d922
commit 0e91d3fcb0
8 changed files with 110 additions and 45 deletions
@@ -0,0 +1,16 @@
@Deprecated("")
@Suppress("DEPRECATED_SINCE_KOTLIN_OUTSIDE_KOTLIN_SUBPACKAGE")
@DeprecatedSinceKotlin(hiddenSince = "1.0")
fun hidden() {}
open class Base {
@Deprecated("", level = DeprecationLevel.HIDDEN)
open fun f() {}
}
class Derived : Base {
@Deprecated("", level = DeprecationLevel.HIDDEN)
constructor()
override fun f() {}
}
@@ -0,0 +1,19 @@
@kotlin.Metadata
public class Base {
// source: 'hidden.kt'
public method <init>(): void
public synthetic deprecated @kotlin.Deprecated method f(): void
}
@kotlin.Metadata
public final class Derived {
// source: 'hidden.kt'
public synthetic deprecated @kotlin.Deprecated method <init>(): void
public synthetic method f(): void
}
@kotlin.Metadata
public final class HiddenKt {
// source: 'hidden.kt'
public synthetic deprecated final static @kotlin.Deprecated @kotlin.DeprecatedSinceKotlin method hidden(): void
}