From c0cd9064d72740aaed9133cb1355eb1eadf911fe Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Fri, 27 Nov 2020 11:29:02 +0300 Subject: [PATCH] IR: IrMemberWithContainerSource --- .../kotlin/codegen/inline/InlineCodegen.kt | 4 ++-- .../kotlin/codegen/inline/PsiInlineCodegen.kt | 2 +- .../kotlin/backend/jvm/codegen/IrInlineCodegen.kt | 13 +++---------- .../kotlin/backend/jvm/codegen/irCodegenUtils.kt | 7 ++----- .../kotlin/ir/declarations/IrDeclaration.kt | 5 +++++ .../jetbrains/kotlin/ir/declarations/IrFunction.kt | 3 +-- .../jetbrains/kotlin/ir/declarations/IrProperty.kt | 5 ++--- 7 files changed, 16 insertions(+), 23 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt index 7365e345fa9..c578ef0058d 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/InlineCodegen.kt @@ -272,7 +272,7 @@ abstract class InlineCodegen( abstract fun extractDefaultLambdas(node: MethodNode): List - abstract fun isLoadedFromBytecode(memberDescriptor: CallableMemberDescriptor): Boolean + abstract fun descriptorIsDeserialized(memberDescriptor: CallableMemberDescriptor): Boolean fun generateAndInsertFinallyBlocks( intoNode: MethodNode, @@ -528,7 +528,7 @@ abstract class InlineCodegen( mangleSuspendInlineFunctionAsmMethodIfNeeded(functionDescriptor, jvmSignature.asmMethod) val directMember = getDirectMemberAndCallableFromObject(functionDescriptor) - if (!isBuiltInArrayIntrinsic(functionDescriptor) && !isLoadedFromBytecode(directMember)) { + if (!isBuiltInArrayIntrinsic(functionDescriptor) && !descriptorIsDeserialized(directMember)) { val node = sourceCompiler.doCreateMethodNodeFromSource(functionDescriptor, jvmSignature, callDefault, asmMethod) node.node.preprocessSuspendMarkers(forInline = true, keepFakeContinuation = false) return node diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiInlineCodegen.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiInlineCodegen.kt index d50fd29e24b..1e6e2aaaa28 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiInlineCodegen.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/inline/PsiInlineCodegen.kt @@ -211,6 +211,6 @@ class PsiInlineCodegen( ) } - override fun isLoadedFromBytecode(memberDescriptor: CallableMemberDescriptor): Boolean = + override fun descriptorIsDeserialized(memberDescriptor: CallableMemberDescriptor): Boolean = memberDescriptor is DescriptorWithContainerSource } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt index 405ae417c54..7a3212d9e24 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrInlineCodegen.kt @@ -17,10 +17,7 @@ import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.ir.declarations.* -import org.jetbrains.kotlin.ir.descriptors.IrBasedPropertyDescriptor -import org.jetbrains.kotlin.ir.descriptors.IrBasedSimpleFunctionDescriptor -import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor -import org.jetbrains.kotlin.ir.descriptors.toIrBasedKotlinType +import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.classOrNull @@ -165,12 +162,8 @@ class IrInlineCodegen( ) } - override fun isLoadedFromBytecode(memberDescriptor: CallableMemberDescriptor): Boolean = - when (memberDescriptor) { - is IrBasedSimpleFunctionDescriptor -> memberDescriptor.owner.classId != null - is IrBasedPropertyDescriptor -> memberDescriptor.owner.classId != null - else -> false - } + override fun descriptorIsDeserialized(memberDescriptor: CallableMemberDescriptor): Boolean = + ((memberDescriptor as IrBasedDeclarationDescriptor<*>).owner as IrMemberWithContainerSource).parentClassId != null } class IrExpressionLambdaImpl( diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt index 5cbc6252281..42abe973335 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/irCodegenUtils.kt @@ -394,7 +394,7 @@ fun IrSimpleType.isRawType(): Boolean = hasAnnotation(JvmGeneratorExtensions.RAW_TYPE_ANNOTATION_FQ_NAME) internal fun classFileContainsMethod(function: IrFunction, context: JvmBackendContext, name: String): Boolean? { - val classId = function.classId ?: return null + val classId = function.parentClassId ?: return null val originalDescriptor = context.methodSignatureMapper.mapSignatureWithGeneric(function).asmMethod.descriptor val descriptor = if (function.isSuspend) listOf(*Type.getArgumentTypes(originalDescriptor), Type.getObjectType("kotlin/coroutines/Continuation")) @@ -403,10 +403,7 @@ internal fun classFileContainsMethod(function: IrFunction, context: JvmBackendCo return classFileContainsMethod(classId, context.state, Method(name, descriptor)) } -val IrFunction.classId: ClassId? - get() = (containerSource as? JvmPackagePartSource)?.classId ?: (parent as? IrClass)?.classId - -val IrProperty.classId: ClassId? +val IrMemberWithContainerSource.parentClassId: ClassId? get() = (containerSource as? JvmPackagePartSource)?.classId ?: (parent as? IrClass)?.classId // Translated into IR-based terms from classifierDescriptor?.classId diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt index ae72784598d..83658d9b115 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrDeclaration.kt @@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource interface IrSymbolOwner : IrElement { val symbol: IrSymbol @@ -66,3 +67,7 @@ interface IrDeclarationWithName : IrDeclaration { interface IrOverridableMember : IrDeclarationWithVisibility, IrDeclarationWithName, IrSymbolOwner { val modality: Modality } + +interface IrMemberWithContainerSource : IrDeclarationWithName { + val containerSource: DeserializedContainerSource? +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt index 83790155c5a..d00c6c18dc3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrFunction.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ abstract class IrFunction : IrDeclarationBase(), IrDeclarationWithName, IrDeclarationWithVisibility, IrTypeParametersContainer, IrSymbolOwner, IrDeclarationParent, IrReturnTarget, + IrMemberWithContainerSource, IrMetadataSourceOwner { @ObsoleteDescriptorBasedAPI @@ -49,8 +50,6 @@ abstract class IrFunction : abstract var body: IrBody? - abstract val containerSource: DeserializedContainerSource? - override fun acceptChildren(visitor: IrElementVisitor, data: D) { typeParameters.forEach { it.accept(visitor, data) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index eaaa52f6925..27435508549 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -23,7 +23,8 @@ import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource -abstract class IrProperty : IrDeclarationBase(), IrOverridableMember, IrMetadataSourceOwner, IrAttributeContainer { +abstract class IrProperty : + IrDeclarationBase(), IrOverridableMember, IrMetadataSourceOwner, IrAttributeContainer, IrMemberWithContainerSource { @ObsoleteDescriptorBasedAPI abstract override val descriptor: PropertyDescriptor abstract override val symbol: IrPropertySymbol @@ -40,8 +41,6 @@ abstract class IrProperty : IrDeclarationBase(), IrOverridableMember, IrMetadata abstract var getter: IrSimpleFunction? abstract var setter: IrSimpleFunction? - abstract val containerSource: DeserializedContainerSource? - override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitProperty(this, data)