JVM_IR: Remove descriptor usage from IrSourceCompilerForInline

This commit is contained in:
Georgy Bronnikov
2020-09-07 16:36:14 +03:00
parent 0a66dbf2b5
commit 92b03e7ede
2 changed files with 22 additions and 10 deletions
@@ -19,22 +19,23 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticUtils
import org.jetbrains.kotlin.incremental.components.LocationInfo import org.jetbrains.kotlin.incremental.components.LocationInfo
import org.jetbrains.kotlin.incremental.components.LookupLocation import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.incremental.components.Position import org.jetbrains.kotlin.incremental.components.Position
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.descriptors.IrBasedSimpleFunctionDescriptor
import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.descriptors.toIrBasedDescriptor
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression import org.jetbrains.kotlin.ir.expressions.IrFunctionAccessExpression
import org.jetbrains.kotlin.ir.util.isSuspend 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.ir.util.parentAsClass
import org.jetbrains.kotlin.load.kotlin.*
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.doNotAnalyze 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.diagnostics.ErrorsJvm.SUSPENSION_POINT_INSIDE_MONITOR
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.org.objectweb.asm.* import org.jetbrains.org.objectweb.asm.*
import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter import org.jetbrains.org.objectweb.asm.commons.InstructionAdapter
import org.jetbrains.org.objectweb.asm.commons.Method import org.jetbrains.org.objectweb.asm.commons.Method
import org.jetbrains.org.objectweb.asm.tree.MethodNode import org.jetbrains.org.objectweb.asm.tree.MethodNode
import java.io.File
class IrSourceCompilerForInline( class IrSourceCompilerForInline(
override val state: GenerationState, override val state: GenerationState,
@@ -83,7 +84,7 @@ class IrSourceCompilerForInline(
root.classCodegen.type.internalName, root.classCodegen.type.internalName,
root.signature.asmMethod.name, root.signature.asmMethod.name,
root.signature.asmMethod.descriptor, root.signature.asmMethod.descriptor,
root.irFunction.descriptor.isInlineOrInsideInline(), root.irFunction.isInlineOrInsideInline(),
root.irFunction.isSuspend, root.irFunction.isSuspend,
findElement()?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0 findElement()?.let { CodegenUtil.getLineNumberForElement(it, false) } ?: 0
) )
@@ -120,8 +121,11 @@ class IrSourceCompilerForInline(
} }
override fun isCallInsideSameModuleAsDeclared(functionDescriptor: FunctionDescriptor): Boolean { override fun isCallInsideSameModuleAsDeclared(functionDescriptor: FunctionDescriptor): Boolean {
// TODO port to IR structures require(functionDescriptor is IrBasedSimpleFunctionDescriptor) {
return DescriptorUtils.areInSameModule(DescriptorUtils.getDirectMember(functionDescriptor), codegen.irFunction.descriptor) "expected an IrBasedSimpleFunctionDescriptor, got $functionDescriptor"
}
val function = functionDescriptor.owner
return function.module == codegen.irFunction.module
} }
override fun isFinallyMarkerRequired(): Boolean { override fun isFinallyMarkerRequired(): Boolean {
@@ -132,7 +136,7 @@ class IrSourceCompilerForInline(
get() = compilationContextFunctionDescriptor get() = compilationContextFunctionDescriptor
override val compilationContextFunctionDescriptor: FunctionDescriptor override val compilationContextFunctionDescriptor: FunctionDescriptor
get() = generateSequence(codegen) { it.inlinedInto }.last().irFunction.descriptor get() = generateSequence(codegen) { it.inlinedInto }.last().irFunction.toIrBasedDescriptor()
override fun getContextLabels(): Set<String> { override fun getContextLabels(): Set<String> {
val name = codegen.irFunction.name.asString() val name = codegen.irFunction.name.asString()
@@ -148,3 +152,11 @@ class IrSourceCompilerForInline(
private fun findElement() = callElement.psiElement as? KtElement 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()
}
@@ -573,7 +573,7 @@ open class IrBasedClassDescriptor(owner: IrClass) : ClassDescriptor, IrBasedDecl
override fun getStaticScope() = MemberScope.Empty override fun getStaticScope() = MemberScope.Empty
override fun getSource() = SourceElement.NO_SOURCE override fun getSource() = owner.source
override fun getConstructors() = override fun getConstructors() =
owner.declarations.filterIsInstance<IrConstructor>().filter { !it.origin.isSynthetic }.map { it.toIrBasedDescriptor() }.toList() owner.declarations.filterIsInstance<IrConstructor>().filter { !it.origin.isSynthetic }.map { it.toIrBasedDescriptor() }.toList()