From 830923e1117938b9bf2d72bb236439df7d7cdce6 Mon Sep 17 00:00:00 2001 From: Svyatoslav Scherbina Date: Sat, 9 Jun 2018 14:24:12 +0300 Subject: [PATCH] backend.common: backport LocalDeclarationsLowering from Native --- .../common/lower/LocalDeclarationsLowering.kt | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt index d756e85db24..2337369a7ec 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LocalDeclarationsLowering.kt @@ -152,6 +152,18 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid "LocalClassContext for $descriptor" } + private class LocalClassMemberContext(val member: IrFunction, val classContext: LocalClassContext) : LocalContext() { + override fun irGet(startOffset: Int, endOffset: Int, descriptor: ValueDescriptor): IrExpression? { + val field = classContext.capturedValueToField[descriptor] ?: return null + + return IrGetFieldImpl( + startOffset, endOffset, field.symbol, + receiver = IrGetValueImpl(startOffset, endOffset, member.dispatchReceiverParameter!!.symbol) + ) + } + + } + private inner class LocalDeclarationsTransformer(val memberDeclaration: IrDeclaration) { val localFunctions: MutableMap = LinkedHashMap() val localClasses: MutableMap = LinkedHashMap() @@ -195,6 +207,7 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid } localClasses.values.mapTo(this) { + it.declaration.parent = memberDeclaration.parent it.declaration } @@ -217,7 +230,14 @@ class LocalDeclarationsLowering(val context: BackendContext, val localNameProvid // Replace local function definition with an empty composite. return IrCompositeImpl(declaration.startOffset, declaration.endOffset, context.builtIns.unitType) } else { - return super.visitFunction(declaration) + if (localContext is LocalClassContext && declaration.parent == localContext.declaration) { + return declaration.apply { + val classMemberLocalContext = LocalClassMemberContext(declaration, localContext) + transformChildrenVoid(FunctionBodiesRewriter(classMemberLocalContext)) + } + } else { + return super.visitFunction(declaration) + } } }