From c38fb27676d5d930d5a85fc80df921f17350934c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Fri, 19 Jul 2019 11:38:52 +0200 Subject: [PATCH] JVM_IR: Run CallableReferenceLowering before LocalDeclarationsLowering --- .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 4 ++-- .../backend/jvm/lower/CallableReferenceLowering.kt | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index ae90e2b7bcb..cde3f211346 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -81,7 +81,7 @@ private val localDeclarationsPhase = makeIrFilePhase( }, name = "JvmLocalDeclarations", description = "Move local declarations to classes", - prerequisite = setOf(sharedVariablesPhase) + prerequisite = setOf(callableReferencePhase, sharedVariablesPhase) ) private val defaultArgumentStubPhase = makeIrFilePhase( @@ -124,6 +124,7 @@ private val jvmFilePhases = enumWhenPhase then singletonReferencesPhase then + callableReferencePhase then localDeclarationsPhase then defaultArgumentStubPhase then @@ -133,7 +134,6 @@ private val jvmFilePhases = singleAbstractMethodPhase then addContinuationPhase then - callableReferencePhase then functionNVarargInvokePhase then innerClassesPhase then diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt index 47934fa5ed6..9d99cbe27b8 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/CallableReferenceLowering.kt @@ -64,6 +64,17 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL override fun lower(irFile: IrFile) { irFile.transformChildrenVoid(object : IrElementTransformerVoidWithContext() { + override fun visitTypeOperator(expression: IrTypeOperatorCall): IrExpression { + if (expression.operator == IrTypeOperator.SAM_CONVERSION) { + val invokable = expression.argument + if (invokable is IrFunctionReference) { + inlineLambdaReferences += invokable + } else if (invokable is IrBlock && invokable.statements.last() is IrFunctionReference) { + inlineLambdaReferences += invokable.statements.last() as IrFunctionReference + } + } + return super.visitTypeOperator(expression) + } override fun visitFunctionAccess(expression: IrFunctionAccessExpression): IrExpression { val callee = expression.symbol.owner @@ -177,6 +188,7 @@ internal class CallableReferenceLowering(val context: JvmBackendContext) : FileL private val functionReferenceClass = buildClass { setSourceRange(irFunctionReference) + visibility = Visibilities.LOCAL origin = JvmLoweredDeclarationOrigin.FUNCTION_REFERENCE_IMPL name = Name.special("") }.apply {