@@ -367,6 +367,27 @@ open class KotlinFileExtractor(
367
367
tw.writeHasLocation(stmtId, locId)
368
368
}
369
369
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
+
370
391
fun extractClassSource (c : IrClass , extractDeclarations : Boolean , extractStaticInitializer : Boolean , extractPrivateMembers : Boolean , extractFunctionBodies : Boolean ): Label <out DbClassorinterface > {
371
392
with (" class source" , c) {
372
393
DeclarationStackAdjuster (c).use {
@@ -421,6 +442,9 @@ open class KotlinFileExtractor(
421
442
addModifiers(instance.id, " public" , " static" , " final" )
422
443
tw.writeClass_object(id.cast<DbClass >(), instance.id)
423
444
}
445
+ if (needsObinitFunction(c)) {
446
+ extractObinitFunction(c, id)
447
+ }
424
448
425
449
extractClassModifiers(c, id)
426
450
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(
2101
2125
enclosingStmt : Label <out DbStmt >
2102
2126
): Label <DbNewexpr > = extractNewExpr(useFunction<DbConstructor >(calledConstructor, constructorTypeArgs), constructedType, locId, parent, idx, callable, enclosingStmt)
2103
2127
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
+
2104
2144
private fun extractConstructorCall (
2105
2145
e : IrFunctionAccessExpression ,
2106
2146
parent : Label <out DbExprparent >,
@@ -2430,13 +2470,29 @@ open class KotlinFileExtractor(
2430
2470
loopIdMap.remove(e)
2431
2471
}
2432
2472
is IrInstanceInitializerCall -> {
2433
- val stmtParent = parent.stmt(e, callable)
2434
2473
val irConstructor = declarationStack.peek() as ? IrConstructor
2435
2474
if (irConstructor == null ) {
2436
2475
logger.errorElement(" IrInstanceInitializerCall outside constructor" , e)
2437
2476
return
2438
2477
}
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
+ }
2440
2496
}
2441
2497
is IrConstructorCall -> {
2442
2498
val exprParent = parent.expr(e, callable)
0 commit comments