diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt index 978e7a41c36..ca174041a35 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/CheckIrElementVisitor.kt @@ -19,8 +19,7 @@ package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.declarations.IrClass -import org.jetbrains.kotlin.ir.declarations.IrFunction +import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.symbols.IrSymbol import org.jetbrains.kotlin.ir.types.IrDynamicType diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrValidator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrValidator.kt index 7ad695c1632..1d865488167 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrValidator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/IrValidator.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.common import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.render +import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -85,3 +86,32 @@ class IrValidator(val context: CommonBackendContext, val config: IrValidatorConf element.acceptChildrenVoid(this) } } + +fun IrModuleFragment.checkDeclarationParents() { + this.accept(CheckDeclarationParentsVisitor, null) +} + +object CheckDeclarationParentsVisitor : IrElementVisitor { + + override fun visitElement(element: IrElement, data: IrDeclarationParent?) { + element.acceptChildren(this, element as? IrDeclarationParent ?: data) + } + + override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent?) { + checkParent(declaration, data) + super.visitDeclaration(declaration, data) + } + + private fun checkParent(declaration: IrDeclaration, expectedParent: IrDeclarationParent?) { + val parent = try { + declaration.parent + } catch (e: Throwable) { + error("$declaration for ${declaration.descriptor} has no parent") + } + + if (parent != expectedParent) { + error("$declaration for ${declaration.descriptor} has unexpected parent $parent") + } + } +} + diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt index 63d1a3a62af..77edbed086d 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/ir/IrUtils.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.backend.common.ir import org.jetbrains.kotlin.backend.common.DumpIrTreeWithDescriptorsVisitor +import org.jetbrains.kotlin.backend.common.deepCopyWithVariables import org.jetbrains.kotlin.backend.common.descriptors.WrappedTypeParameterDescriptor import org.jetbrains.kotlin.backend.common.descriptors.WrappedValueParameterDescriptor import org.jetbrains.kotlin.descriptors.* @@ -44,6 +45,7 @@ import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection import org.jetbrains.kotlin.ir.util.DumpIrTreeVisitor import org.jetbrains.kotlin.ir.util.defaultType +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name import java.io.StringWriter @@ -164,13 +166,15 @@ fun IrValueParameter.copyTo( ): IrValueParameter { val descriptor = WrappedValueParameterDescriptor(symbol.descriptor.annotations, symbol.descriptor.source) val symbol = IrValueParameterSymbolImpl(descriptor) + val defaultValueCopy = defaultValue?.deepCopyWithVariables() + defaultValueCopy?.patchDeclarationParents(irFunction) return IrValueParameterImpl( startOffset, endOffset, origin, symbol, name, shift + index, type, varargElementType, isCrossinline, isNoinline ).also { descriptor.bind(it) it.parent = irFunction - it.defaultValue = defaultValue + it.defaultValue = defaultValueCopy } } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt index 71cb20ad203..194d4b549dd 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/DefaultArgumentStubGenerator.kt @@ -31,6 +31,7 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.* import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols import org.jetbrains.kotlin.ir.util.defaultType +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -106,6 +107,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo }, irInt(0)) val expressionBody = valueParameter.defaultValue!! + expressionBody.patchDeclarationParents(newIrFunction) expressionBody.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitGetValue(expression: IrGetValue): IrExpression { @@ -126,6 +128,7 @@ open class DefaultArgumentStubGenerator constructor(val context: CommonBackendCo } val temporaryVariable = irTemporary(argument, nameHint = parameter.name.asString()) + temporaryVariable.parent = newIrFunction params.add(temporaryVariable) variables[valueParameter] = temporaryVariable diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt index 7a151f080ac..d86897bfdff 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InitializersLowering.kt @@ -19,12 +19,16 @@ import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl -import org.jetbrains.kotlin.ir.expressions.* +import org.jetbrains.kotlin.ir.expressions.IrBlock +import org.jetbrains.kotlin.ir.expressions.IrExpression +import org.jetbrains.kotlin.ir.expressions.IrInstanceInitializerCall +import org.jetbrains.kotlin.ir.expressions.IrStatementOriginImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockBodyImpl import org.jetbrains.kotlin.ir.expressions.impl.IrBlockImpl import org.jetbrains.kotlin.ir.expressions.impl.IrGetValueImpl import org.jetbrains.kotlin.ir.expressions.impl.IrSetFieldImpl import org.jetbrains.kotlin.ir.util.deepCopyWithSymbols +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.name.Name @@ -55,6 +59,7 @@ class InitializersLowering( val staticInitializerStatements = handleStatics(irClass) if (clinitNeeded && staticInitializerStatements.isNotEmpty()) createStaticInitializationMethod(irClass, staticInitializerStatements) + irClass.patchDeclarationParents(irClass.parent) } fun handleNonStatics(irClass: IrClass) = diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt index b0ac5ec76df..254b6d7dac7 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InlineClassDeclarationLowering.kt @@ -75,6 +75,7 @@ class InlineClassLowering(val context: BackendContext) { typeHint = irClass.defaultType.toKotlinType(), irType = irClass.defaultType ) + thisVar.parent = result } } @@ -88,6 +89,13 @@ class InlineClassLowering(val context: BackendContext) { return expression } + override fun visitDeclaration(declaration: IrDeclaration): IrStatement { + declaration.transformChildrenVoid(this) + if (declaration.parent == irConstructor) + declaration.parent = result + return declaration + } + override fun visitReturn(expression: IrReturn): IrExpression { expression.transformChildrenVoid() if (expression.returnTargetSymbol == irConstructor.symbol) { @@ -121,9 +129,7 @@ class InlineClassLowering(val context: BackendContext) { function.body!!.transformChildrenVoid(object : IrElementTransformerVoid() { override fun visitDeclaration(declaration: IrDeclaration): IrStatement { declaration.transformChildrenVoid(this) - - // TODO: Variable parents might not be initialized - if (declaration !is IrVariable && declaration.parent == function) + if (declaration.parent == function) declaration.parent = staticMethod return declaration diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt index e65489047fb..bec7c759863 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InnerClassesLowering.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.ir.symbols.IrValueSymbol import org.jetbrains.kotlin.ir.types.classifierOrNull import org.jetbrains.kotlin.ir.util.defaultType import org.jetbrains.kotlin.ir.util.dump +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid @@ -101,7 +102,7 @@ class InnerClassesLowering(val context: BackendContext) : ClassLoweringPass { delegatingConstructorCall.startOffset, delegatingConstructorCall.endOffset, outerThisValueParameter ) } - + blockBody.patchDeclarationParents(loweredConstructor) loweredConstructor.body = blockBody return loweredConstructor } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt index bdb985d237d..df1720b2645 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/LateinitLowering.kt @@ -111,6 +111,7 @@ class LateinitLowering( val resultVar = scope.createTemporaryVariable( irGetField(getter.dispatchReceiverParameter?.let { irGet(it) }, backingField) ) + resultVar.parent = getter body.statements.add(resultVar) val throwIfNull = irIfThenElse( context.irBuiltIns.nothingType, 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 0602f1ffc2c..f856a28f0fe 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 @@ -29,8 +29,8 @@ import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrValueParameterSymbolImpl import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat -import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid @@ -215,7 +215,11 @@ open class LocalDeclarationsLowering( rewriteDeclarations() - return collectRewrittenDeclarations() + val rewrittenDeclarations = collectRewrittenDeclarations() + rewrittenDeclarations.forEach { + it.patchDeclarationParents(memberDeclaration.parent) + } + return rewrittenDeclarations } private fun collectRewrittenDeclarations(): ArrayList = diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt index 6e2d405f838..9f012cabe25 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/compiler.kt @@ -105,6 +105,7 @@ private fun JsIrBackendContext.lower(moduleFragment: IrModuleFragment, dependenc val validateIr = { val visitor = IrValidator(this, validatorConfig) moduleFragment.acceptVoid(visitor) + moduleFragment.checkDeclarationParents() } validateIr() ThrowableSuccessorsLowering(this).lower(moduleFragment) @@ -144,7 +145,8 @@ private fun JsIrBackendContext.lower(moduleFragment: IrModuleFragment, dependenc validateIr() AutoboxingTransformer(this).lower(moduleFragment) BlockDecomposerLowering(this).runOnFilesPostfix(moduleFragment) - + // TODO: Fix BlockDecomposerLowering parents + moduleFragment.patchDeclarationParents() ClassReferenceLowering(this).lower(moduleFragment) PrimitiveCompanionLowering(this).lower(moduleFragment) ConstLowering(this).lower(moduleFragment) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt index 22030fb66c6..7933b3552d2 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/AutoboxingTransformer.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.types.makeNotNull import org.jetbrains.kotlin.ir.util.getInlinedClass import org.jetbrains.kotlin.ir.util.isInlined import org.jetbrains.kotlin.ir.util.isNullable +import org.jetbrains.kotlin.ir.util.patchDeclarationParents // Copied and adapted from Kotlin/Native @@ -24,6 +25,9 @@ import org.jetbrains.kotlin.ir.util.isNullable class AutoboxingTransformer(val context: JsIrBackendContext) : AbstractValueUsageTransformer(context.irBuiltIns), FileLoweringPass { override fun lower(irFile: IrFile) { irFile.transformChildrenVoid() + + // TODO: Track & insert parents for temporary variables + irFile.patchDeclarationParents() } override fun IrExpression.useAs(type: IrType): IrExpression { @@ -101,6 +105,7 @@ class AutoboxingTransformer(val context: JsIrBackendContext) : AbstractValueUsag if (!actualType.isNullable()) return call(arg) return JsIrBuilder.run { + // TODO: Set parent of local variables val tmp = buildVar(actualType, parent = null, initializer = arg) val nullCheck = buildIfElse( type = resultType, diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt index 92b07a9b3c4..fe80b5b9e40 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/BlockDecomposerLowering.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.* import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.util.transformDeclarationsFlat import org.jetbrains.kotlin.ir.util.transformFlat import org.jetbrains.kotlin.ir.visitors.IrElementTransformer @@ -47,6 +48,7 @@ class BlockDecomposerLowering(context: JsIrBackendContext) : DeclarationContaine } private fun IrExpressionBody.toBlockBody(containingFunction: IrFunction): IrBlockBody { + expression.patchDeclarationParents(containingFunction) val returnStatement = JsIrBuilder.buildReturn(containingFunction.symbol, expression, nothingType) return IrBlockBodyImpl(expression.startOffset, expression.endOffset).apply { statements += returnStatement @@ -63,7 +65,7 @@ class BlockDecomposerLowering(context: JsIrBackendContext) : DeclarationContaine ) val newBody = toBlockBody(initFunction) - + newBody.patchDeclarationParents(initFunction) initFunction.body = newBody lower(initFunction) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt index 731d7d82a79..7c052e04709 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/EnumClassLowering.kt @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.makeNullable import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid +import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import java.util.* @@ -332,6 +333,9 @@ class EnumClassTransformer(val context: JsIrBackendContext, private val irClass: for ((entry, instanceVar) in enumEntries.zip(entryInstances)) { +irSetVar(instanceVar.symbol, entry.initializerExpression!!) } + }.also { + // entry.initializerExpression can have local declarations + it.acceptVoid(PatchDeclarationParentsVisitor(irClass)) } private fun createEntryInstancesInitializedVar(): IrVariable { @@ -429,6 +433,8 @@ class EnumClassTransformer(val context: JsIrBackendContext, private val irClass: copyParameterDeclarationsFrom(enumConstructor) body = enumConstructor.body loweredEnumConstructors[enumConstructor.symbol] = this + + this.acceptVoid(PatchDeclarationParentsVisitor(enumClass)) } } diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt index 9118eeed440..84293a9f0e6 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/MultipleCatchesLowering.kt @@ -11,9 +11,9 @@ import org.jetbrains.kotlin.backend.common.utils.isSubtypeOf import org.jetbrains.kotlin.ir.IrStatement import org.jetbrains.kotlin.ir.backend.js.JsIrBackendContext import org.jetbrains.kotlin.ir.backend.js.ir.JsIrBuilder +import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent import org.jetbrains.kotlin.ir.declarations.IrFile -import org.jetbrains.kotlin.ir.declarations.IrFunction import org.jetbrains.kotlin.ir.expressions.* import org.jetbrains.kotlin.ir.expressions.impl.IrBranchImpl import org.jetbrains.kotlin.ir.expressions.impl.IrCatchImpl @@ -58,8 +58,9 @@ class MultipleCatchesLowering(val context: JsIrBackendContext) : FileLoweringPas override fun lower(irFile: IrFile) { irFile.transformChildren(object : IrElementTransformer { - override fun visitFunction(declaration: IrFunction, data: IrDeclarationParent): IrStatement { - return super.visitFunction(declaration, declaration) + override fun visitDeclaration(declaration: IrDeclaration, data: IrDeclarationParent): IrStatement { + val parent = (declaration as? IrDeclarationParent) ?: data + return super.visitDeclaration(declaration, parent) } override fun visitTry(aTry: IrTry, data: IrDeclarationParent): IrExpression { diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendFunctionsLowering.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendFunctionsLowering.kt index 7b6429c0453..8aa39543fcb 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendFunctionsLowering.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/lower/coroutines/SuspendFunctionsLowering.kt @@ -258,8 +258,9 @@ internal class SuspendFunctionsLowering(val context: JsIrBackendContext): FileLo }) } } - - return coroutine.coroutineClass + val coroutineClass = coroutine.coroutineClass + coroutineClass.patchDeclarationParents(coroutineClass.parent) + return coroutineClass } private class BuiltCoroutine(