JVM IR: copy corresponding property+annotations for DefaultImpls methods

Instead of using methodSignatureMapper which was an obsolete hack to
make accessor names "getFoo" instead of "<get-foo>".

In particular, this keeps the `@Deprecated` annotation on the
corresponding property, which results in ACC_DEPRECATED in codegen.

 #KT-43326 Fixed
This commit is contained in:
Alexander Udalov
2020-11-13 19:54:30 +01:00
parent 5212ae6bbd
commit a3830b2611
5 changed files with 25 additions and 7 deletions
@@ -35,7 +35,6 @@ import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrFunctionReference import org.jetbrains.kotlin.ir.expressions.IrFunctionReference
import org.jetbrains.kotlin.ir.symbols.* import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.util.SymbolTable
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi2ir.PsiErrorBuilder import org.jetbrains.kotlin.psi2ir.PsiErrorBuilder
@@ -72,7 +71,7 @@ class JvmBackendContext(
val methodSignatureMapper = MethodSignatureMapper(this) val methodSignatureMapper = MethodSignatureMapper(this)
internal val innerClassesSupport = JvmInnerClassesSupport(irFactory) internal val innerClassesSupport = JvmInnerClassesSupport(irFactory)
internal val cachedDeclarations = JvmCachedDeclarations(this, methodSignatureMapper, state.languageVersionSettings) internal val cachedDeclarations = JvmCachedDeclarations(this, state.languageVersionSettings)
override val mapping: Mapping = DefaultMapping() override val mapping: Mapping = DefaultMapping()
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.backend.jvm
import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom import org.jetbrains.kotlin.backend.common.ir.copyParameterDeclarationsFrom
import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor import org.jetbrains.kotlin.backend.common.ir.createImplicitParameterDeclarationWithWrappedDescriptor
import org.jetbrains.kotlin.backend.common.ir.createStaticFunctionWithReceivers import org.jetbrains.kotlin.backend.common.ir.createStaticFunctionWithReceivers
import org.jetbrains.kotlin.backend.jvm.codegen.MethodSignatureMapper
import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface import org.jetbrains.kotlin.backend.jvm.codegen.isJvmInterface
import org.jetbrains.kotlin.backend.jvm.ir.copyCorrespondingPropertyFrom import org.jetbrains.kotlin.backend.jvm.ir.copyCorrespondingPropertyFrom
import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder import org.jetbrains.kotlin.backend.jvm.ir.createJvmIrBuilder
@@ -34,7 +33,6 @@ import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
class JvmCachedDeclarations( class JvmCachedDeclarations(
private val context: JvmBackendContext, private val context: JvmBackendContext,
private val methodSignatureMapper: MethodSignatureMapper,
private val languageVersionSettings: LanguageVersionSettings private val languageVersionSettings: LanguageVersionSettings
) { ) {
private val singletonFieldDeclarations = HashMap<IrSymbolOwner, IrField>() private val singletonFieldDeclarations = HashMap<IrSymbolOwner, IrField>()
@@ -152,9 +150,8 @@ class JvmCachedDeclarations(
return defaultImplsMethods.getOrPut(interfaceFun) { return defaultImplsMethods.getOrPut(interfaceFun) {
val defaultImpls = getDefaultImplsClass(interfaceFun.parentAsClass) val defaultImpls = getDefaultImplsClass(interfaceFun.parentAsClass)
val name = Name.identifier(methodSignatureMapper.mapFunctionName(interfaceFun))
context.irFactory.createStaticFunctionWithReceivers( context.irFactory.createStaticFunctionWithReceivers(
defaultImpls, name, interfaceFun, defaultImpls, interfaceFun.name, interfaceFun,
dispatchReceiverType = parent.defaultType, dispatchReceiverType = parent.defaultType,
// If `interfaceFun` is not a real implementation, then we're generating stubs in a descendant // If `interfaceFun` is not a real implementation, then we're generating stubs in a descendant
// interface's DefaultImpls. For example, // interface's DefaultImpls. For example,
@@ -189,6 +186,7 @@ class JvmCachedDeclarations(
isFakeOverride = false, isFakeOverride = false,
typeParametersFromContext = parent.typeParameters typeParametersFromContext = parent.typeParameters
).also { ).also {
it.copyCorrespondingPropertyFrom(interfaceFun)
if (it.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_FOR_COMPATIBILITY && if (it.origin == JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE_FOR_COMPATIBILITY &&
!it.annotations.hasAnnotation(DeprecationResolver.JAVA_DEPRECATED) !it.annotations.hasAnnotation(DeprecationResolver.JAVA_DEPRECATED)
) { ) {
@@ -319,11 +319,12 @@ fun IrSimpleFunction.copyCorrespondingPropertyFrom(source: IrSimpleFunction) {
val property = source.correspondingPropertySymbol?.owner ?: return val property = source.correspondingPropertySymbol?.owner ?: return
val target = this val target = this
correspondingPropertySymbol = factory.buildProperty() { correspondingPropertySymbol = factory.buildProperty {
name = property.name name = property.name
updateFrom(property) updateFrom(property)
}.apply { }.apply {
parent = target.parent parent = target.parent
annotations = property.annotations
when { when {
source.isGetter -> getter = target source.isGetter -> getter = target
source.isSetter -> setter = target source.isSetter -> setter = target
@@ -51,3 +51,8 @@ var <T> List<T>.textGenExtVar
get() = 1 get() = 1
set(v) {} set(v) {}
interface I {
@Deprecated("")
val <T> T.id: T
get() = this
}
@@ -44,3 +44,18 @@ public final class DeprecatedPropertyKt {
public deprecated final static method setTextExtVar(@org.jetbrains.annotations.NotNull p0: java.lang.Object, p1: int): void public deprecated final static method setTextExtVar(@org.jetbrains.annotations.NotNull p0: java.lang.Object, p1: int): void
public deprecated final static method setTextGenExtVar(@org.jetbrains.annotations.NotNull p0: java.util.List, p1: int): void public deprecated final static method setTextGenExtVar(@org.jetbrains.annotations.NotNull p0: java.util.List, p1: int): void
} }
@kotlin.Metadata
public final class I$DefaultImpls {
// source: 'deprecatedProperty.kt'
public synthetic deprecated static @kotlin.Deprecated method getId$annotations(p0: java.lang.Object): void
public deprecated static method getId(@org.jetbrains.annotations.NotNull p0: I, p1: java.lang.Object): java.lang.Object
public final inner class I$DefaultImpls
}
@kotlin.Metadata
public interface I {
// source: 'deprecatedProperty.kt'
public deprecated abstract method getId(p0: java.lang.Object): java.lang.Object
public final inner class I$DefaultImpls
}