From 92b03e7ede8b9711d55af367c13408a0a3d4ca1f Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Mon, 7 Sep 2020 16:36:14 +0300 Subject: [PATCH] JVM_IR: Remove descriptor usage from IrSourceCompilerForInline --- .../jvm/codegen/IrSourceCompilerForInline.kt | 30 +++++++++++++------ .../ir/descriptors/IrBasedDescriptors.kt | 2 +- 2 files changed, 22 insertions(+), 10 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt index e2ad1c8ade2..83767d27714 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/codegen/IrSourceCompilerForInline.kt @@ -19,22 +19,23 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.Position -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrDeclaration -import org.jetbrains.kotlin.ir.declarations.IrFunction -import org.jetbrains.kotlin.ir.declarations.IrPackageFragment +import org.jetbrains.kotlin.ir.declarations.* +import org.jetbrains.kotlin.ir.descriptors.IrBasedSimpleFunctionDescriptor +import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.util.isSuspend +import org.jetbrains.kotlin.ir.util.module import org.jetbrains.kotlin.ir.util.parentAsClass +import org.jetbrains.kotlin.load.kotlin.* import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.doNotAnalyze -import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.diagnostics.ErrorsJvm.SUSPENSION_POINT_INSIDE_MONITOR import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.tree.MethodNode +import java.io.File class IrSourceCompilerForInline( override val state: GenerationState, @@ -83,7 +84,7 @@ class IrSourceCompilerForInline( root.classCodegen.type.internalName, root.signature.asmMethod.name, root.signature.asmMethod.descriptor, - root.irFunction.descriptor.isInlineOrInsideInline(), + root.irFunction.isInlineOrInsideInline(), root.irFunction.isSuspend, findElement()?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0 ) @@ -120,8 +121,11 @@ class IrSourceCompilerForInline( } override fun isCallInsideSameModuleAsDeclared(functionDescriptor: FunctionDescriptor): Boolean { - // TODO port to IR structures - return DescriptorUtils.areInSameModule(DescriptorUtils.getDirectMember(functionDescriptor), codegen.irFunction.descriptor) + require(functionDescriptor is IrBasedSimpleFunctionDescriptor) { + "expected an IrBasedSimpleFunctionDescriptor, got $functionDescriptor" + } + val function = functionDescriptor.owner + return function.module == codegen.irFunction.module } override fun isFinallyMarkerRequired(): Boolean { @@ -132,7 +136,7 @@ class IrSourceCompilerForInline( get() = compilationContextFunctionDescriptor override val compilationContextFunctionDescriptor: FunctionDescriptor - get() = generateSequence(codegen) { it.inlinedInto }.last().irFunction.descriptor + get() = generateSequence(codegen) { it.inlinedInto }.last().irFunction.toIrBasedDescriptor() override fun getContextLabels(): Set { val name = codegen.irFunction.name.asString() @@ -148,3 +152,11 @@ class IrSourceCompilerForInline( private fun findElement() = callElement.psiElement as? KtElement } + +private tailrec fun IrDeclaration.isInlineOrInsideInline(): Boolean { + val original = (this as? IrAttributeContainer)?.attributeOwnerId as? IrDeclaration ?: this + if (original is IrSimpleFunction && original.isInline) return true + val parent = original.parent + if (parent !is IrDeclaration) return false + return parent.isInlineOrInsideInline() +} diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt index 5b84d58749d..1c88ff33f3f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrBasedDescriptors.kt @@ -573,7 +573,7 @@ open class IrBasedClassDescriptor(owner: IrClass) : ClassDescriptor, IrBasedDecl override fun getStaticScope() = MemberScope.Empty - override fun getSource() = SourceElement.NO_SOURCE + override fun getSource() = owner.source override fun getConstructors() = owner.declarations.filterIsInstance().filter { !it.origin.isSynthetic }.map { it.toIrBasedDescriptor() }.toList()