@@ -367,6 +367,27 @@ open class KotlinFileExtractor(
367367 tw.writeHasLocation(stmtId, locId)
368368 }
369369
370+ fun extractObinitFunction (c : IrClass , parentId : Label <out DbClassorinterface >) {
371+ // add method:
372+ val obinitLabel = getObinitLabel(c)
373+ val obinitId = tw.getLabelFor<DbMethod >(obinitLabel)
374+ val returnType = useType(pluginContext.irBuiltIns.unitType)
375+ tw.writeMethods(obinitId, " <obinit>" , " <obinit>()" , returnType.javaResult.id, parentId, obinitId)
376+ tw.writeMethodsKotlinType(obinitId, returnType.kotlinResult.id)
377+
378+ val locId = tw.getLocation(c)
379+ tw.writeHasLocation(obinitId, locId)
380+
381+ addModifiers(obinitId, " private" )
382+
383+ // add body:
384+ val blockId = tw.getFreshIdLabel<DbBlock >()
385+ tw.writeStmts_block(blockId, obinitId, 0 , obinitId)
386+ tw.writeHasLocation(blockId, locId)
387+
388+ extractDeclInitializers(c.declarations, false ) { Pair (blockId, obinitId) }
389+ }
390+
370391 fun extractClassSource (c : IrClass , extractDeclarations : Boolean , extractStaticInitializer : Boolean , extractPrivateMembers : Boolean , extractFunctionBodies : Boolean ): Label <out DbClassorinterface > {
371392 with (" class source" , c) {
372393 DeclarationStackAdjuster (c).use {
@@ -421,6 +442,9 @@ open class KotlinFileExtractor(
421442 addModifiers(instance.id, " public" , " static" , " final" )
422443 tw.writeClass_object(id.cast<DbClass >(), instance.id)
423444 }
445+ if (needsObinitFunction(c)) {
446+ extractObinitFunction(c, id)
447+ }
424448
425449 extractClassModifiers(c, id)
426450 extractClassSupertypes(c, id, inReceiverContext = true ) // inReceiverContext = true is specified to force extraction of member prototypes of base types
@@ -2101,6 +2125,22 @@ open class KotlinFileExtractor(
21012125 enclosingStmt : Label <out DbStmt >
21022126 ): Label <DbNewexpr > = extractNewExpr(useFunction<DbConstructor >(calledConstructor, constructorTypeArgs), constructedType, locId, parent, idx, callable, enclosingStmt)
21032127
2128+ private fun needsObinitFunction (c : IrClass ) = c.primaryConstructor == null && c.constructors.count() > 1
2129+
2130+ private fun getObinitLabel (c : IrClass ) = getFunctionLabel(
2131+ c,
2132+ null ,
2133+ " <obinit>" ,
2134+ listOf (),
2135+ pluginContext.irBuiltIns.unitType,
2136+ null ,
2137+ functionTypeParameters = listOf (),
2138+ classTypeArgsIncludingOuterClasses = listOf (),
2139+ overridesCollectionsMethod = false ,
2140+ javaSignature = null ,
2141+ addParameterWildcardsByDefault = false
2142+ )
2143+
21042144 private fun extractConstructorCall (
21052145 e : IrFunctionAccessExpression ,
21062146 parent : Label <out DbExprparent >,
@@ -2430,13 +2470,29 @@ open class KotlinFileExtractor(
24302470 loopIdMap.remove(e)
24312471 }
24322472 is IrInstanceInitializerCall -> {
2433- val stmtParent = parent.stmt(e, callable)
24342473 val irConstructor = declarationStack.peek() as ? IrConstructor
24352474 if (irConstructor == null ) {
24362475 logger.errorElement(" IrInstanceInitializerCall outside constructor" , e)
24372476 return
24382477 }
2439- extractInstanceInitializerBlock(stmtParent, irConstructor)
2478+ if (needsObinitFunction(irConstructor.parentAsClass)) {
2479+ val exprParent = parent.expr(e, callable)
2480+ val id = tw.getFreshIdLabel<DbMethodaccess >()
2481+ val type = useType(pluginContext.irBuiltIns.unitType)
2482+ val locId = tw.getLocation(e)
2483+ val methodLabel = getObinitLabel(irConstructor.parentAsClass)
2484+ val methodId = tw.getLabelFor<DbMethod >(methodLabel)
2485+ tw.writeExprs_methodaccess(id, type.javaResult.id, exprParent.parent, exprParent.idx)
2486+ tw.writeExprsKotlinType(id, type.kotlinResult.id)
2487+ tw.writeHasLocation(id, locId)
2488+ tw.writeCallableEnclosingExpr(id, callable)
2489+ tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
2490+ tw.writeCallableBinding(id, methodId)
2491+ }
2492+ else {
2493+ val stmtParent = parent.stmt(e, callable)
2494+ extractInstanceInitializerBlock(stmtParent, irConstructor)
2495+ }
24402496 }
24412497 is IrConstructorCall -> {
24422498 val exprParent = parent.expr(e, callable)
0 commit comments