JVM_IR: Remove descriptor usage from IrSourceCompilerForInline
This commit is contained in:
+21
-9
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user