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:
committed by
Space Team
parent
81414d758d
commit
78b6432ced
-1
@@ -1 +0,0 @@
|
|||||||
constructor(c: kotlin.collections.(Mutable)Collection<out E!>!)
|
|
||||||
+1
-1
@@ -7,7 +7,7 @@ FILE: main.kt
|
|||||||
public abstract interface PsiClass : R|kotlin/Any| {
|
public abstract interface PsiClass : R|kotlin/Any| {
|
||||||
}
|
}
|
||||||
public final fun test(): R|kotlin/Unit| {
|
public final fun test(): R|kotlin/Unit| {
|
||||||
lval processor: R|AdapterProcessor<PsiMethod!, PsiClass!>| = R|/AdapterProcessor.AdapterProcessor|<R|PsiMethod!|, R|PsiClass!|>(R|/Function|<R|PsiMethod!|, R|PsiClass?|>(<L> = Function@fun <anonymous>(method: R|PsiMethod?|): R|PsiClass?| <inline=NoInline> {
|
lval processor: R|AdapterProcessor<PsiMethod, PsiClass>| = R|/AdapterProcessor.AdapterProcessor|<R|PsiMethod|, R|PsiClass|>(R|/Function|<R|PsiMethod!|, R|PsiClass?|>(<L> = Function@fun <anonymous>(method: R|PsiMethod?|): R|PsiClass?| <inline=NoInline> {
|
||||||
^ R|<local>/method|?.{ $subj$.R|/PsiMethod.containingClass| }
|
^ R|<local>/method|?.{ $subj$.R|/PsiMethod.containingClass| }
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
|
|||||||
+2
-2
@@ -26,13 +26,13 @@ FILE: main.kt
|
|||||||
|
|
||||||
}
|
}
|
||||||
public final fun test_1(): R|kotlin/Unit| {
|
public final fun test_1(): R|kotlin/Unit| {
|
||||||
lval map: R|util/HashMap<kotlin/Int!, kotlin/Int!>| = R|util/HashMap.HashMap|<R|kotlin/Int!|, R|kotlin/Int!|>()
|
lval map: R|util/HashMap<kotlin/Int, kotlin/Int>| = R|util/HashMap.HashMap|<R|kotlin/Int|, R|kotlin/Int|>()
|
||||||
}
|
}
|
||||||
public final fun test_2(): R|kotlin/Unit| {
|
public final fun test_2(): R|kotlin/Unit| {
|
||||||
lval set: R|util/HashSet<kotlin/Int>| = R|util/HashSet.HashSet|<R|kotlin/Int|>()
|
lval set: R|util/HashSet<kotlin/Int>| = R|util/HashSet.HashSet|<R|kotlin/Int|>()
|
||||||
}
|
}
|
||||||
public final fun test_3(): R|kotlin/Unit| {
|
public final fun test_3(): R|kotlin/Unit| {
|
||||||
lval list: R|foo/ArrayList<kotlin/Int!>| = R|foo/ArrayList.ArrayList|<R|kotlin/Int!|>()
|
lval list: R|foo/ArrayList<kotlin/Int>| = R|foo/ArrayList.ArrayList|<R|kotlin/Int|>()
|
||||||
}
|
}
|
||||||
public final fun test_4(): R|kotlin/Unit| {
|
public final fun test_4(): R|kotlin/Unit| {
|
||||||
lval list: R|foo/LinkedList<kotlin/Int>| = R|foo/LinkedList.LinkedList|<R|kotlin/Int|>()
|
lval list: R|foo/LinkedList<kotlin/Int>| = R|foo/LinkedList.LinkedList|<R|kotlin/Int|>()
|
||||||
|
|||||||
+2
-2
@@ -13,8 +13,8 @@ FILE: test.kt
|
|||||||
lval element: R|DE| = R|<local>/d|.R|/Diagnostic.element|
|
lval element: R|DE| = R|<local>/d|.R|/Diagnostic.element|
|
||||||
R|/Fix.Fix|(R|<local>/element|)
|
R|/Fix.Fix|(R|<local>/element|)
|
||||||
}
|
}
|
||||||
private final val DERIVED_FACTORY: R|DiagnosticFactory0<DerivedElement!>| = R|/DiagnosticFactory0.DiagnosticFactory0|<R|DerivedElement!|>()
|
private final val DERIVED_FACTORY: R|DiagnosticFactory0<DerivedElement>| = R|/DiagnosticFactory0.DiagnosticFactory0|<R|DerivedElement|>()
|
||||||
private get(): R|DiagnosticFactory0<DerivedElement!>|
|
private get(): R|DiagnosticFactory0<DerivedElement>|
|
||||||
public final fun createViaFactory(d: R|EmptyDiagnostic|): R|kotlin/Unit| {
|
public final fun createViaFactory(d: R|EmptyDiagnostic|): R|kotlin/Unit| {
|
||||||
lval casted: R|Diagnostic<DerivedElement!>| = R|/DERIVED_FACTORY|.R|SubstitutionOverride</DiagnosticFactory0.cast: R|@EnhancedNullability Diagnostic<DerivedElement!>|>|(R|<local>/d|)
|
lval casted: R|Diagnostic<DerivedElement!>| = R|/DERIVED_FACTORY|.R|SubstitutionOverride</DiagnosticFactory0.cast: R|@EnhancedNullability Diagnostic<DerivedElement!>|>|(R|<local>/d|)
|
||||||
lval element: R|DerivedElement| = R|<local>/casted|.R|/Diagnostic.element|
|
lval element: R|DerivedElement| = R|<local>/casted|.R|/Diagnostic.element|
|
||||||
|
|||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
FILE: main.kt
|
FILE: main.kt
|
||||||
public final fun main(): R|kotlin/Unit| {
|
public final fun main(): R|kotlin/Unit| {
|
||||||
R|/JavaClass.JavaClass|<R|kotlin/String!|>(Null(null)).R|SubstitutionOverride</JavaClass.foo: R|kotlin/String!|>|().R|kotlin/String.length|
|
R|/JavaClass.JavaClass|<R|kotlin/String|>(Null(null)).R|SubstitutionOverride</JavaClass.foo: R|kotlin/String!|>|().R|kotlin/String.length|
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
FILE: main.kt
|
FILE: main.kt
|
||||||
public final fun main(): R|kotlin/Unit| {
|
public final fun main(): R|kotlin/Unit| {
|
||||||
R|/MyFunction|<R|kotlin/Int!|, R|kotlin/String!|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int!|): R|kotlin/String!| <inline=NoInline> {
|
R|/MyFunction|<R|kotlin/Int|, R|kotlin/String|>(<L> = MyFunction@fun <anonymous>(x: R|kotlin/Int!|): R|kotlin/String!| <inline=NoInline> {
|
||||||
^ R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Int.toString|()
|
^ R|<local>/x|.R|kotlin/Int.toInt|().R|kotlin/Int.toString|()
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+4
-4
@@ -1,8 +1,8 @@
|
|||||||
FILE: main.kt
|
FILE: main.kt
|
||||||
private final val anyProperty: R|Property<kotlin/Any!>| = R|/Property.Property|<R|kotlin/Any!|>()
|
private final val anyProperty: R|Property<kotlin/Any>| = R|/Property.Property|<R|kotlin/Any|>()
|
||||||
private get(): R|Property<kotlin/Any!>|
|
private get(): R|Property<kotlin/Any>|
|
||||||
private final val boundedProperty: R|Property<kotlin/String!>| = R|/Property.Property|<R|kotlin/String!|>()
|
private final val boundedProperty: R|Property<kotlin/String>| = R|/Property.Property|<R|kotlin/String|>()
|
||||||
private get(): R|Property<kotlin/String!>|
|
private get(): R|Property<kotlin/String>|
|
||||||
public final fun test_1(x: R|Property<kotlin/Any>|): R|kotlin/Unit| {
|
public final fun test_1(x: R|Property<kotlin/Any>|): R|kotlin/Unit| {
|
||||||
when () {
|
when () {
|
||||||
(R|<local>/x| is R|Reference|) -> {
|
(R|<local>/x| is R|Reference|) -> {
|
||||||
|
|||||||
+2
-2
@@ -5,8 +5,8 @@ FILE: concurrentMapOfAliases.kt
|
|||||||
super<R|kotlin/Any|>()
|
super<R|kotlin/Any|>()
|
||||||
}
|
}
|
||||||
|
|
||||||
private final val foo: R|java/util/concurrent/ConcurrentHashMap<kotlin/String!, kotlin/CharSequence!>| = Q|java/util/concurrent|.R|java/util/concurrent/ConcurrentHashMap.ConcurrentHashMap|<R|kotlin/String!|, R|kotlin/CharSequence!|>()
|
private final val foo: R|java/util/concurrent/ConcurrentHashMap<kotlin/String, kotlin/CharSequence>| = Q|java/util/concurrent|.R|java/util/concurrent/ConcurrentHashMap.ConcurrentHashMap|<R|kotlin/String|, R|kotlin/CharSequence|>()
|
||||||
private get(): R|java/util/concurrent/ConcurrentHashMap<kotlin/String!, kotlin/CharSequence!>|
|
private get(): R|java/util/concurrent/ConcurrentHashMap<kotlin/String, kotlin/CharSequence>|
|
||||||
|
|
||||||
private final fun bar(): R|kotlin/Unit| {
|
private final fun bar(): R|kotlin/Unit| {
|
||||||
this@R|/A|.R|/A.foo|.R|SubstitutionOverride<java/util/concurrent/ConcurrentHashMap.get: R|@EnhancedNullability kotlin/CharSequence?|>|(String(dd))?.{ (this@R|/A|, $subj$).R|/A.baz|() }
|
this@R|/A|.R|/A.foo|.R|SubstitutionOverride<java/util/concurrent/ConcurrentHashMap.get: R|@EnhancedNullability kotlin/CharSequence?|>|(String(dd))?.{ (this@R|/A|, $subj$).R|/A.baz|() }
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
FILE: javaLangComparator.kt
|
FILE: javaLangComparator.kt
|
||||||
public final fun test_2(list: R|kotlin/collections/List<kotlin/Int>|): R|kotlin/Unit| {
|
public final fun test_2(list: R|kotlin/collections/List<kotlin/Int>|): R|kotlin/Unit| {
|
||||||
lval comp: R|java/util/Comparator<kotlin/Int!>| = Q|java/util|.R|java/util/Comparator|<R|kotlin/Int!|>(<L> = Comparator@fun <anonymous>(x: R|kotlin/Int!|, y: R|kotlin/Int!|): R|kotlin/Int| <inline=NoInline> {
|
lval comp: R|java/util/Comparator<kotlin/Int>| = Q|java/util|.R|java/util/Comparator|<R|kotlin/Int|>(<L> = Comparator@fun <anonymous>(x: R|kotlin/Int!|, y: R|kotlin/Int!|): R|kotlin/Int| <inline=NoInline> {
|
||||||
^ Int(1)
|
^ Int(1)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
FILE: NamedParameterInConcurrentMap.kt
|
FILE: NamedParameterInConcurrentMap.kt
|
||||||
public final fun main(): R|kotlin/Unit| {
|
public final fun main(): R|kotlin/Unit| {
|
||||||
lval map: R|java/util/concurrent/ConcurrentHashMap<kotlin/String!, kotlin/String!>| = R|java/util/concurrent/ConcurrentHashMap.ConcurrentHashMap|<R|kotlin/String!|, R|kotlin/String!|>()
|
lval map: R|java/util/concurrent/ConcurrentHashMap<kotlin/String, kotlin/String>| = R|java/util/concurrent/ConcurrentHashMap.ConcurrentHashMap|<R|kotlin/String|, R|kotlin/String|>()
|
||||||
R|<local>/map|.R|SubstitutionOverride<java/util/concurrent/ConcurrentHashMap.put: R|@EnhancedNullability kotlin/String?|>|(key = String(key), value = String(value))
|
R|<local>/map|.R|SubstitutionOverride<java/util/concurrent/ConcurrentHashMap.put: R|@EnhancedNullability kotlin/String?|>|(key = String(key), value = String(value))
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -2,7 +2,7 @@ FILE: Main.kt
|
|||||||
public final fun main(): R|kotlin/Unit| {
|
public final fun main(): R|kotlin/Unit| {
|
||||||
lvar generic: R|ft<Raw type Generic<kotlin/Any!>, Generic<*>?>| = Q|Generic|.R|/Generic.raw*s|
|
lvar generic: R|ft<Raw type Generic<kotlin/Any!>, Generic<*>?>| = Q|Generic|.R|/Generic.raw*s|
|
||||||
lvar inner1: R|ft<Raw type Generic.Inner<kotlin/Any!>, Generic.Inner<*>?>| = R|<local>/generic|.R|SubstitutionOverride</Generic.inner>|
|
lvar inner1: R|ft<Raw type Generic.Inner<kotlin/Any!>, Generic.Inner<*>?>| = R|<local>/generic|.R|SubstitutionOverride</Generic.inner>|
|
||||||
R|<local>/inner1| = R|/Generic.Generic|<R|kotlin/String!|>().R|SubstitutionOverride</Generic.Inner.Inner>|()
|
R|<local>/inner1| = R|/Generic.Generic|<R|kotlin/String|>().R|SubstitutionOverride</Generic.Inner.Inner>|()
|
||||||
lvar inner2: R|ft<Raw type Generic.Inner<kotlin/Any!>, Generic.Inner<*>?>| = R|<local>/generic|.R|SubstitutionOverride</Generic.rawInner>|
|
lvar inner2: R|ft<Raw type Generic.Inner<kotlin/Any!>, Generic.Inner<*>?>| = R|<local>/generic|.R|SubstitutionOverride</Generic.rawInner>|
|
||||||
R|<local>/inner2| = R|/Generic.Generic|<R|kotlin/String!|>().R|SubstitutionOverride</Generic.Inner.Inner>|()
|
R|<local>/inner2| = R|/Generic.Generic|<R|kotlin/String|>().R|SubstitutionOverride</Generic.Inner.Inner>|()
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,6 +1,6 @@
|
|||||||
FILE: weakHashMap.kt
|
FILE: weakHashMap.kt
|
||||||
public final val someMap: R|java/util/WeakHashMap<kotlin/Any!, kotlin/Any!>| = R|java/util/WeakHashMap.WeakHashMap|<R|kotlin/Any!|, R|kotlin/Any!|>()
|
public final val someMap: R|java/util/WeakHashMap<kotlin/Any?, kotlin/Any?>| = R|java/util/WeakHashMap.WeakHashMap|<R|kotlin/Any?|, R|kotlin/Any?|>()
|
||||||
public get(): R|java/util/WeakHashMap<kotlin/Any!, kotlin/Any!>|
|
public get(): R|java/util/WeakHashMap<kotlin/Any?, kotlin/Any?>|
|
||||||
public final fun foo(): R|kotlin/Unit| {
|
public final fun foo(): R|kotlin/Unit| {
|
||||||
R|/someMap|.R|SubstitutionOverride<java/util/WeakHashMap.get: R|@EnhancedNullability kotlin/Any?|>|(String())
|
R|/someMap|.R|SubstitutionOverride<java/util/WeakHashMap.get: R|@EnhancedNullability kotlin/Any?|>|(String())
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -9,9 +9,9 @@ FILE: typeAliasWithForEach.kt
|
|||||||
}
|
}
|
||||||
public final typealias Arguments = R|kotlin/collections/Map<kotlin/String, ArgsInfo>|
|
public final typealias Arguments = R|kotlin/collections/Map<kotlin/String, ArgsInfo>|
|
||||||
public final fun R|Arguments|.deepCopy(): R|Arguments| {
|
public final fun R|Arguments|.deepCopy(): R|Arguments| {
|
||||||
lval result: R|java/util/HashMap<kotlin/String!, ArgsInfo!>| = R|java/util/HashMap.HashMap|<R|kotlin/String!|, R|ArgsInfo!|>()
|
lval result: R|java/util/HashMap<kotlin/String, ArgsInfo>| = R|java/util/HashMap.HashMap|<R|kotlin/String|, R|ArgsInfo|>()
|
||||||
this@R|/deepCopy|.R|SubstitutionOverride<kotlin/collections/Map.forEach: R|kotlin/Unit|>|(<L> = SAM(forEach@fun <anonymous>(key: R|@EnhancedNullability kotlin/String|, value: R|@EnhancedNullability ArgsInfo|): R|kotlin/Unit| <inline=NoInline> {
|
this@R|/deepCopy|.R|SubstitutionOverride<kotlin/collections/Map.forEach: R|kotlin/Unit|>|(<L> = SAM(forEach@fun <anonymous>(key: R|@EnhancedNullability kotlin/String|, value: R|@EnhancedNullability ArgsInfo|): R|kotlin/Unit| <inline=NoInline> {
|
||||||
R|<local>/result|.R|kotlin/collections/set|<R|kotlin/String!|, R|ArgsInfo!|>(R|<local>/key|, R|/ArgsInfoImpl.ArgsInfoImpl|(R|<local>/value|))
|
R|<local>/result|.R|kotlin/collections/set|<R|kotlin/String|, R|ArgsInfo|>(R|<local>/key|, R|/ArgsInfoImpl.ArgsInfoImpl|(R|<local>/value|))
|
||||||
Unit
|
Unit
|
||||||
}
|
}
|
||||||
))
|
))
|
||||||
|
|||||||
+54
-1
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
|||||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.toConeType
|
import org.jetbrains.kotlin.fir.scopes.impl.toConeType
|
||||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||||
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.name.StandardClassIds
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
@@ -82,12 +83,64 @@ internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This function provides a type for a newly created EQUALS constraint on a fresh type variable,
|
||||||
|
* for a situation when we have an explicit type argument and type parameter is a Java type parameter without known nullability.
|
||||||
|
*
|
||||||
|
* For a normal function call, like foo<T = SomeType>, we create a constraint T = SomeType!.
|
||||||
|
* This is an unsafe solution, however yet we have to keep it, otherwise a lot of code becomes red.
|
||||||
|
* Typical "strange" example:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* // Java
|
||||||
|
* public class Foo {
|
||||||
|
* static <T> T id(T foo) {
|
||||||
|
* return null;
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* // Kotlin
|
||||||
|
* fun test(): String {
|
||||||
|
* return Foo.id<String?>(null) // OK...
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* We keep more sound constraint T = SomeType for regular and SAM constructor calls. Typical examples are:
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* fun test1() = J1<Int>() // type should be J1<Int>, not J1<Int!>
|
||||||
|
* // J1.java
|
||||||
|
* public class J1<T1> {}
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* or
|
||||||
|
*
|
||||||
|
* ```
|
||||||
|
* // Again, type should be J<String> and not J<String!>
|
||||||
|
* fun test1() = J<String> { x -> x }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* // FILE: J.java
|
||||||
|
* public interface J<T> {
|
||||||
|
* T foo(T x);
|
||||||
|
* }
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* @return type which is chosen for EQUALS constraint
|
||||||
|
*/
|
||||||
private fun getTypePreservingFlexibilityWrtTypeVariable(
|
private fun getTypePreservingFlexibilityWrtTypeVariable(
|
||||||
type: ConeKotlinType,
|
type: ConeKotlinType,
|
||||||
typeParameter: FirTypeParameterRef,
|
typeParameter: FirTypeParameterRef,
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
): ConeKotlinType {
|
): ConeKotlinType {
|
||||||
return if (typeParameter.shouldBeFlexible(session.typeContext)) {
|
val containingDeclarationSymbol = typeParameter.symbol.containingDeclarationSymbol
|
||||||
|
// To remove constructors (they use class type parameters)
|
||||||
|
return if (
|
||||||
|
containingDeclarationSymbol is FirCallableSymbol &&
|
||||||
|
// To remove SAMs
|
||||||
|
containingDeclarationSymbol !is FirSyntheticFunctionSymbol &&
|
||||||
|
typeParameter.shouldBeFlexible(session.typeContext)
|
||||||
|
) {
|
||||||
val notNullType = type.withNullability(ConeNullability.NOT_NULL, session.typeContext) as ConeSimpleKotlinType
|
val notNullType = type.withNullability(ConeNullability.NOT_NULL, session.typeContext) as ConeSimpleKotlinType
|
||||||
ConeFlexibleType(notNullType, notNullType.withNullability(ConeNullability.NULLABLE, session.typeContext))
|
ConeFlexibleType(notNullType, notNullType.withNullability(ConeNullability.NULLABLE, session.typeContext))
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
Vendored
-9
@@ -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
@@ -2,8 +2,6 @@
|
|||||||
// WITH_STDLIB
|
// WITH_STDLIB
|
||||||
// MODULE: lib
|
// MODULE: lib
|
||||||
|
|
||||||
// JVM_ABI_K1_K2_DIFF: KT-63870
|
|
||||||
|
|
||||||
// FILE: JavaInterface.java
|
// FILE: JavaInterface.java
|
||||||
public interface JavaInterface {
|
public interface JavaInterface {
|
||||||
<K extends Comparable<K>> K foo();
|
<K extends Comparable<K>> K foo();
|
||||||
|
|||||||
@@ -1,6 +1,4 @@
|
|||||||
MODULE main
|
MODULE main
|
||||||
Missing in K2
|
|
||||||
TestKt$example$2.class
|
|
||||||
CLASS TestKt$example$1.class
|
CLASS TestKt$example$1.class
|
||||||
Property: class.signature
|
Property: class.signature
|
||||||
K1
|
K1
|
||||||
|
|||||||
+1
-1
@@ -34,7 +34,7 @@ FILE: Eq.kt
|
|||||||
public get(): R|lib/a/A<R, S>|
|
public get(): R|lib/a/A<R, S>|
|
||||||
|
|
||||||
public open override fun withL(l: R|kotlin/Int|): R|lib/a/C.WithL<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
-1
@@ -1,4 +1,4 @@
|
|||||||
|
// FIR_DUMP
|
||||||
// FILE: samConversionToGeneric.kt
|
// FILE: samConversionToGeneric.kt
|
||||||
|
|
||||||
fun test1() = J<String> { x -> x }
|
fun test1() = J<String> { x -> x }
|
||||||
|
|||||||
+43
@@ -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
-1
@@ -1,4 +1,4 @@
|
|||||||
|
// FIR_DUMP
|
||||||
// FILE: samConversionToGeneric.kt
|
// FILE: samConversionToGeneric.kt
|
||||||
|
|
||||||
fun test1() = J<String> { x -> x }
|
fun test1() = J<String> { x -> x }
|
||||||
|
|||||||
+6
-6
@@ -40,14 +40,14 @@ FILE fqName:<root> fileName:/constructorWithOwnTypeParametersCall.kt
|
|||||||
overridden:
|
overridden:
|
||||||
public open fun toString (): kotlin.String declared in kotlin.Any
|
public open fun toString (): kotlin.String declared in kotlin.Any
|
||||||
$this: VALUE_PARAMETER name:<this> type: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
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun testJava (): <root>.J1.J2<@[FlexibleNullability] kotlin.Double?, @[FlexibleNullability] kotlin.Int?> declared in <root>'
|
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<@[FlexibleNullability] kotlin.Double?, @[FlexibleNullability] kotlin.Int?> origin=null
|
CONSTRUCTOR_CALL 'public constructor <init> <Y2> () declared in <root>.J1.J2' type=<root>.J1.J2<kotlin.Double, kotlin.Int> origin=null
|
||||||
<class: X2>: @[FlexibleNullability] kotlin.Double?
|
<class: X2>: kotlin.Double
|
||||||
<Y2>: @[FlexibleNullability] kotlin.CharSequence?
|
<Y2>: @[FlexibleNullability] kotlin.CharSequence?
|
||||||
$outer: CONSTRUCTOR_CALL 'public constructor <init> <Y1> () declared in <root>.J1' type=<root>.J1<@[FlexibleNullability] kotlin.Int?> origin=null
|
$outer: CONSTRUCTOR_CALL 'public constructor <init> <Y1> () declared in <root>.J1' type=<root>.J1<kotlin.Int> origin=null
|
||||||
<class: X1>: @[FlexibleNullability] kotlin.Int?
|
<class: X1>: kotlin.Int
|
||||||
<Y1>: @[FlexibleNullability] kotlin.String?
|
<Y1>: @[FlexibleNullability] kotlin.String?
|
||||||
FUN name:testKotlin visibility:public modality:FINAL <> () returnType:<root>.K1.K2<kotlin.String, kotlin.Int>
|
FUN name:testKotlin visibility:public modality:FINAL <> () returnType:<root>.K1.K2<kotlin.String, kotlin.Int>
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
|
|||||||
+3
-2
@@ -16,10 +16,11 @@ class K1<T1 : Number> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testJava(): J2<@FlexibleNullability Double?, @FlexibleNullability Int?> {
|
fun testJava(): J2<Double, Int> {
|
||||||
return J1<@FlexibleNullability Int?, @FlexibleNullability String?>().J2<@FlexibleNullability Double?, @FlexibleNullability CharSequence?>()
|
return J1<Int, @FlexibleNullability String?>().J2<Double, @FlexibleNullability CharSequence?>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun testKotlin(): K2<String, Int> {
|
fun testKotlin(): K2<String, Int> {
|
||||||
return K1<Int>().K2<String>()
|
return K1<Int>().K2<String>()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
FILE fqName:<root> fileName:/samConversionToGeneric.kt
|
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
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J<@[FlexibleNullability] kotlin.String?> declared in <root>'
|
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J<kotlin.String> declared in <root>'
|
||||||
TYPE_OP type=<root>.J<@[FlexibleNullability] kotlin.String?> origin=SAM_CONVERSION typeOperand=<root>.J<@[FlexibleNullability] kotlin.String?>
|
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_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?
|
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?
|
VALUE_PARAMETER name:x index:0 type:@[FlexibleNullability] kotlin.String?
|
||||||
|
|||||||
+2
-2
@@ -1,8 +1,8 @@
|
|||||||
fun test1(): J<@FlexibleNullability String?> {
|
fun test1(): J<String> {
|
||||||
return local fun <anonymous>(x: @FlexibleNullability String?): @FlexibleNullability String? {
|
return local fun <anonymous>(x: @FlexibleNullability String?): @FlexibleNullability String? {
|
||||||
return x
|
return x
|
||||||
}
|
}
|
||||||
/*-> J<@FlexibleNullability String?> */
|
/*-> J<String> */
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test10(fn: Function1<Int, String>) {
|
fun test10(fn: Function1<Int, String>) {
|
||||||
|
|||||||
+16
-16
@@ -1,29 +1,29 @@
|
|||||||
FILE fqName:<root> fileName:/javaConstructorWithTypeParameters.kt
|
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
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun test1 (): <root>.J1<@[FlexibleNullability] kotlin.Int?> declared in <root>'
|
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<@[FlexibleNullability] kotlin.Int?> origin=null
|
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1' type=<root>.J1<kotlin.Int> origin=null
|
||||||
<class: T1>: @[FlexibleNullability] kotlin.Int?
|
<class: T1>: kotlin.Int
|
||||||
FUN name:test2 visibility:public modality:FINAL <> () returnType:<root>.J1<@[FlexibleNullability] kotlin.Int?>
|
FUN name:test2 visibility:public modality:FINAL <> () returnType:<root>.J1<kotlin.Int>
|
||||||
BLOCK_BODY
|
BLOCK_BODY
|
||||||
RETURN type=kotlin.Nothing from='public final fun test2 (): <root>.J1<@[FlexibleNullability] kotlin.Int?> declared in <root>'
|
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<@[FlexibleNullability] kotlin.Int?> origin=null
|
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>: @[FlexibleNullability] kotlin.Int?
|
<class: T1>: kotlin.Int
|
||||||
<X1>: @[FlexibleNullability] kotlin.Int?
|
<X1>: @[FlexibleNullability] kotlin.Int?
|
||||||
x1: CONST Int type=kotlin.Int value=1
|
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>
|
VALUE_PARAMETER name:j1 index:0 type:<root>.J1<kotlin.Any>
|
||||||
BLOCK_BODY
|
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>'
|
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<@[FlexibleNullability] kotlin.Int?, kotlin.Any> origin=null
|
CONSTRUCTOR_CALL 'public constructor <init> () declared in <root>.J1.J2' type=<root>.J1.J2<kotlin.Int, kotlin.Any> origin=null
|
||||||
<class: T2>: @[FlexibleNullability] kotlin.Int?
|
<class: T2>: kotlin.Int
|
||||||
$outer: GET_VAR 'j1: <root>.J1<kotlin.Any> declared in <root>.test3' type=<root>.J1<kotlin.Any> origin=null
|
$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>
|
VALUE_PARAMETER name:j1 index:0 type:<root>.J1<kotlin.Any>
|
||||||
BLOCK_BODY
|
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>'
|
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<@[FlexibleNullability] kotlin.Int?, kotlin.Any> origin=null
|
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>: @[FlexibleNullability] kotlin.Int?
|
<class: T2>: kotlin.Int
|
||||||
<X2>: @[FlexibleNullability] 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
|
$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
|
x2: CONST Int type=kotlin.Int value=1
|
||||||
|
|||||||
+8
-8
@@ -1,15 +1,15 @@
|
|||||||
fun test1(): J1<@FlexibleNullability Int?> {
|
fun test1(): J1<Int> {
|
||||||
return J1<@FlexibleNullability Int?>()
|
return J1<Int>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test2(): J1<@FlexibleNullability Int?> {
|
fun test2(): J1<Int> {
|
||||||
return J1<@FlexibleNullability Int?, @FlexibleNullability Int?>(x1 = 1)
|
return J1<Int, @FlexibleNullability Int?>(x1 = 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test3(j1: J1<Any>): J2<@FlexibleNullability Int?, Any> {
|
fun test3(j1: J1<Any>): J2<Int, Any> {
|
||||||
return j1.J2<@FlexibleNullability Int?>()
|
return j1.J2<Int>()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun test4(j1: J1<Any>): J2<@FlexibleNullability Int?, Any> {
|
fun test4(j1: J1<Any>): J2<Int, Any> {
|
||||||
return j1.J2<@FlexibleNullability Int?, @FlexibleNullability Int?>(x2 = 1)
|
return j1.J2<Int, @FlexibleNullability Int?>(x2 = 1)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user