Lower fun interface children's body during inline class lowering
#KT-51121 Fixed
This commit is contained in:
+12
@@ -23200,6 +23200,18 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
+18
-3
@@ -122,10 +122,14 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
|
|||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (function is IrSimpleFunction && function.overriddenSymbols.any { it.owner.parentAsClass.isFun }) {
|
||||||
// If fun interface methods are already mangled, do not mangle them twice.
|
// If fun interface methods are already mangled, do not mangle them twice.
|
||||||
if (function is IrSimpleFunction && function.overriddenSymbols.any { it.owner.parentAsClass.isFun } &&
|
val suffix = function.hashSuffix()
|
||||||
function.name.asString().substringAfterLast('-') == replacement.name.asString().substringAfterLast('-')
|
if (suffix != null && function.name.asString().endsWith(suffix)) {
|
||||||
) return null
|
function.transformChildrenVoid()
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
addBindingsFor(function, replacement)
|
addBindingsFor(function, replacement)
|
||||||
return when (function) {
|
return when (function) {
|
||||||
@@ -135,6 +139,13 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun IrFunction.hashSuffix(): String? =
|
||||||
|
InlineClassAbi.hashSuffix(
|
||||||
|
this,
|
||||||
|
context.state.functionsWithInlineClassReturnTypesMangled,
|
||||||
|
context.state.useOldManglingSchemeForFunctionsWithInlineClassesInSignatures
|
||||||
|
)
|
||||||
|
|
||||||
private fun transformSimpleFunctionFlat(function: IrSimpleFunction, replacement: IrSimpleFunction): List<IrDeclaration> {
|
private fun transformSimpleFunctionFlat(function: IrSimpleFunction, replacement: IrSimpleFunction): List<IrDeclaration> {
|
||||||
replacement.valueParameters.forEach {
|
replacement.valueParameters.forEach {
|
||||||
it.transformChildrenVoid()
|
it.transformChildrenVoid()
|
||||||
@@ -460,6 +471,10 @@ private class JvmInlineClassLowering(private val context: JvmBackendContext) : F
|
|||||||
|
|
||||||
override fun visitReturn(expression: IrReturn): IrExpression {
|
override fun visitReturn(expression: IrReturn): IrExpression {
|
||||||
expression.returnTargetSymbol.owner.safeAs<IrFunction>()?.let { target ->
|
expression.returnTargetSymbol.owner.safeAs<IrFunction>()?.let { target ->
|
||||||
|
val suffix = target.hashSuffix()
|
||||||
|
if (suffix != null && target.name.asString().endsWith(suffix))
|
||||||
|
return super.visitReturn(expression)
|
||||||
|
|
||||||
context.inlineClassReplacements.getReplacementFunction(target)?.let {
|
context.inlineClassReplacements.getReplacementFunction(target)?.let {
|
||||||
return context.createIrBuilder(it.symbol, expression.startOffset, expression.endOffset).irReturn(
|
return context.createIrBuilder(it.symbol, expression.startOffset, expression.endOffset).irReturn(
|
||||||
expression.value.transform(this, null)
|
expression.value.transform(this, null)
|
||||||
|
|||||||
@@ -66,12 +66,7 @@ object InlineClassAbi {
|
|||||||
return Name.identifier("constructor-impl")
|
return Name.identifier("constructor-impl")
|
||||||
}
|
}
|
||||||
|
|
||||||
val suffix = hashSuffix(
|
val suffix = hashSuffix(irFunction, mangleReturnTypes, useOldMangleRules)
|
||||||
useOldMangleRules,
|
|
||||||
irFunction.fullValueParameterList.map { it.type },
|
|
||||||
irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType },
|
|
||||||
irFunction.isSuspend
|
|
||||||
)
|
|
||||||
if (suffix == null && ((irFunction.parent as? IrClass)?.isSingleFieldValueClass != true || irFunction.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) {
|
if (suffix == null && ((irFunction.parent as? IrClass)?.isSingleFieldValueClass != true || irFunction.origin == IrDeclarationOrigin.IR_BUILTINS_STUB)) {
|
||||||
return irFunction.name
|
return irFunction.name
|
||||||
}
|
}
|
||||||
@@ -90,6 +85,14 @@ object InlineClassAbi {
|
|||||||
return Name.identifier("$base-${suffix ?: "impl"}")
|
return Name.identifier("$base-${suffix ?: "impl"}")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun hashSuffix(irFunction: IrFunction, mangleReturnTypes: Boolean, useOldMangleRules: Boolean): String? =
|
||||||
|
hashSuffix(
|
||||||
|
useOldMangleRules,
|
||||||
|
irFunction.fullValueParameterList.map { it.type },
|
||||||
|
irFunction.returnType.takeIf { mangleReturnTypes && irFunction.hasMangledReturnType },
|
||||||
|
irFunction.isSuspend
|
||||||
|
)
|
||||||
|
|
||||||
fun hashSuffix(
|
fun hashSuffix(
|
||||||
useOldMangleRules: Boolean,
|
useOldMangleRules: Boolean,
|
||||||
valueParameters: List<IrType>,
|
valueParameters: List<IrType>,
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
// WITH_STDLIB
|
||||||
|
// WORKS_WHEN_VALUE_CLASS
|
||||||
|
// LANGUAGE: +ValueClasses
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
// FILE: 1.kt
|
||||||
|
|
||||||
|
fun interface F {
|
||||||
|
fun foo(s: String): Z
|
||||||
|
}
|
||||||
|
|
||||||
|
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||||
|
value class Z(val value: String)
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
|
||||||
|
val f: F = F { value -> Z(value) }
|
||||||
|
|
||||||
|
fun box(): String =
|
||||||
|
f.foo("OK").value
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
// WITH_STDLIB
|
||||||
|
// WORKS_WHEN_VALUE_CLASS
|
||||||
|
// LANGUAGE: +ValueClasses
|
||||||
|
// IGNORE_BACKEND: JVM
|
||||||
|
// FILE: 1.kt
|
||||||
|
|
||||||
|
val f: F = F { value -> Z(value) }
|
||||||
|
|
||||||
|
fun box(): String =
|
||||||
|
f.foo("OK").value
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
|
||||||
|
fun interface F {
|
||||||
|
fun foo(s: String): Z
|
||||||
|
}
|
||||||
|
|
||||||
|
OPTIONAL_JVM_INLINE_ANNOTATION
|
||||||
|
value class Z(val value: String)
|
||||||
|
|
||||||
+12
@@ -22762,6 +22762,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
+12
@@ -23200,6 +23200,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/javaSamReturnResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
+10
@@ -18993,6 +18993,16 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void ignoreKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void ignoreKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void ignoreMangledSamWrappers() throws Exception {
|
public void ignoreMangledSamWrappers() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getReplaceOptionalJvmInlineAnnotationWithReal());
|
||||||
|
|||||||
+12
@@ -18198,6 +18198,18 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
+12
@@ -18162,6 +18162,18 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
+10
@@ -15354,6 +15354,16 @@ public class IrCodegenBoxWasmTestGenerated extends AbstractIrCodegenBoxWasmTest
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
|||||||
+16
@@ -20269,6 +20269,8 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
|||||||
public FunInterface() {
|
public FunInterface() {
|
||||||
register("compiler/testData/codegen/box/inlineClasses/funInterface/argumentIC.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/argumentIC.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
register("compiler/testData/codegen/box/inlineClasses/funInterface/argumentICGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/argumentICGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
register("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappers.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
register("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappersGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/mangledSamWrappersGeneric.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
register("compiler/testData/codegen/box/inlineClasses/funInterface/returnIC.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
register("compiler/testData/codegen/box/inlineClasses/funInterface/returnIC.kt", TransformersFunctions.getRemoveOptionalJvmInlineAnnotation());
|
||||||
@@ -20300,6 +20302,20 @@ public class NativeCodegenBoxTestGenerated extends AbstractNativeCodegenBoxTest
|
|||||||
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/argumentResult.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121.kt")
|
||||||
|
public void testKt51121() throws Exception {
|
||||||
|
// There is a registered source transformer for the testcase: TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("kt51121_2.kt")
|
||||||
|
public void testKt51121_2() throws Exception {
|
||||||
|
// There is a registered source transformer for the testcase: TransformersFunctions.getRemoveOptionalJvmInlineAnnotation()
|
||||||
|
runTest("compiler/testData/codegen/box/inlineClasses/funInterface/kt51121_2.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("mangledSamWrappers.kt")
|
@TestMetadata("mangledSamWrappers.kt")
|
||||||
public void testMangledSamWrappers() throws Exception {
|
public void testMangledSamWrappers() throws Exception {
|
||||||
|
|||||||
Reference in New Issue
Block a user