From 5355d0455398f750fa65e3dd0cb1d21ad0258e06 Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 2 Aug 2021 13:53:13 +0200 Subject: [PATCH] FIR: enhance in/out-variant type arguments --- .../resolveWithStdlib/j+k/MapCompute.fir.txt | 2 +- .../resolveWithStdlib/j+k/MyMap.fir.txt | 2 +- .../resolveWithStdlib/j+k/mapMerge.fir.txt | 2 +- .../resolveWithStdlib/removeIf.fir.txt | 2 +- .../typeAliasWithForEach.fir.txt | 2 +- .../fir/java/enhancement/javaTypeUtils.kt | 97 +++++++------------ .../AnnotatedBoundsOfWildcard.fir.kt | 36 ++++--- .../strictMode/WildcardsWithDefault.fir.kt | 38 ++++++++ .../strictMode/WildcardsWithDefault.kt | 1 - .../warnMode/AnnotatedBoundsOfWildcard.fir.kt | 24 ++--- .../warnMode/WildcardsWithDefault.fir.kt | 35 +++++++ .../jspecify/warnMode/WildcardsWithDefault.kt | 1 - .../forEachRemainingNullability.fir.kt | 41 -------- .../forEachRemainingNullability.kt | 1 + .../firProblems/AbstractMutableMap.fir.txt | 48 +++++---- .../ir/irText/firProblems/kt19251.fir.kt.txt | 4 +- .../ir/irText/firProblems/kt19251.fir.txt | 12 +-- 17 files changed, 186 insertions(+), 162 deletions(-) create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.fir.kt create mode 100644 compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.fir.kt diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MapCompute.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MapCompute.fir.txt index aa05ac37ed7..a16707991c1 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MapCompute.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MapCompute.fir.txt @@ -1,6 +1,6 @@ FILE: MapCompute.kt public final fun R|kotlin/collections/MutableMap>|.initAndAdd(key: R|kotlin/String|, value: R|D|): R|kotlin/Unit| { - this@R|/initAndAdd|.R|SubstitutionOverride?|>|(R|/key|, = compute@fun (: R|ft|, maybeValues: R|ft, kotlin/collections/MutableSet?>|): R|ft, kotlin/collections/MutableSet?>| { + this@R|/initAndAdd|.R|SubstitutionOverride?|>|(R|/key|, = compute@fun (: R|kotlin/String|, maybeValues: R|kotlin/collections/MutableSet?|): R|kotlin/collections/MutableSet?| { lval setOfValues: R|kotlin/collections/MutableSet| = R|/maybeValues| ?: R|kotlin/collections/mutableSetOf|() R|/setOfValues|.R|SubstitutionOverride|(R|/value|) ^ R|/setOfValues| diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt index cba70009f69..310934ba8f0 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/MyMap.fir.txt @@ -28,7 +28,7 @@ FILE: test.kt ) lval otherResult: R|kotlin/String| = R|/map|.R|SubstitutionOverride|(String(key), String(value)) lval anotherResult: R|kotlin/String?| = R|/map|.R|SubstitutionOverride|(String(key), String(value)) - R|/map|.R|SubstitutionOverride|( = forEach@fun (key: R|ft|, value: R|ft|): R|kotlin/Unit| { + R|/map|.R|SubstitutionOverride|( = forEach@fun (key: R|kotlin/String|, value: R|kotlin/String|): R|kotlin/Unit| { R|kotlin/io/println|((R|/key|, String(: ), R|/value|)) R|/key|.R|kotlin/String.length| R|/value|.R|kotlin/String.length| diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/mapMerge.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/mapMerge.fir.txt index 16bc7f57abb..4ebacf9a3d9 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/mapMerge.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/j+k/mapMerge.fir.txt @@ -1,6 +1,6 @@ FILE: mapMerge.kt public final fun foo(x: R|kotlin/collections/MutableMap>|): R|kotlin/Unit| { - R|/x|.R|SubstitutionOverride?|>|(String(), R|kotlin/collections/listOf|(String()), = merge@fun (a: R|ft, kotlin/collections/List?>|, b: R|ft, kotlin/collections/List?>|): R|ft, kotlin/collections/List?>| { + R|/x|.R|SubstitutionOverride?|>|(String(), R|kotlin/collections/listOf|(String()), = merge@fun (a: R|@EnhancedNullability kotlin/collections/List|, b: R|@EnhancedNullability kotlin/collections/List|): R|kotlin/collections/List?| { ^ R|/a|.R|kotlin/collections/plus|(R|/b|) } ) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/removeIf.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/removeIf.fir.txt index b0f49bd57b8..75061b177e7 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/removeIf.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/removeIf.fir.txt @@ -1,6 +1,6 @@ FILE: removeIf.kt public final fun test(collection: R|kotlin/collections/MutableCollection|): R|kotlin/Unit| { - R|/collection|.R|SubstitutionOverride|( = removeIf@fun (it: R|ft|): R|kotlin/Boolean| { + R|/collection|.R|SubstitutionOverride|( = removeIf@fun (it: R|kotlin/Boolean|): R|kotlin/Boolean| { ^ R|/it| } ) diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/typeAliasWithForEach.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/typeAliasWithForEach.fir.txt index c078a00f462..ddb63dd4154 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/typeAliasWithForEach.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/typeAliasWithForEach.fir.txt @@ -10,7 +10,7 @@ FILE: typeAliasWithForEach.kt public final typealias Arguments = R|kotlin/collections/Map| public final fun R|Arguments|.deepCopy(): R|Arguments| { lval result: R|java/util/HashMap, ft>| = R|java/util/HashMap.HashMap||, R|ft|>() - this@R|/deepCopy|.R|SubstitutionOverride|( = forEach@fun (key: R|ft|, value: R|ft|): R|kotlin/Unit| { + this@R|/deepCopy|.R|SubstitutionOverride|( = forEach@fun (key: R|kotlin/String|, value: R|ArgsInfo|): R|kotlin/Unit| { R|/result|.R|kotlin/collections/set||, R|ft|>(R|/key|, R|/ArgsInfoImpl.ArgsInfoImpl|(R|/value|)) } ) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt index 556c71f1cf4..cf380ef1aa2 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/javaTypeUtils.kt @@ -55,7 +55,7 @@ internal fun FirJavaTypeRef.enhance( ): FirResolvedTypeRef = buildResolvedTypeRef { val subtreeSizes = mutableListOf().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 -): 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, - @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(val result: T, val enhancementAttribute: ConeAttribute<*>?) - -private fun T.noChange(): EnhancementResult = EnhancementResult(this, null) -private fun T.enhancedNullability(): EnhancementResult = EnhancementResult(this, CompilerConeAttributes.EnhancedNullability) - -private fun ConeKotlinType.getEnhancedNullability( - qualifiers: JavaTypeQualifiers, - position: TypeComponentPosition -): EnhancementResult { - 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( diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/AnnotatedBoundsOfWildcard.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/AnnotatedBoundsOfWildcard.fir.kt index 685a6497713..07e1aeea7fb 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/AnnotatedBoundsOfWildcard.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/AnnotatedBoundsOfWildcard.fir.kt @@ -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(aNotNullNotNullNull) + // jspecify_nullness_mismatch + b.extendsAsIs(aNotNullNullNotNull) + // jspecify_nullness_mismatch + b.extendsAsIs(aNotNullNullNull) b.extendsNotNull(aNotNullNotNullNotNull) - b.extendsNotNull(aNotNullNotNullNull) - b.extendsNotNull(aNotNullNullNotNull) - b.extendsNotNull(aNotNullNullNull) + // jspecify_nullness_mismatch + b.extendsNotNull(aNotNullNotNullNull) + // jspecify_nullness_mismatch + b.extendsNotNull(aNotNullNullNotNull) + // jspecify_nullness_mismatch + b.extendsNotNull(aNotNullNullNull) b.extendsNullable(aNotNullNotNullNotNull) - b.extendsNullable(aNotNullNotNullNull) - b.extendsNullable(aNotNullNullNotNull) - b.extendsNullable(aNotNullNullNull) + // jspecify_nullness_mismatch + b.extendsNullable(aNotNullNotNullNull) + // jspecify_nullness_mismatch + b.extendsNullable(aNotNullNullNotNull) + // jspecify_nullness_mismatch + b.extendsNullable(aNotNullNullNull) b.noBounds(aNotNullNotNullNotNull) - b.noBounds(aNotNullNotNullNull) - b.noBounds(aNotNullNullNotNull) - b.noBounds(aNotNullNullNull) + // jspecify_nullness_mismatch + b.noBounds(aNotNullNotNullNull) + // jspecify_nullness_mismatch + b.noBounds(aNotNullNullNotNull) + // jspecify_nullness_mismatch + b.noBounds(aNotNullNullNull) } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.fir.kt new file mode 100644 index 00000000000..47c43e55f27 --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.fir.kt @@ -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 a) {} +} + +// FILE: A.java +import org.jspecify.nullness.*; + +public class A {} + +// FILE: main.kt +fun main( + aNotNullNotNullNotNull: A, + aNotNullNotNullNull: A, + aNotNullNullNotNull: A, + aNotNullNullNull: A, + b: WildcardsWithDefault +): Unit { + b.noBoundsNotNull(aNotNullNotNullNotNull) + b.noBoundsNotNull(aNotNullNotNullNull) + b.noBoundsNotNull(aNotNullNullNotNull) + b.noBoundsNotNull(aNotNullNullNull) + + b.noBoundsNullable(aNotNullNotNullNotNull) + // jspecify_nullness_mismatch + b.noBoundsNullable(aNotNullNotNullNull) + // jspecify_nullness_mismatch + b.noBoundsNullable(aNotNullNullNotNull) + // jspecify_nullness_mismatch + b.noBoundsNullable(aNotNullNullNull) +} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.kt index b49a858209c..8dd33227973 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/WildcardsWithDefault.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // JSPECIFY_STATE: strict // MUTE_FOR_PSI_CLASS_FILES_READING diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/AnnotatedBoundsOfWildcard.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/AnnotatedBoundsOfWildcard.fir.kt index fb11c5e00c1..86cd9390c03 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/AnnotatedBoundsOfWildcard.fir.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/AnnotatedBoundsOfWildcard.fir.kt @@ -59,22 +59,22 @@ fun main( b.superNullable(aAnyNotNullNullNull) b.extendsAsIs(aNotNullNotNullNotNull) - b.extendsAsIs(aNotNullNotNullNull) - b.extendsAsIs(aNotNullNullNotNull) - b.extendsAsIs(aNotNullNullNull) + b.extendsAsIs(aNotNullNotNullNull) + b.extendsAsIs(aNotNullNullNotNull) + b.extendsAsIs(aNotNullNullNull) b.extendsNotNull(aNotNullNotNullNotNull) - b.extendsNotNull(aNotNullNotNullNull) - b.extendsNotNull(aNotNullNullNotNull) - b.extendsNotNull(aNotNullNullNull) + b.extendsNotNull(aNotNullNotNullNull) + b.extendsNotNull(aNotNullNullNotNull) + b.extendsNotNull(aNotNullNullNull) b.extendsNullable(aNotNullNotNullNotNull) - b.extendsNullable(aNotNullNotNullNull) - b.extendsNullable(aNotNullNullNotNull) - b.extendsNullable(aNotNullNullNull) + b.extendsNullable(aNotNullNotNullNull) + b.extendsNullable(aNotNullNullNotNull) + b.extendsNullable(aNotNullNullNull) b.noBounds(aNotNullNotNullNotNull) - b.noBounds(aNotNullNotNullNull) - b.noBounds(aNotNullNullNotNull) - b.noBounds(aNotNullNullNull) + b.noBounds(aNotNullNotNullNull) + b.noBounds(aNotNullNullNotNull) + b.noBounds(aNotNullNullNull) } diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.fir.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.fir.kt new file mode 100644 index 00000000000..95331be917c --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.fir.kt @@ -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 a) {} +} + +// FILE: A.java +import org.jspecify.nullness.*; + +public class A {} + +// FILE: main.kt +fun main( + aNotNullNotNullNotNull: A, + aNotNullNotNullNull: A, + aNotNullNullNotNull: A, + aNotNullNullNull: A, + b: WildcardsWithDefault +): Unit { + b.noBoundsNotNull(aNotNullNotNullNotNull) + b.noBoundsNotNull(aNotNullNotNullNull) + b.noBoundsNotNull(aNotNullNullNotNull) + b.noBoundsNotNull(aNotNullNullNull) + + b.noBoundsNullable(aNotNullNotNullNotNull) + b.noBoundsNullable(aNotNullNotNullNull) + b.noBoundsNullable(aNotNullNullNotNull) + b.noBoundsNullable(aNotNullNullNull) +} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.kt index 689eccab52b..0af8c19f3c8 100644 --- a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.kt +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/WildcardsWithDefault.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL // JSPECIFY_STATE: warn // MUTE_FOR_PSI_CLASS_FILES_READING diff --git a/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.fir.kt b/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.fir.kt deleted file mode 100644 index cc02859a6fe..00000000000 --- a/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.fir.kt +++ /dev/null @@ -1,41 +0,0 @@ -// FULL_JDK - -import java.util.function.Consumer - -abstract class MyIt1 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - -abstract class MyIt2 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - -abstract class MyIt3 : Iterator { - override fun forEachRemaining(x: Consumer?) {} -} - -abstract class MyIt4 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - -abstract class MyIt5 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - -abstract class MyIt6 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - -abstract class MyIt7 : Iterator { - override fun forEachRemaining(x: Consumer) {} -} - - -fun foo(x: Iterator, y: Iterator) { - x.forEachRemaining(null) - - x.forEachRemaining { it -> it.length } - x.forEachRemaining { it -> it?.length } - y.forEachRemaining { it -> it.length } - y.forEachRemaining { it -> it?.length } -} diff --git a/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.kt b/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.kt index 7e816910275..1c06c87e3de 100644 --- a/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.kt +++ b/compiler/testData/diagnostics/tests/targetedBuiltIns/forEachRemainingNullability.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL // FULL_JDK import java.util.function.Consumer diff --git a/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.txt b/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.txt index cb122f583f9..57ff09aa389 100644 --- a/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.txt +++ b/compiler/testData/ir/irText/firProblems/AbstractMutableMap.fir.txt @@ -70,31 +70,37 @@ FILE fqName: fileName:/AbstractMutableMap.kt overridden: public open fun (): @[FlexibleNullability] kotlin.collections.Collection<@[FlexibleNullability] V of kotlin.collections.AbstractMutableMap?>? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:java.util.AbstractMap - FUN FAKE_OVERRIDE name:replaceAll visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:kotlin.Unit [fake_override] + FUN FAKE_OVERRIDE name:replaceAll visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap, out V of .MyMap>) returnType:kotlin.Unit [fake_override] overridden: - public open fun replaceAll (p0: @[EnhancedNullability] java.util.function.BiFunction): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap + public open fun replaceAll (p0: @[EnhancedNullability] java.util.function.BiFunction): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap - VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?> - FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] V of .MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:V of .MyMap? [fake_override] + VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap, out V of .MyMap> + FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] V of .MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in @[EnhancedNullability] V of .MyMap, out V of .MyMap?>) returnType:V of .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): 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): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:K of .MyMap VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] V of .MyMap - VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?> - FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[FlexibleNullability] K of .MyMap?, p1:V of .MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:V of .MyMap? [fake_override] + VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in @[EnhancedNullability] V of .MyMap, out V of .MyMap?> + FUN FAKE_OVERRIDE name:merge visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[FlexibleNullability] K of .MyMap?, p1:V of .MyMap, p2:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap, out V of .MyMap?>) returnType:V of .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): 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): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] K of .MyMap? VALUE_PARAMETER name:p1 index:1 type:V of .MyMap - VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?> - FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:V of .MyMap? [fake_override] + VALUE_PARAMETER name:p2 index:2 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap, out V of .MyMap?> + FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in @[EnhancedNullability] V of .MyMap, out V of .MyMap?>) returnType:V of .MyMap? [fake_override] overridden: - public open fun computeIfPresent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction): 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): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:K of .MyMap - VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?> + VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in @[EnhancedNullability] V of .MyMap, out V of .MyMap?> + FUN FAKE_OVERRIDE name:computeIfPresent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:@[FlexibleNullability] K of .MyMap?, p1:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in V of .MyMap, out V of .MyMap?>) returnType:V of .MyMap? [fake_override] + overridden: + public open fun computeIfPresent (p0: @[FlexibleNullability] K of kotlin.collections.AbstractMutableMap?, p1: @[EnhancedNullability] java.util.function.BiFunction): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap + $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap + VALUE_PARAMETER name:p0 index:0 type:@[FlexibleNullability] K of .MyMap? + VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in V of .MyMap, out V of .MyMap?> FUN FAKE_OVERRIDE name:putIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:V of .MyMap) returnType:V of .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: fileName:/AbstractMutableMap.kt $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:K of .MyMap VALUE_PARAMETER name:p1 index:1 type:V of .MyMap - FUN FAKE_OVERRIDE name:computeIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.Function.MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:V of .MyMap [fake_override] + FUN FAKE_OVERRIDE name:computeIfAbsent visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.Function.MyMap, out V of .MyMap>) returnType:V of .MyMap [fake_override] overridden: - public open fun computeIfAbsent (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.Function): 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): V of kotlin.collections.AbstractMutableMap [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:K of .MyMap - VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.Function.MyMap?, out @[FlexibleNullability] V of .MyMap?> - FUN FAKE_OVERRIDE name:compute visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?>) returnType:V of .MyMap? [fake_override] + VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.Function.MyMap, out V of .MyMap> + FUN FAKE_OVERRIDE name:compute visibility:public modality:OPEN <> ($this:kotlin.collections.MutableMap, p0:K of .MyMap, p1:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap?, out V of .MyMap?>) returnType:V of .MyMap? [fake_override] overridden: - public open fun compute (p0: K of kotlin.collections.AbstractMutableMap, p1: @[EnhancedNullability] java.util.function.BiFunction): 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): V of kotlin.collections.AbstractMutableMap? [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.MutableMap VALUE_PARAMETER name:p0 index:0 type:K of .MyMap - VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap?, in @[FlexibleNullability] V of .MyMap?, out @[FlexibleNullability] V of .MyMap?> + VALUE_PARAMETER name:p1 index:1 type:@[EnhancedNullability] java.util.function.BiFunction.MyMap, in V of .MyMap?, out V of .MyMap?> FUN FAKE_OVERRIDE name:containsKey visibility:public modality:OPEN <> ($this:java.util.AbstractMap, p0:@[FlexibleNullability] K of .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: fileName:/AbstractMutableMap.kt overridden: public open fun (): kotlin.Int [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:java.util.AbstractMap - FUN FAKE_OVERRIDE name:forEach visibility:public modality:OPEN <> ($this:kotlin.collections.Map, p0:@[EnhancedNullability] java.util.function.BiConsumer.MyMap?, in @[FlexibleNullability] V of .MyMap?>) returnType:kotlin.Unit [fake_override] + FUN FAKE_OVERRIDE name:forEach visibility:public modality:OPEN <> ($this:kotlin.collections.Map, p0:@[EnhancedNullability] java.util.function.BiConsumer.MyMap, in V of .MyMap>) returnType:kotlin.Unit [fake_override] overridden: - public open fun forEach (p0: @[EnhancedNullability] java.util.function.BiConsumer): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap + public open fun forEach (p0: @[EnhancedNullability] java.util.function.BiConsumer): kotlin.Unit [fake_override] declared in kotlin.collections.AbstractMutableMap $this: VALUE_PARAMETER name: type:kotlin.collections.Map - VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiConsumer.MyMap?, in @[FlexibleNullability] V of .MyMap?> + VALUE_PARAMETER name:p0 index:0 type:@[EnhancedNullability] java.util.function.BiConsumer.MyMap, in V of .MyMap> FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this: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 diff --git a/compiler/testData/ir/irText/firProblems/kt19251.fir.kt.txt b/compiler/testData/ir/irText/firProblems/kt19251.fir.kt.txt index 64524a7e5d8..e3c2c5e64c4 100644 --- a/compiler/testData/ir/irText/firProblems/kt19251.fir.kt.txt +++ b/compiler/testData/ir/irText/firProblems/kt19251.fir.kt.txt @@ -4,9 +4,9 @@ fun box(): String { return TODO() } /*-> Fun */ - return map.computeIfAbsent(p0 = fn, p1 = local fun (it: @FlexibleNullability Fun?): @FlexibleNullability String? { + return map.computeIfAbsent(p0 = fn, p1 = local fun (it: Fun): String { return "OK" } - /*-> @EnhancedNullability Function<@FlexibleNullability Fun?, @FlexibleNullability String?> */) + /*-> @EnhancedNullability Function */) } diff --git a/compiler/testData/ir/irText/firProblems/kt19251.fir.txt b/compiler/testData/ir/irText/firProblems/kt19251.fir.txt index f7752354de7..f936467d0cf 100644 --- a/compiler/testData/ir/irText/firProblems/kt19251.fir.txt +++ b/compiler/testData/ir/irText/firProblems/kt19251.fir.txt @@ -14,13 +14,13 @@ FILE fqName: fileName:/test.kt RETURN type=kotlin.Nothing from='local final fun (it: @[FlexibleNullability] kotlin.String?): @[FlexibleNullability] kotlin.String? declared in .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 ' - CALL 'public open fun computeIfAbsent (p0: K of kotlin.collections.MutableMap, p1: @[EnhancedNullability] java.util.function.Function): 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): V of kotlin.collections.MutableMap declared in kotlin.collections.MutableMap' type=kotlin.String origin=null $this: GET_VAR 'val map: kotlin.collections.MutableMap<.Fun, kotlin.String> [val] declared in .box' type=kotlin.collections.MutableMap<.Fun, kotlin.String> origin=null p0: GET_VAR 'val fn: .Fun [val] declared in .box' type=.Fun origin=null - p1: TYPE_OP type=@[EnhancedNullability] java.util.function.Function<@[FlexibleNullability] .Fun?, @[FlexibleNullability] kotlin.String?> origin=SAM_CONVERSION typeOperand=@[EnhancedNullability] java.util.function.Function<@[FlexibleNullability] .Fun?, @[FlexibleNullability] kotlin.String?> - FUN_EXPR type=kotlin.Function1<@[FlexibleNullability] .Fun?, @[FlexibleNullability] kotlin.String?> origin=LAMBDA - FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (it:@[FlexibleNullability] .Fun?) returnType:@[FlexibleNullability] kotlin.String? - VALUE_PARAMETER name:it index:0 type:@[FlexibleNullability] .Fun? + p1: TYPE_OP type=@[EnhancedNullability] java.util.function.Function<.Fun, kotlin.String> origin=SAM_CONVERSION typeOperand=@[EnhancedNullability] java.util.function.Function<.Fun, kotlin.String> + FUN_EXPR type=kotlin.Function1<.Fun, kotlin.String> origin=LAMBDA + FUN LOCAL_FUNCTION_FOR_LAMBDA name: visibility:local modality:FINAL <> (it:.Fun) returnType:kotlin.String + VALUE_PARAMETER name:it index:0 type:.Fun BLOCK_BODY - RETURN type=kotlin.Nothing from='local final fun (it: @[FlexibleNullability] .Fun?): @[FlexibleNullability] kotlin.String? declared in .box' + RETURN type=kotlin.Nothing from='local final fun (it: .Fun): kotlin.String declared in .box' CONST String type=kotlin.String value="OK"