@@ -371,6 +371,27 @@ open class KotlinFileExtractor(
371
371
tw.writeHasLocation(stmtId, locId)
372
372
}
373
373
374
+ fun extractObinitFunction (c : IrClass , parentId : Label <out DbClassorinterface >) {
375
+ // add method:
376
+ val obinitLabel = getObinitLabel(c)
377
+ val obinitId = tw.getLabelFor<DbMethod >(obinitLabel)
378
+ val returnType = useType(pluginContext.irBuiltIns.unitType, TypeContext .RETURN )
379
+ tw.writeMethods(obinitId, " <obinit>" , " <obinit>()" , returnType.javaResult.id, parentId, obinitId)
380
+ tw.writeMethodsKotlinType(obinitId, returnType.kotlinResult.id)
381
+
382
+ val locId = tw.getLocation(c)
383
+ tw.writeHasLocation(obinitId, locId)
384
+
385
+ addModifiers(obinitId, " private" )
386
+
387
+ // add body:
388
+ val blockId = tw.getFreshIdLabel<DbBlock >()
389
+ tw.writeStmts_block(blockId, obinitId, 0 , obinitId)
390
+ tw.writeHasLocation(blockId, locId)
391
+
392
+ extractDeclInitializers(c.declarations, false ) { Pair (blockId, obinitId) }
393
+ }
394
+
374
395
fun extractClassSource (c : IrClass , extractDeclarations : Boolean , extractStaticInitializer : Boolean , extractPrivateMembers : Boolean , extractFunctionBodies : Boolean ): Label <out DbClassorinterface > {
375
396
with (" class source" , c) {
376
397
DeclarationStackAdjuster (c).use {
@@ -425,6 +446,9 @@ open class KotlinFileExtractor(
425
446
addModifiers(instance.id, " public" , " static" , " final" )
426
447
tw.writeClass_object(id.cast<DbClass >(), instance.id)
427
448
}
449
+ if (extractFunctionBodies && needsObinitFunction(c)) {
450
+ extractObinitFunction(c, id)
451
+ }
428
452
429
453
extractClassModifiers(c, id)
430
454
extractClassSupertypes(c, id, inReceiverContext = true ) // inReceiverContext = true is specified to force extraction of member prototypes of base types
@@ -2105,6 +2129,22 @@ open class KotlinFileExtractor(
2105
2129
enclosingStmt : Label <out DbStmt >
2106
2130
): Label <DbNewexpr > = extractNewExpr(useFunction<DbConstructor >(calledConstructor, constructorTypeArgs), constructedType, locId, parent, idx, callable, enclosingStmt)
2107
2131
2132
+ private fun needsObinitFunction (c : IrClass ) = c.primaryConstructor == null && c.constructors.count() > 1
2133
+
2134
+ private fun getObinitLabel (c : IrClass ) = getFunctionLabel(
2135
+ c,
2136
+ null ,
2137
+ " <obinit>" ,
2138
+ listOf (),
2139
+ pluginContext.irBuiltIns.unitType,
2140
+ null ,
2141
+ functionTypeParameters = listOf (),
2142
+ classTypeArgsIncludingOuterClasses = listOf (),
2143
+ overridesCollectionsMethod = false ,
2144
+ javaSignature = null ,
2145
+ addParameterWildcardsByDefault = false
2146
+ )
2147
+
2108
2148
private fun extractConstructorCall (
2109
2149
e : IrFunctionAccessExpression ,
2110
2150
parent : Label <out DbExprparent >,
@@ -2434,13 +2474,29 @@ open class KotlinFileExtractor(
2434
2474
loopIdMap.remove(e)
2435
2475
}
2436
2476
is IrInstanceInitializerCall -> {
2437
- val stmtParent = parent.stmt(e, callable)
2438
2477
val irConstructor = declarationStack.peek() as ? IrConstructor
2439
2478
if (irConstructor == null ) {
2440
2479
logger.errorElement(" IrInstanceInitializerCall outside constructor" , e)
2441
2480
return
2442
2481
}
2443
- extractInstanceInitializerBlock(stmtParent, irConstructor)
2482
+ if (needsObinitFunction(irConstructor.parentAsClass)) {
2483
+ val exprParent = parent.expr(e, callable)
2484
+ val id = tw.getFreshIdLabel<DbMethodaccess >()
2485
+ val type = useType(pluginContext.irBuiltIns.unitType)
2486
+ val locId = tw.getLocation(e)
2487
+ val methodLabel = getObinitLabel(irConstructor.parentAsClass)
2488
+ val methodId = tw.getLabelFor<DbMethod >(methodLabel)
2489
+ tw.writeExprs_methodaccess(id, type.javaResult.id, exprParent.parent, exprParent.idx)
2490
+ tw.writeExprsKotlinType(id, type.kotlinResult.id)
2491
+ tw.writeHasLocation(id, locId)
2492
+ tw.writeCallableEnclosingExpr(id, callable)
2493
+ tw.writeStatementEnclosingExpr(id, exprParent.enclosingStmt)
2494
+ tw.writeCallableBinding(id, methodId)
2495
+ }
2496
+ else {
2497
+ val stmtParent = parent.stmt(e, callable)
2498
+ extractInstanceInitializerBlock(stmtParent, irConstructor)
2499
+ }
2444
2500
}
2445
2501
is IrConstructorCall -> {
2446
2502
val exprParent = parent.expr(e, callable)
0 commit comments