JVM_IR: fix parallel compilation

Non-static inline functions that return inline
classes need to be tracked when copying files for by-file lowering.

FIXED: KT-45680
This commit is contained in:
Georgy Bronnikov
2021-06-21 18:07:48 +03:00
committed by teamcityserver
parent 594cc29dd2
commit 40872dd4ca
5 changed files with 38 additions and 0 deletions
@@ -18420,6 +18420,12 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt");
}
@Test
@TestMetadata("inlineInCompanion.kt")
public void testInlineInCompanion() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt");
}
@Test
@TestMetadata("iterateOverArrayOfInlineClassValues.kt")
public void testIterateOverArrayOfInlineClassValues() throws Exception {
@@ -185,6 +185,13 @@ class JvmBackendContext(
functionSymbolMap[staticReplacement.symbol] = newStaticReplacement.symbol
}
for ((methodReplacement, original) in inlineClassReplacements.originalFunctionForMethodReplacement) {
if (methodReplacement !is IrSimpleFunction) continue
val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue
val newMethodReplacement = inlineClassReplacements.getReplacementFunction(newOriginal) ?: continue
functionSymbolMap[methodReplacement.symbol] = newMethodReplacement.symbol
}
for ((original, suspendView) in suspendFunctionOriginalToView) {
val newOriginal = functionSymbolMap[original.symbol]?.owner ?: continue
val newSuspendView = suspendFunctionOriginalToView[newOriginal] ?: continue
@@ -45,6 +45,7 @@ class MemoizedInlineClassReplacements(
private val propertyMap = ConcurrentHashMap<IrPropertySymbol, IrProperty>()
internal val originalFunctionForStaticReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap()
internal val originalFunctionForMethodReplacement: MutableMap<IrFunction, IrFunction> = ConcurrentHashMap()
/**
* Get a replacement for a function or a constructor.
@@ -181,6 +182,7 @@ class MemoizedInlineClassReplacements(
private fun createMethodReplacement(function: IrFunction): IrSimpleFunction =
buildReplacement(function, function.origin) {
originalFunctionForMethodReplacement[this] = function
require(function.dispatchReceiverParameter != null && function is IrSimpleFunction)
dispatchReceiverParameter = function.dispatchReceiverParameter?.copyTo(this, index = -1)
extensionReceiverParameter = function.extensionReceiverParameter?.copyTo(this, index = -1, name = Name.identifier("\$receiver"))
@@ -0,0 +1,17 @@
// TARGET_BACKEND: JVM_IR
// WITH_RUNTIME
// FILE: R.kt
import kotlin.jvm.JvmInline
@JvmInline
value class R(val value: String) {
companion object {
inline fun ok() = R("OK")
}
}
// FILE: test.kt
fun box(): String = R.ok().value
@@ -18420,6 +18420,12 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/inlineClasses/inlineFunctionInsideInlineClass.kt");
}
@Test
@TestMetadata("inlineInCompanion.kt")
public void testInlineInCompanion() throws Exception {
runTest("compiler/testData/codegen/box/inlineClasses/inlineInCompanion.kt");
}
@Test
@TestMetadata("iterateOverArrayOfInlineClassValues.kt")
public void testIterateOverArrayOfInlineClassValues() throws Exception {