K2: don't make T = Type! substitutions for constructors, including SAM

Without this commit we get some ABI changes and it looks bad.

Related to KT-65596
This commit is contained in:
Mikhail Glukhikh
2024-02-21 13:58:26 +01:00
committed by Space Team
parent 81414d758d
commit 78b6432ced
27 changed files with 159 additions and 76 deletions
@@ -1,9 +0,0 @@
MODULE lib
CLASS A.class
CLASS METADATA
FUNCTION foo()Ljava/lang/Comparable;
Property: class.metadata.function.typeParameters
K1
<T#0 /* K */ : kotlin/Comparable<T#0!>!>
K2
<T#0 /* K */ : kotlin/Comparable<T#0 & Any..T#0?>!>
@@ -2,8 +2,6 @@
// WITH_STDLIB
// MODULE: lib
// JVM_ABI_K1_K2_DIFF: KT-63870
// FILE: JavaInterface.java
public interface JavaInterface {
<K extends Comparable<K>> K foo();
@@ -1,6 +1,4 @@
MODULE main
Missing in K2
TestKt$example$2.class
CLASS TestKt$example$1.class
Property: class.signature
K1
@@ -34,7 +34,7 @@ FILE: Eq.kt
public get(): R|lib/a/A<R, S>|
public open override fun withL(l: R|kotlin/Int|): R|lib/a/C.WithL<R, S>| {
^withL Q|lib/a/C|.R|lib/a/C.MyWithL.MyWithL|<R|R!|, R|S!|>()
^withL Q|lib/a/C|.R|lib/a/C.MyWithL.MyWithL|<R|R|, R|S|>()
}
}
@@ -1,4 +1,4 @@
// FIR_DUMP
// FILE: samConversionToGeneric.kt
fun test1() = J<String> { x -> x }
@@ -0,0 +1,43 @@
FILE: samConversionToGeneric.kt
public final fun test1(): R|J<kotlin/String>| {
^test1 R|/J|<R|kotlin/String|>(<L> = J@fun <anonymous>(x: R|kotlin/String!|): R|kotlin/String!| <inline=NoInline> {
^ R|<local>/x|
}
)
}
public final fun test2(): R|J<kotlin/String!>| {
^test2 R|/J|<R|kotlin/String!|>(<L> = J@fun <anonymous>(x: R|kotlin/String|): R|kotlin/String!| <inline=NoInline> {
^ R|<local>/x|
}
)
}
public final fun test3(): R|kotlin/Unit| {
^test3 Q|H|.R|/H.bar*s|<R|kotlin/String!|>(<L> = SAM(bar@fun <anonymous>(x: R|kotlin/String|): R|kotlin/String!| <inline=NoInline> {
^ R|<local>/x|
}
))
}
public final fun test4(a: R|kotlin/Any|): R|kotlin/Unit| {
(R|<local>/a| as R|J<kotlin/String>|)
Q|H|.R|/H.bar*s|<R|kotlin/String!|>(R|<local>/a|)
}
public final fun test5(a: R|kotlin/Any|): R|kotlin/Unit| {
(R|<local>/a| as R|(kotlin/String) -> kotlin/String|)
Q|H|.R|/H.bar*s|<R|kotlin/String!|>(SAM(R|<local>/a|))
}
public final fun <T> test6(a: R|(T) -> T|): R|kotlin/Unit| {
Q|H|.R|/H.bar*s|<R|T!|>(SAM(R|<local>/a|))
}
public final fun <T> test7(a: R|kotlin/Any|): R|kotlin/Unit| {
(R|<local>/a| as R|(T) -> T|)
Q|H|.R|/H.bar*s|<R|T!|>(SAM(R|<local>/a|))
}
public final fun test8(efn: R|kotlin/String.() -> kotlin/String|): R|J<kotlin/String!>| {
^test8 R|/J|<R|kotlin/String!|>(R|<local>/efn|)
}
public final fun test9(efn: R|kotlin/String.() -> kotlin/String|): R|kotlin/Unit| {
Q|H|.R|/H.bar*s|<R|kotlin/String!|>(SAM(R|<local>/efn|))
}
public final fun test10(fn: R|(kotlin/Int) -> kotlin/String|): R|kotlin/Unit| {
Q|H|.R|/H.bar2x*s|<R|kotlin/Int!|>(SAM(R|<local>/fn|))
}
@@ -1,4 +1,4 @@
// FIR_DUMP
// FILE: samConversionToGeneric.kt
fun test1() = J<String> { x -> x }
@@ -40,14 +40,14 @@ FILE fqName:<root> fileName:/constructorWithOwnTypeParametersCall.kt
overridden:
public open fun toString (): kotlin.String declared in kotlin.Any
$this: VALUE_PARAMETER name:<this> type:kotlin.Any
FUN name:testJava visibility:public modality:FINAL <> () returnType:<root>.J1.J2<@[FlexibleNullability] kotlin.Double?, @[FlexibleNullability] kotlin.Int?>
FUN name:testJava visibility:public modality:FINAL <> () returnType:<root>.J1.J2<kotlin.Double, kotlin.Int>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun testJava (): <root>.J1.J2<@[FlexibleNullability] kotlin.Double?, @[FlexibleNullability] kotlin.Int?> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <Y2> () declared in <root>.J1.J2' type=<root>.J1.J2<@[FlexibleNullability] kotlin.Double?, @[FlexibleNullability] kotlin.Int?> origin=null
<class: X2>: @[FlexibleNullability] kotlin.Double?
RETURN type=kotlin.Nothing from='public final fun testJava (): <root>.J1.J2<kotlin.Double, kotlin.Int> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <Y2> () declared in <root>.J1.J2' type=<root>.J1.J2<kotlin.Double, kotlin.Int> origin=null
<class: X2>: kotlin.Double
<Y2>: @[FlexibleNullability] kotlin.CharSequence?
$outer: CONSTRUCTOR_CALL 'public constructor <init> <Y1> () declared in <root>.J1' type=<root>.J1<@[FlexibleNullability] kotlin.Int?> origin=null
<class: X1>: @[FlexibleNullability] kotlin.Int?
$outer: CONSTRUCTOR_CALL 'public constructor <init> <Y1> () declared in <root>.J1' type=<root>.J1<kotlin.Int> origin=null
<class: X1>: kotlin.Int
<Y1>: @[FlexibleNullability] kotlin.String?
FUN name:testKotlin visibility:public modality:FINAL <> () returnType:<root>.K1.K2<kotlin.String, kotlin.Int>
BLOCK_BODY
@@ -16,10 +16,11 @@ class K1<T1 : Number> {
}
fun testJava(): J2<@FlexibleNullability Double?, @FlexibleNullability Int?> {
return J1<@FlexibleNullability Int?, @FlexibleNullability String?>().J2<@FlexibleNullability Double?, @FlexibleNullability CharSequence?>()
fun testJava(): J2<Double, Int> {
return J1<Int, @FlexibleNullability String?>().J2<Double, @FlexibleNullability CharSequence?>()
}
fun testKotlin(): K2<String, Int> {
return K1<Int>().K2<String>()
}
@@ -1,8 +1,8 @@
FILE fqName:<root> fileName:/samConversionToGeneric.kt
FUN name:test1 visibility:public modality:FINAL <> () returnType:<root>.J<@[FlexibleNullability] kotlin.String?>
FUN name:test1 visibility:public modality:FINAL <> () returnType:<root>.J<kotlin.String>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J<@[FlexibleNullability] kotlin.String?> declared in <root>'
TYPE_OP type=<root>.J<@[FlexibleNullability] kotlin.String?> origin=SAM_CONVERSION typeOperand=<root>.J<@[FlexibleNullability] kotlin.String?>
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J<kotlin.String> declared in <root>'
TYPE_OP type=<root>.J<kotlin.String> origin=SAM_CONVERSION typeOperand=<root>.J<kotlin.String>
FUN_EXPR type=kotlin.Function1<@[FlexibleNullability] kotlin.String?, @[FlexibleNullability] kotlin.String?> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (x:@[FlexibleNullability] kotlin.String?) returnType:@[FlexibleNullability] kotlin.String?
VALUE_PARAMETER name:x index:0 type:@[FlexibleNullability] kotlin.String?
@@ -1,8 +1,8 @@
fun test1(): J<@FlexibleNullability String?> {
fun test1(): J<String> {
return local fun <anonymous>(x: @FlexibleNullability String?): @FlexibleNullability String? {
return x
}
/*-> J<@FlexibleNullability String?> */
/*-> J<String> */
}
fun test10(fn: Function1<Int, String>) {
@@ -1,29 +1,29 @@
FILE fqName:<root> fileName:/javaConstructorWithTypeParameters.kt
FUN name:test1 visibility:public modality:FINAL <> () returnType:<root>.J1<@[FlexibleNullability] kotlin.Int?>
FUN name:test1 visibility:public modality:FINAL <> () returnType:<root>.J1<kotlin.Int>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J1<@[FlexibleNullability] kotlin.Int?> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1' type=<root>.J1<@[FlexibleNullability] kotlin.Int?> origin=null
<class: T1>: @[FlexibleNullability] kotlin.Int?
FUN name:test2 visibility:public modality:FINAL <> () returnType:<root>.J1<@[FlexibleNullability] kotlin.Int?>
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J1<kotlin.Int> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1' type=<root>.J1<kotlin.Int> origin=null
<class: T1>: kotlin.Int
FUN name:test2 visibility:public modality:FINAL <> () returnType:<root>.J1<kotlin.Int>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test2 (): <root>.J1<@[FlexibleNullability] kotlin.Int?> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <X1> (x1: @[FlexibleNullability] X1 of <root>.J1.<init>?) declared in <root>.J1' type=<root>.J1<@[FlexibleNullability] kotlin.Int?> origin=null
<class: T1>: @[FlexibleNullability] kotlin.Int?
RETURN type=kotlin.Nothing from='public final fun test2 (): <root>.J1<kotlin.Int> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <X1> (x1: @[FlexibleNullability] X1 of <root>.J1.<init>?) declared in <root>.J1' type=<root>.J1<kotlin.Int> origin=null
<class: T1>: kotlin.Int
<X1>: @[FlexibleNullability] kotlin.Int?
x1: CONST Int type=kotlin.Int value=1
FUN name:test3 visibility:public modality:FINAL <> (j1:<root>.J1<kotlin.Any>) returnType:<root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any>
FUN name:test3 visibility:public modality:FINAL <> (j1:<root>.J1<kotlin.Any>) returnType:<root>.J1.J2<kotlin.Int, kotlin.Any>
VALUE_PARAMETER name:j1 index:0 type:<root>.J1<kotlin.Any>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test3 (j1: <root>.J1<kotlin.Any>): <root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1.J2' type=<root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any> origin=null
<class: T2>: @[FlexibleNullability] kotlin.Int?
RETURN type=kotlin.Nothing from='public final fun test3 (j1: <root>.J1<kotlin.Any>): <root>.J1.J2<kotlin.Int, kotlin.Any> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1.J2' type=<root>.J1.J2<kotlin.Int, kotlin.Any> origin=null
<class: T2>: kotlin.Int
$outer: GET_VAR 'j1: <root>.J1<kotlin.Any> declared in <root>.test3' type=<root>.J1<kotlin.Any> origin=null
FUN name:test4 visibility:public modality:FINAL <> (j1:<root>.J1<kotlin.Any>) returnType:<root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any>
FUN name:test4 visibility:public modality:FINAL <> (j1:<root>.J1<kotlin.Any>) returnType:<root>.J1.J2<kotlin.Int, kotlin.Any>
VALUE_PARAMETER name:j1 index:0 type:<root>.J1<kotlin.Any>
BLOCK_BODY
RETURN type=kotlin.Nothing from='public final fun test4 (j1: <root>.J1<kotlin.Any>): <root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <X2> (x2: @[FlexibleNullability] X2 of <root>.J1.J2.<init>?) declared in <root>.J1.J2' type=<root>.J1.J2<@[FlexibleNullability] kotlin.Int?, kotlin.Any> origin=null
<class: T2>: @[FlexibleNullability] kotlin.Int?
RETURN type=kotlin.Nothing from='public final fun test4 (j1: <root>.J1<kotlin.Any>): <root>.J1.J2<kotlin.Int, kotlin.Any> declared in <root>'
CONSTRUCTOR_CALL 'public constructor <init> <X2> (x2: @[FlexibleNullability] X2 of <root>.J1.J2.<init>?) declared in <root>.J1.J2' type=<root>.J1.J2<kotlin.Int, kotlin.Any> origin=null
<class: T2>: kotlin.Int
<X2>: @[FlexibleNullability] kotlin.Int?
$outer: GET_VAR 'j1: <root>.J1<kotlin.Any> declared in <root>.test4' type=<root>.J1<kotlin.Any> origin=null
x2: CONST Int type=kotlin.Int value=1
@@ -1,15 +1,15 @@
fun test1(): J1<@FlexibleNullability Int?> {
return J1<@FlexibleNullability Int?>()
fun test1(): J1<Int> {
return J1<Int>()
}
fun test2(): J1<@FlexibleNullability Int?> {
return J1<@FlexibleNullability Int?, @FlexibleNullability Int?>(x1 = 1)
fun test2(): J1<Int> {
return J1<Int, @FlexibleNullability Int?>(x1 = 1)
}
fun test3(j1: J1<Any>): J2<@FlexibleNullability Int?, Any> {
return j1.J2<@FlexibleNullability Int?>()
fun test3(j1: J1<Any>): J2<Int, Any> {
return j1.J2<Int>()
}
fun test4(j1: J1<Any>): J2<@FlexibleNullability Int?, Any> {
return j1.J2<@FlexibleNullability Int?, @FlexibleNullability Int?>(x2 = 1)
fun test4(j1: J1<Any>): J2<Int, Any> {
return j1.J2<Int, @FlexibleNullability Int?>(x2 = 1)
}