FIR: enhance in/out-variant type arguments

This commit is contained in:
pyos
2021-08-02 13:53:13 +02:00
committed by teamcityserver
parent 8e122397b0
commit 5355d04553
17 changed files with 186 additions and 162 deletions
@@ -1,6 +1,6 @@
FILE: MapCompute.kt
public final fun <D> R|kotlin/collections/MutableMap<kotlin/String, kotlin/collections/MutableSet<D>>|.initAndAdd(key: R|kotlin/String|, value: R|D|): R|kotlin/Unit| {
this@R|/initAndAdd|.R|SubstitutionOverride<kotlin/collections/MutableMap.compute: R|kotlin/collections/MutableSet<D>?|>|(R|<local>/key|, <L> = compute@fun <anonymous>(<unused var>: R|ft<kotlin/String, kotlin/String?>|, maybeValues: R|ft<kotlin/collections/MutableSet<D>, kotlin/collections/MutableSet<D>?>|): R|ft<kotlin/collections/MutableSet<D>, kotlin/collections/MutableSet<D>?>| <inline=NoInline> {
this@R|/initAndAdd|.R|SubstitutionOverride<kotlin/collections/MutableMap.compute: R|kotlin/collections/MutableSet<D>?|>|(R|<local>/key|, <L> = compute@fun <anonymous>(<unused var>: R|kotlin/String|, maybeValues: R|kotlin/collections/MutableSet<D>?|): R|kotlin/collections/MutableSet<D>?| <inline=NoInline> {
lval setOfValues: R|kotlin/collections/MutableSet<D>| = R|<local>/maybeValues| ?: R|kotlin/collections/mutableSetOf|<R|D|>()
R|<local>/setOfValues|.R|SubstitutionOverride<kotlin/collections/MutableSet.add: R|kotlin/Boolean|>|(R|<local>/value|)
^ R|<local>/setOfValues|
@@ -28,7 +28,7 @@ FILE: test.kt
)
lval otherResult: R|kotlin/String| = R|<local>/map|.R|SubstitutionOverride<kotlin/collections/MutableMap.getOrDefault: R|kotlin/String|>|(String(key), String(value))
lval anotherResult: R|kotlin/String?| = R|<local>/map|.R|SubstitutionOverride<kotlin/collections/MutableMap.replace: R|kotlin/String?|>|(String(key), String(value))
R|<local>/map|.R|SubstitutionOverride<kotlin/collections/MutableMap.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>|, value: R|ft<kotlin/String, kotlin/String?>|): R|kotlin/Unit| <inline=NoInline> {
R|<local>/map|.R|SubstitutionOverride<kotlin/collections/MutableMap.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|kotlin/String|, value: R|kotlin/String|): R|kotlin/Unit| <inline=NoInline> {
R|kotlin/io/println|(<strcat>(R|<local>/key|, String(: ), R|<local>/value|))
R|<local>/key|.R|kotlin/String.length|
R|<local>/value|.R|kotlin/String.length|
@@ -1,6 +1,6 @@
FILE: mapMerge.kt
public final fun foo(x: R|kotlin/collections/MutableMap<kotlin/String, kotlin/collections/List<kotlin/String>>|): R|kotlin/Unit| {
R|<local>/x|.R|SubstitutionOverride<kotlin/collections/MutableMap.merge: R|kotlin/collections/List<kotlin/String>?|>|(String(), R|kotlin/collections/listOf|<R|kotlin/String|>(String()), <L> = merge@fun <anonymous>(a: R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>|, b: R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>|): R|ft<kotlin/collections/List<kotlin/String>, kotlin/collections/List<kotlin/String>?>| <inline=NoInline> {
R|<local>/x|.R|SubstitutionOverride<kotlin/collections/MutableMap.merge: R|kotlin/collections/List<kotlin/String>?|>|(String(), R|kotlin/collections/listOf|<R|kotlin/String|>(String()), <L> = merge@fun <anonymous>(a: R|@EnhancedNullability kotlin/collections/List<kotlin/String>|, b: R|@EnhancedNullability kotlin/collections/List<kotlin/String>|): R|kotlin/collections/List<kotlin/String>?| <inline=NoInline> {
^ R|<local>/a|.R|kotlin/collections/plus|<R|kotlin/String|>(R|<local>/b|)
}
)
@@ -1,6 +1,6 @@
FILE: removeIf.kt
public final fun test(collection: R|kotlin/collections/MutableCollection<kotlin/Boolean>|): R|kotlin/Unit| {
R|<local>/collection|.R|SubstitutionOverride<kotlin/collections/MutableCollection.removeIf: R|kotlin/Boolean|>|(<L> = removeIf@fun <anonymous>(it: R|ft<kotlin/Boolean, kotlin/Boolean?>|): R|kotlin/Boolean| <inline=NoInline> {
R|<local>/collection|.R|SubstitutionOverride<kotlin/collections/MutableCollection.removeIf: R|kotlin/Boolean|>|(<L> = removeIf@fun <anonymous>(it: R|kotlin/Boolean|): R|kotlin/Boolean| <inline=NoInline> {
^ R|<local>/it|
}
)
@@ -10,7 +10,7 @@ FILE: typeAliasWithForEach.kt
public final typealias Arguments = R|kotlin/collections/Map<kotlin/String, ArgsInfo>|
public final fun R|Arguments|.deepCopy(): R|Arguments| {
lval result: R|java/util/HashMap<ft<kotlin/String, kotlin/String?>, ft<ArgsInfo, ArgsInfo?>>| = R|java/util/HashMap.HashMap|<R|ft<kotlin/String, kotlin/String?>|, R|ft<ArgsInfo, ArgsInfo?>|>()
this@R|/deepCopy|.R|SubstitutionOverride<kotlin/collections/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|ft<kotlin/String, kotlin/String?>|, value: R|ft<ArgsInfo, ArgsInfo?>|): R|kotlin/Unit| <inline=NoInline> {
this@R|/deepCopy|.R|SubstitutionOverride<kotlin/collections/Map.forEach: R|kotlin/Unit|>|(<L> = forEach@fun <anonymous>(key: R|kotlin/String|, value: R|ArgsInfo|): R|kotlin/Unit| <inline=NoInline> {
R|<local>/result|.R|kotlin/collections/set|<R|ft<kotlin/String, kotlin/String?>|, R|ft<ArgsInfo, ArgsInfo?>|>(R|<local>/key|, R|/ArgsInfoImpl.ArgsInfoImpl|(R|<local>/value|))
}
)
@@ -55,7 +55,7 @@ internal fun FirJavaTypeRef.enhance(
): FirResolvedTypeRef =
buildResolvedTypeRef {
val subtreeSizes = mutableListOf<Int>().apply { typeWithoutEnhancement.computeSubtreeSizes(this) }
type = typeWithoutEnhancement.enhanceConeKotlinType(session, qualifiers, 0, subtreeSizes)
type = typeWithoutEnhancement.enhanceConeKotlinType(session, qualifiers, 0, subtreeSizes) ?: typeWithoutEnhancement
annotations += this@enhance.annotations
}
@@ -79,30 +79,29 @@ private fun ConeKotlinType.enhanceConeKotlinType(
qualifiers: IndexedJavaTypeQualifiers,
index: Int,
subtreeSizes: List<Int>
): ConeKotlinType {
): ConeKotlinType? {
return when (this) {
is ConeFlexibleType -> {
val isRawType = this is ConeRawType
val lowerResult = lowerBound.enhanceInflexibleType(
session, TypeComponentPosition.FLEXIBLE_LOWER, qualifiers, index, subtreeSizes, isRawType
session, TypeComponentPosition.FLEXIBLE_LOWER, qualifiers, index, subtreeSizes
)
val upperResult = upperBound.enhanceInflexibleType(
session, TypeComponentPosition.FLEXIBLE_UPPER, qualifiers, index, subtreeSizes, isRawType
session, TypeComponentPosition.FLEXIBLE_UPPER, qualifiers, index, subtreeSizes
)
when {
lowerResult === lowerBound && upperResult === upperBound -> this
this is ConeRawType -> ConeRawType(lowerResult, upperResult)
lowerResult == null && upperResult == null -> null
this is ConeRawType -> ConeRawType(lowerResult ?: lowerBound, upperResult ?: upperBound)
else -> coneFlexibleOrSimpleType(
session, lowerResult, upperResult, isNotNullTypeParameter = qualifiers(index).isNotNullTypeParameter
session, lowerResult ?: lowerBound, upperResult ?: upperBound,
isNotNullTypeParameter = qualifiers(index).isNotNullTypeParameter
)
}
}
is ConeSimpleKotlinType -> enhanceInflexibleType(
session, TypeComponentPosition.INFLEXIBLE, qualifiers, index, subtreeSizes, isBoundOfRawType = false
session, TypeComponentPosition.INFLEXIBLE, qualifiers, index, subtreeSizes
)
else -> this
else -> null
}
}
@@ -158,69 +157,45 @@ private fun ConeKotlinType.enhanceInflexibleType(
qualifiers: IndexedJavaTypeQualifiers,
index: Int,
subtreeSizes: List<Int>,
@Suppress("UNUSED_PARAMETER") isBoundOfRawType: Boolean,
): ConeKotlinType {
): ConeKotlinType? {
require(this !is ConeFlexibleType) { "$this should not be flexible" }
val shouldEnhance = position.shouldEnhance()
if (!shouldEnhance && typeArguments.isEmpty() || this !is ConeLookupTagBasedType) {
return this
if ((!shouldEnhance && typeArguments.isEmpty()) || this !is ConeLookupTagBasedType) {
return null
}
val originalTag = lookupTag
val effectiveQualifiers = qualifiers(index)
val enhancedTag = originalTag.enhanceMutability(effectiveQualifiers, position)
val enhancedTag = lookupTag.enhanceMutability(effectiveQualifiers, position)
var wereChangesInArgs = false
val nullabilityFromQualifiers = effectiveQualifiers.nullability.takeIf { shouldEnhance }
val enhancedNullability = when (nullabilityFromQualifiers) {
NullabilityQualifier.NULLABLE -> true
NullabilityQualifier.NOT_NULL -> false
else -> isNullable
}
var globalArgIndex = index + 1
val enhancedArguments = typeArguments.map { arg ->
if (arg.kind != ProjectionKind.INVARIANT) {
globalArgIndex++
arg
} else {
require(arg is ConeKotlinType) { "Should be invariant type: $arg" }
val enhanced = arg.enhanceConeKotlinType(session, qualifiers, globalArgIndex, subtreeSizes)
globalArgIndex += subtreeSizes[globalArgIndex]
wereChangesInArgs = wereChangesInArgs || enhanced !== arg
enhanced.type
val argIndex = globalArgIndex.also { globalArgIndex += subtreeSizes[it] }
arg.type?.enhanceConeKotlinType(session, qualifiers, argIndex, subtreeSizes)?.let {
when (arg.kind) {
ProjectionKind.IN -> ConeKotlinTypeProjectionIn(it)
ProjectionKind.OUT -> ConeKotlinTypeProjectionOut(it)
ProjectionKind.STAR -> ConeStarProjection
ProjectionKind.INVARIANT -> it
}
}
}.toTypedArray()
val (enhancedNullability, enhancedNullabilityAttribute) = getEnhancedNullability(effectiveQualifiers, position)
wereChangesInArgs = wereChangesInArgs || (enhancedNullabilityAttribute != null && !this.hasEnhancedNullability)
if (!wereChangesInArgs && originalTag == enhancedTag && enhancedNullability == isNullable) {
return this
}
var attributes = this.attributes
enhancedNullabilityAttribute?.let { attributes += it }
// TODO: why all of these is needed
// val enhancement = if (effectiveQualifiers.isNotNullTypeParameter) NotNullTypeParameter(enhancedType) else enhancedType
// val nullabilityForWarning = nullabilityChanged && effectiveQualifiers.isNullabilityQualifierForWarning
// val result = if (nullabilityForWarning) wrapEnhancement(enhancement) else enhancement
return enhancedTag.constructType(enhancedArguments, enhancedNullability, attributes)
}
private data class EnhancementResult<out T>(val result: T, val enhancementAttribute: ConeAttribute<*>?)
private fun <T> T.noChange(): EnhancementResult<T> = EnhancementResult(this, null)
private fun <T> T.enhancedNullability(): EnhancementResult<T> = EnhancementResult(this, CompilerConeAttributes.EnhancedNullability)
private fun ConeKotlinType.getEnhancedNullability(
qualifiers: JavaTypeQualifiers,
position: TypeComponentPosition
): EnhancementResult<Boolean> {
if (!position.shouldEnhance()) return this.isMarkedNullable.noChange()
return when (qualifiers.nullability) {
NullabilityQualifier.NULLABLE -> true.noChange()
NullabilityQualifier.NOT_NULL -> false.enhancedNullability()
else -> this.isMarkedNullable.noChange()
val shouldAddAttribute = nullabilityFromQualifiers == NullabilityQualifier.NOT_NULL && !hasEnhancedNullability
if (lookupTag == enhancedTag && enhancedNullability == isNullable && !shouldAddAttribute && enhancedArguments.all { it == null }) {
return null // absolutely no changes
}
// TODO: val nullabilityForWarning = enhancedNullabilityAttribute != null && effectiveQualifiers.isNullabilityQualifierForWarning
val mergedArguments = Array(typeArguments.size) { enhancedArguments[it] ?: typeArguments[it] }
val mergedAttributes = if (shouldAddAttribute) attributes + CompilerConeAttributes.EnhancedNullability else attributes
return enhancedTag.constructType(mergedArguments, enhancedNullability, mergedAttributes)
}
private fun ConeClassifierLookupTag.enhanceMutability(
@@ -60,22 +60,34 @@ fun main(
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
b.extendsNotNull(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNullable(aNotNullNotNullNotNull)
b.extendsNullable(aNotNullNotNullNull)
b.extendsNullable(aNotNullNullNotNull)
b.extendsNullable(aNotNullNullNull)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.noBounds(aNotNullNotNullNotNull)
b.noBounds(aNotNullNotNullNull)
b.noBounds(aNotNullNullNotNull)
b.noBounds(aNotNullNullNull)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -0,0 +1,38 @@
// JSPECIFY_STATE: strict
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: WildcardsWithDefault.java
import org.jspecify.nullness.*;
@NullMarked
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<? extends @Nullable Object, ? extends @Nullable Object, ? extends @Nullable Object> a) {}
}
// FILE: A.java
import org.jspecify.nullness.*;
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<Any, Any, Any>,
aNotNullNotNullNull: A<Any, Any, Any?>,
aNotNullNullNotNull: A<Any, Any?, Any>,
aNotNullNullNull: A<Any, Any?, Any?>,
b: WildcardsWithDefault
): Unit {
b.noBoundsNotNull(aNotNullNotNullNotNull)
b.noBoundsNotNull(aNotNullNotNullNull)
b.noBoundsNotNull(aNotNullNullNotNull)
b.noBoundsNotNull(aNotNullNullNull)
b.noBoundsNullable(aNotNullNotNullNotNull)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
// jspecify_nullness_mismatch
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: strict
// MUTE_FOR_PSI_CLASS_FILES_READING
@@ -59,22 +59,22 @@ fun main(
b.superNullable(aAnyNotNullNullNull)
b.extendsAsIs(aNotNullNotNullNotNull)
b.extendsAsIs(aNotNullNotNullNull)
b.extendsAsIs(aNotNullNullNotNull)
b.extendsAsIs(aNotNullNullNull)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsAsIs(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNotNull(aNotNullNotNullNotNull)
b.extendsNotNull(aNotNullNotNullNull)
b.extendsNotNull(aNotNullNullNotNull)
b.extendsNotNull(aNotNullNullNull)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsNotNull(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.extendsNullable(aNotNullNotNullNotNull)
b.extendsNullable(aNotNullNotNullNull)
b.extendsNullable(aNotNullNullNotNull)
b.extendsNullable(aNotNullNullNull)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.extendsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
b.noBounds(aNotNullNotNullNotNull)
b.noBounds(aNotNullNotNullNull)
b.noBounds(aNotNullNullNotNull)
b.noBounds(aNotNullNullNull)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.noBounds(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -0,0 +1,35 @@
// JSPECIFY_STATE: warn
// MUTE_FOR_PSI_CLASS_FILES_READING
// FILE: WildcardsWithDefault.java
import org.jspecify.nullness.*;
@NullMarked
public class WildcardsWithDefault {
public void noBoundsNotNull(A<?, ?, ?> a) {}
public void noBoundsNullable(A<? extends @Nullable Object, ? extends @Nullable Object, ? extends @Nullable Object> a) {}
}
// FILE: A.java
import org.jspecify.nullness.*;
public class A <T extends Object, E extends @Nullable Object, F extends @NullnessUnspecified Object> {}
// FILE: main.kt
fun main(
aNotNullNotNullNotNull: A<Any, Any, Any>,
aNotNullNotNullNull: A<Any, Any, Any?>,
aNotNullNullNotNull: A<Any, Any?, Any>,
aNotNullNullNull: A<Any, Any?, Any?>,
b: WildcardsWithDefault
): Unit {
b.noBoundsNotNull(aNotNullNotNullNotNull)
b.noBoundsNotNull(aNotNullNotNullNull)
b.noBoundsNotNull(aNotNullNullNotNull)
b.noBoundsNotNull(aNotNullNullNull)
b.noBoundsNullable(aNotNullNotNullNotNull)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNotNullNull<!>)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNotNull<!>)
b.noBoundsNullable(<!ARGUMENT_TYPE_MISMATCH!>aNotNullNullNull<!>)
}
@@ -1,4 +1,3 @@
// FIR_IDENTICAL
// JSPECIFY_STATE: warn
// MUTE_FOR_PSI_CLASS_FILES_READING
@@ -1,41 +0,0 @@
// FULL_JDK
import java.util.function.Consumer
abstract class MyIt1<out T> : Iterator<T> {
override fun forEachRemaining(x: Consumer<in T>) {}
}
abstract class MyIt2<out T> : Iterator<T> {
override fun forEachRemaining(x: Consumer<in T?>) {}
}
abstract class MyIt3<out T> : Iterator<T> {
<!NOTHING_TO_OVERRIDE!>override<!> fun forEachRemaining(x: Consumer<in T>?) {}
}
abstract class MyIt4 : Iterator<String?> {
override fun forEachRemaining(x: Consumer<in String?>) {}
}
abstract class MyIt5 : Iterator<String> {
override fun forEachRemaining(x: Consumer<in String>) {}
}
abstract class MyIt6 : Iterator<String?> {
<!NOTHING_TO_OVERRIDE!>override<!> fun forEachRemaining(x: Consumer<in String>) {}
}
abstract class MyIt7 : Iterator<String> {
override fun forEachRemaining(x: Consumer<in String?>) {}
}
fun foo(x: Iterator<String>, y: Iterator<String?>) {
x.forEachRemaining(<!NULL_FOR_NONNULL_TYPE!>null<!>)
x.forEachRemaining { it -> it.length }
x.forEachRemaining { it -> it?.length }
y.forEachRemaining { it -> it<!UNSAFE_CALL!>.<!>length }
y.forEachRemaining { it -> it?.length }
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// FULL_JDK
import java.util.function.Consumer
@@ -70,31 +70,37 @@ FILE fqName:<root> fileName:/AbstractMutableMap.kt
overridden:
public open fun <get-values> (): @[FlexibleNullability] kotlin.collections.Collection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractMap<K of java.util.AbstractMap, V of java.util.AbstractMap>
FUN FAKE_OVERRIDE name:replaceAll visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:kotlin.Unit [fake_override]
FUN FAKE_OVERRIDE name:replaceAll visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in V of <root>.MyMap, out V of <root>.MyMap>) returnType:kotlin.Unit [fake_override]
overridden:
public open fun replaceAll (p0: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun replaceAll (p0: @[EnhancedNullability] java.util.function.BiFunction<in K of kotlin.collections.AbstractMutableMap, in V of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap>): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] V of <root>.MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in V of <root>.MyMap, out V of <root>.MyMap>
FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] V of <root>.MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction<in @[EnhancedNullability] V of <root>.MyMap, in @[EnhancedNullability] V of <root>.MyMap, out V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun merge (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] V of kotlin.collections.AbstractMutableMap, p2: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun merge (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] V of kotlin.collections.AbstractMutableMap, p2: @[EnhancedNullability] java.util.function.BiFunction<in @[EnhancedNullability] V of kotlin.collections.AbstractMutableMap, in @[EnhancedNullability] V of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] V of <root>.MyMap
VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:@[FlexibleNullability] K of <root>.MyMap?, p1:V of <root>.MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction<in @[EnhancedNullability] V of <root>.MyMap, in @[EnhancedNullability] V of <root>.MyMap, out V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:@[FlexibleNullability] K of <root>.MyMap?, p1:V of <root>.MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction<in V of <root>.MyMap, in V of <root>.MyMap, out V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun merge (p0: @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, p1: V of kotlin.collections.AbstractMutableMap, p2: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun merge (p0: @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, p1: V of kotlin.collections.AbstractMutableMap, p2: @[EnhancedNullability] java.util.function.BiFunction<in V of kotlin.collections.AbstractMutableMap, in V of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] K of <root>.MyMap?
VALUE_PARAMETER name:p1 index:1 type:V of <root>.MyMap
VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] V of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction<in V of <root>.MyMap, in V of <root>.MyMap, out V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in @[EnhancedNullability] V of <root>.MyMap, out V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun computeIfPresent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun computeIfPresent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction<in K of kotlin.collections.AbstractMutableMap, in @[EnhancedNullability] V of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in @[EnhancedNullability] V of <root>.MyMap, out V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:@[FlexibleNullability] K of <root>.MyMap?, p1:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in V of <root>.MyMap, out V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun computeIfPresent (p0: @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, p1: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, in V of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] K of <root>.MyMap?
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in V of <root>.MyMap, out V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:putIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:V of <root>.MyMap) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun putIfAbsent (p0: K of kotlin.collections.AbstractMutableMap, p1: V of kotlin.collections.AbstractMutableMap): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
@@ -114,18 +120,18 @@ FILE fqName:<root> fileName:/AbstractMutableMap.kt
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:V of <root>.MyMap
FUN FAKE_OVERRIDE name:computeIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.Function<in @[FlexibleNullability] K of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:V of <root>.MyMap [fake_override]
FUN FAKE_OVERRIDE name:computeIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.Function<in K of <root>.MyMap, out V of <root>.MyMap>) returnType:V of <root>.MyMap [fake_override]
overridden:
public open fun computeIfAbsent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.Function<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun computeIfAbsent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.Function<in K of kotlin.collections.AbstractMutableMap, out V of kotlin.collections.AbstractMutableMap>): V of kotlin.collections.AbstractMutableMap [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.Function<in @[FlexibleNullability] K of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:compute visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.Function<in K of <root>.MyMap, out V of <root>.MyMap>
FUN FAKE_OVERRIDE name:compute visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>, p0:K of <root>.MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in V of <root>.MyMap?, out V of <root>.MyMap?>) returnType:V of <root>.MyMap? [fake_override]
overridden:
public open fun compute (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?, out @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun compute (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction<in K of kotlin.collections.AbstractMutableMap, in V of kotlin.collections.AbstractMutableMap?, out V of kotlin.collections.AbstractMutableMap?>): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.MutableMap<K of kotlin.collections.MutableMap, V of kotlin.collections.MutableMap>
VALUE_PARAMETER name:p0 index:0 type:K of <root>.MyMap
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?, out @[FlexibleNullability] V of <root>.MyMap?>
VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction<in K of <root>.MyMap, in V of <root>.MyMap?, out V of <root>.MyMap?>
FUN FAKE_OVERRIDE name:containsKey visibility:public modality:OPEN <> ($this:java.util.AbstractMap<K of java.util.AbstractMap, V of java.util.AbstractMap>, p0:@[FlexibleNullability] K of <root>.MyMap?) returnType:kotlin.Boolean [fake_override]
overridden:
public open fun containsKey (p0: @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?): kotlin.Boolean [fake_override] declared in kotlin.collections.AbstractMutableMap
@@ -162,11 +168,11 @@ FILE fqName:<root> fileName:/AbstractMutableMap.kt
overridden:
public open fun <get-size> (): kotlin.Int [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:java.util.AbstractMap<K of java.util.AbstractMap, V of java.util.AbstractMap>
FUN FAKE_OVERRIDE name:forEach visibility:public modality:OPEN <> ($this:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>, p0:@[EnhancedNullability] java.util.function.BiConsumer<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?>) returnType:kotlin.Unit [fake_override]
FUN FAKE_OVERRIDE name:forEach visibility:public modality:OPEN <> ($this:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>, p0:@[EnhancedNullability] java.util.function.BiConsumer<in K of <root>.MyMap, in V of <root>.MyMap>) returnType:kotlin.Unit [fake_override]
overridden:
public open fun forEach (p0: @[EnhancedNullability] java.util.function.BiConsumer<in @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, in @[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap
public open fun forEach (p0: @[EnhancedNullability] java.util.function.BiConsumer<in K of kotlin.collections.AbstractMutableMap, in V of kotlin.collections.AbstractMutableMap>): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap
$this: VALUE_PARAMETER name:<this> type:kotlin.collections.Map<K of kotlin.collections.Map, V of kotlin.collections.Map>
VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiConsumer<in @[FlexibleNullability] K of <root>.MyMap?, in @[FlexibleNullability] V of <root>.MyMap?>
VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiConsumer<in K of <root>.MyMap, in V of <root>.MyMap>
FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:java.util.AbstractMap<K of java.util.AbstractMap, V of java.util.AbstractMap>, p0:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator]
overridden:
public open fun equals (p0: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in kotlin.collections.AbstractMutableMap
+2 -2
View File
@@ -4,9 +4,9 @@ fun box(): String {
return TODO()
}
/*-> Fun */
return map.computeIfAbsent(p0 = fn, p1 = local fun <anonymous>(it: @FlexibleNullability Fun?): @FlexibleNullability String? {
return map.computeIfAbsent(p0 = fn, p1 = local fun <anonymous>(it: Fun): String {
return "OK"
}
/*-> @EnhancedNullability Function<@FlexibleNullability Fun?, @FlexibleNullability String?> */)
/*-> @EnhancedNullability Function<Fun, String> */)
}
+6 -6
View File
@@ -14,13 +14,13 @@ FILE fqName:<root> fileName:/test.kt
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in <root>.box'
CALL 'public final fun TODO (): kotlin.Nothing [inline] declared in kotlin.StandardKt' type=kotlin.Nothing origin=null
RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in <root>'
CALL 'public open fun computeIfAbsent (p0: K of kotlin.collections.MutableMap, p1: @[EnhancedNullability] java.util.function.Function<in @[FlexibleNullability] K of kotlin.collections.MutableMap?, out @[FlexibleNullability] V of kotlin.collections.MutableMap?>): V of kotlin.collections.MutableMap declared in kotlin.collections.MutableMap' type=kotlin.String origin=null
CALL 'public open fun computeIfAbsent (p0: K of kotlin.collections.MutableMap, p1: @[EnhancedNullability] java.util.function.Function<in K of kotlin.collections.MutableMap, out V of kotlin.collections.MutableMap>): V of kotlin.collections.MutableMap declared in kotlin.collections.MutableMap' type=kotlin.String origin=null
$this: GET_VAR 'val map: kotlin.collections.MutableMap<<root>.Fun, kotlin.String> [val] declared in <root>.box' type=kotlin.collections.MutableMap<<root>.Fun, kotlin.String> origin=null
p0: GET_VAR 'val fn: <root>.Fun [val] declared in <root>.box' type=<root>.Fun origin=null
p1: TYPE_OP type=@[EnhancedNullability] java.util.function.Function<@[FlexibleNullability] <root>.Fun?, @[FlexibleNullability] kotlin.String?> origin=SAM_CONVERSION typeOperand=@[EnhancedNullability] java.util.function.Function<@[FlexibleNullability] <root>.Fun?, @[FlexibleNullability] kotlin.String?>
FUN_EXPR type=kotlin.Function1<@[FlexibleNullability] <root>.Fun?, @[FlexibleNullability] kotlin.String?> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:@[FlexibleNullability] <root>.Fun?) returnType:@[FlexibleNullability] kotlin.String?
VALUE_PARAMETER name:it index:0 type:@[FlexibleNullability] <root>.Fun?
p1: TYPE_OP type=@[EnhancedNullability] java.util.function.Function<<root>.Fun, kotlin.String> origin=SAM_CONVERSION typeOperand=@[EnhancedNullability] java.util.function.Function<<root>.Fun, kotlin.String>
FUN_EXPR type=kotlin.Function1<<root>.Fun, kotlin.String> origin=LAMBDA
FUN LOCAL_FUNCTION_FOR_LAMBDA name:<anonymous> visibility:local modality:FINAL <> (it:<root>.Fun) returnType:kotlin.String
VALUE_PARAMETER name:it index:0 type:<root>.Fun
BLOCK_BODY
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: @[FlexibleNullability] <root>.Fun?): @[FlexibleNullability] kotlin.String? declared in <root>.box'
RETURN type=kotlin.Nothing from='local final fun <anonymous> (it: <root>.Fun): kotlin.String declared in <root>.box'
CONST String type=kotlin.String value="OK"