diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/javaMethodWithExternalNotNullAnnotation.txt b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethodWithExternalNotNullAnnotation.txt index 5e510a4ea57..23961486487 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/javaMethodWithExternalNotNullAnnotation.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/javaMethodWithExternalNotNullAnnotation.txt @@ -24,7 +24,7 @@ KtFunctionSymbol: receiverParameter: null returnType: KtFlexibleType: annotationsList: [] - type: kotlin/String! + type: Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String! symbolKind: CLASS_MEMBER typeParameters: [] valueParameters: [] diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/externalJavaAnnotation.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/externalJavaAnnotation.txt index 418b8dfff60..5c1c881f2b9 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/externalJavaAnnotation.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/wholeDeclaration/externalJavaAnnotation.txt @@ -3,12 +3,12 @@ FIR element: FirSimpleFunctionImpl FIR source kind: KtRealSourceElementKind FIR element rendered: -public final [ResolvedTo(BODY_RESOLVE)] fun test(): R|kotlin/String!| { +public final [ResolvedTo(BODY_RESOLVE)] fun test(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| { ^test R|/ClassWithExternalAnnotatedMembers.ClassWithExternalAnnotatedMembers|().R|/ClassWithExternalAnnotatedMembers.externalNotNullMethod|() } FIR FILE: FILE: [ResolvedTo(IMPORTS)] usage.kt - public final [ResolvedTo(BODY_RESOLVE)] fun test(): R|kotlin/String!| { + public final [ResolvedTo(BODY_RESOLVE)] fun test(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| { ^test R|/ClassWithExternalAnnotatedMembers.ClassWithExternalAnnotatedMembers|().R|/ClassWithExternalAnnotatedMembers.externalNotNullMethod|() } \ No newline at end of file diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt index b743ae636b4..78e5c7b697a 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/NonNullNever.fir.txt @@ -5,7 +5,7 @@ public open class NonNullNever : R|kotlin/Any| { @R|javax/annotation/Nonnull|(when = R|javax/annotation/meta/When.NEVER|) public open field field: R|kotlin/String?| - @R|MyNullable|() public open fun foo(@R|javax/annotation/Nonnull|(when = R|javax/annotation/meta/When.NEVER|) x: R|kotlin/String?|, @R|MyNullable|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + @R|MyNullable|() public open fun foo(@R|javax/annotation/Nonnull|(when = R|javax/annotation/meta/When.NEVER|) x: R|kotlin/String?|, @R|MyNullable|() y: R|Enhanced for warning(kotlin/CharSequence?) kotlin/CharSequence!|): R|Enhanced for warning(kotlin/String?) kotlin/String!| public constructor(): R|NonNullNever| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt index 37c3f7b1eec..6807769b95a 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/FieldsAreNullable.fir.txt @@ -1,5 +1,5 @@ @R|FieldsAreNullable|() public open class A : R|kotlin/Any| { - public open field field: R|kotlin/String!| + public open field field: R|Enhanced for warning(kotlin/String?) kotlin/String!| @R|javax/annotation/Nonnull|() public open field nonNullField: R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt index 365f314e6d9..b6cc02979e2 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibility.fir.txt @@ -1,5 +1,5 @@ @R|spr/NonNullApi|() public open class A : R|kotlin/Any| { - public open fun foo(x: R|kotlin/String!|, @R|spr/Nullable|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|spr/Nullable|() y: R|Enhanced for warning(kotlin/CharSequence?) kotlin/CharSequence!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| @R|spr/ForceFlexibility|() public open fun bar(x: R|kotlin/String!|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|kotlin/String!| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt index 7ab662a7684..345fcc1a19c 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/NullabilityFromOverridden.fir.txt @@ -1,55 +1,55 @@ @R|NonNullApi|() public open class A : R|kotlin/Any| { - public open fun foo1(x: R|kotlin/String!|): R|kotlin/String!| + public open fun foo1(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun foo2(x: R|kotlin/String!|): R|kotlin/String!| + public open fun foo2(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun foo3(x: R|kotlin/String!|): R|kotlin/String!| + public open fun foo3(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| @R|javax/annotation/Nullable|() public open fun bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| - public open fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/String!| + public open fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| public constructor(): R|A| } @R|NonNullApi|() public abstract interface AInt : R|kotlin/Any| { - public abstract fun foo1(x: R|kotlin/String!|): R|kotlin/CharSequence!| + public abstract fun foo1(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/CharSequence) kotlin/CharSequence!| - public abstract fun foo2(x: R|kotlin/String!|): R|kotlin/CharSequence!| + public abstract fun foo2(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/CharSequence) kotlin/CharSequence!| - public abstract fun foo3(x: R|kotlin/String!|): R|kotlin/CharSequence!| + public abstract fun foo3(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/CharSequence) kotlin/CharSequence!| @R|javax/annotation/Nullable|() public abstract fun bar1(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/CharSequence?| @R|javax/annotation/Nullable|() public abstract fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/CharSequence?| - public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/CharSequence!| + public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|Enhanced for warning(@EnhancedNullability kotlin/CharSequence) kotlin/CharSequence!| } @R|NullableApi|() public open class B : R|A|, R|AInt| { - public open fun foo1(x: R|kotlin/String!|): R|kotlin/String!| + public open fun foo1(x: R|Enhanced for warning(kotlin/String?) kotlin/String!|): R|Enhanced for warning(kotlin/String?) kotlin/String!| @R|javax/annotation/Nonnull|() public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|@EnhancedNullability kotlin/String| public open fun bar1(x: R|kotlin/String?|): R|kotlin/String?| - public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|kotlin/String!| + public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|Enhanced for warning(kotlin/String?) kotlin/String!| public constructor(): R|B| } @R|NonNullApi|() public open class C : R|A|, R|AInt| { - public open fun foo1(x: R|kotlin/String!|): R|kotlin/String!| + public open fun foo1(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/String!| + public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| public open fun bar1(x: R|kotlin/String?|): R|kotlin/String?| @R|javax/annotation/Nullable|() public open fun bar2(@R|javax/annotation/Nullable|() x: R|kotlin/String?|): R|kotlin/String?| - public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|kotlin/String!| + public open fun baz(x: R|@EnhancedNullability kotlin/String|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| public constructor(): R|C| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt index 5641a47cc44..3223b5adad3 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/OverridingDefaultQualifier.fir.txt @@ -1,24 +1,24 @@ @R|NonNullApi|() public open class A : R|kotlin/Any| { - public open field field: R|kotlin/String!| + public open field field: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun foo(x: R|kotlin/String!|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - @R|NullableApi|() public open fun foobar(x: R|kotlin/String!|, @R|NonNullApi|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + @R|NullableApi|() public open fun foobar(x: R|Enhanced for warning(kotlin/String?) kotlin/String!|, @R|NonNullApi|() y: R|Enhanced for warning(@EnhancedNullability kotlin/CharSequence) kotlin/CharSequence!|): R|Enhanced for warning(kotlin/String?) kotlin/String!| - public open fun bar(): R|kotlin/String!| + public open fun bar(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| @R|javax/annotation/Nullable|() public open fun baz(): R|ft?, kotlin/collections/List?>| public constructor(): R|A| @R|NullableApi|() public open inner class B : R|kotlin/Any| { - public open field field: R|kotlin/String!| + public open field field: R|Enhanced for warning(kotlin/String?) kotlin/String!| - public open fun foo(x: R|kotlin/String!|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(kotlin/String?) kotlin/String!|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|Enhanced for warning(kotlin/String?) kotlin/String!| - @R|NonNullApi|() public open fun foobar(x: R|kotlin/String!|, @R|NullableApi|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + @R|NonNullApi|() public open fun foobar(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|NullableApi|() y: R|Enhanced for warning(kotlin/CharSequence?) kotlin/CharSequence!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun bar(): R|kotlin/String!| + public open fun bar(): R|Enhanced for warning(kotlin/String?) kotlin/String!| @R|javax/annotation/Nullable|() public open fun baz(): R|ft?, kotlin/collections/List?>| @@ -26,13 +26,13 @@ } @R|FieldsAreNullable|() public open inner class C : R|kotlin/Any| { - public open field field: R|kotlin/String!| + public open field field: R|Enhanced for warning(kotlin/String?) kotlin/String!| - public open fun foo(x: R|kotlin/String!|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - @R|NullableApi|() public open fun foobar(x: R|kotlin/String!|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|kotlin/String!| + @R|NullableApi|() public open fun foobar(x: R|Enhanced for warning(kotlin/String?) kotlin/String!|, @R|javax/annotation/Nullable|() y: R|kotlin/CharSequence?|): R|Enhanced for warning(kotlin/String?) kotlin/String!| - public open fun bar(): R|kotlin/String!| + public open fun bar(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| @R|javax/annotation/Nullable|() public open fun baz(): R|ft?, kotlin/collections/List?>| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt index cf9c73e7660..f28f4a2f51c 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefault.fir.txt @@ -1,7 +1,7 @@ @R|javax/annotation/ParametersAreNonnullByDefault|() public open class A : R|kotlin/Any| { @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|kotlin/String!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String!| + public open fun foo(q: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String!| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt index cbc09931bdc..ed53b80d7d4 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ParametersAreNonnullByDefaultPackage.fir.txt @@ -1,7 +1,7 @@ public open class A : R|kotlin/Any| { @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|kotlin/String!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String!| + public open fun foo(q: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String!| @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt index 4aa8f9a5638..893203d60a2 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullable.fir.txt @@ -1,11 +1,11 @@ @R|spr/NonNullApi|() public open class A : R|kotlin/Any| { public open field field: R|kotlin/String!| - public open fun foo(x: R|kotlin/String!|, @R|spr/Nullable|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|spr/Nullable|() y: R|Enhanced for warning(kotlin/CharSequence?) kotlin/CharSequence!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun bar(): R|kotlin/String!| + public open fun bar(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - @R|spr/Nullable|() public open fun baz(): R|ft, kotlin/collections/List?>| + @R|spr/Nullable|() public open fun baz(): R|ft?) kotlin/collections/MutableList, kotlin/collections/List?>| public constructor(): R|A| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt index 2249215624a..26574ce5a9e 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/SpringNullablePackage.fir.txt @@ -1,11 +1,11 @@ public open class A : R|kotlin/Any| { public open field field: R|kotlin/String!| - public open fun foo(x: R|kotlin/String!|, @R|spr/Nullable|() y: R|kotlin/CharSequence!|): R|kotlin/String!| + public open fun foo(x: R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!|, @R|spr/Nullable|() y: R|Enhanced for warning(kotlin/CharSequence?) kotlin/CharSequence!|): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - public open fun bar(): R|kotlin/String!| + public open fun bar(): R|Enhanced for warning(@EnhancedNullability kotlin/String) kotlin/String!| - @R|spr/Nullable|() public open fun baz(): R|ft, kotlin/collections/List?>| + @R|spr/Nullable|() public open fun baz(): R|ft?) kotlin/collections/MutableList, kotlin/collections/List?>| public constructor(): R|test/A| diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancedTypeForWarningAttribute.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancedTypeForWarningAttribute.kt new file mode 100644 index 00000000000..58b43a95f9f --- /dev/null +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/EnhancedTypeForWarningAttribute.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.java.enhancement + +import org.jetbrains.kotlin.fir.types.ConeAttributeWithConeType +import org.jetbrains.kotlin.fir.types.ConeAttributes +import org.jetbrains.kotlin.fir.types.ConeKotlinType +import org.jetbrains.kotlin.fir.types.renderForDebugging +import kotlin.reflect.KClass + +class EnhancedTypeForWarningAttribute( + override val coneType: ConeKotlinType, +) : ConeAttributeWithConeType() { + override fun union(other: EnhancedTypeForWarningAttribute?): EnhancedTypeForWarningAttribute? = null + override fun intersect(other: EnhancedTypeForWarningAttribute?): EnhancedTypeForWarningAttribute? = null + override fun add(other: EnhancedTypeForWarningAttribute?): EnhancedTypeForWarningAttribute = other ?: this + override fun isSubtypeOf(other: EnhancedTypeForWarningAttribute?): Boolean = true + override fun toString(): String = "Enhanced for warning(${coneType.renderForDebugging()})" + override fun copyWith(newType: ConeKotlinType): EnhancedTypeForWarningAttribute = EnhancedTypeForWarningAttribute(newType) + + override val key: KClass + get() = EnhancedTypeForWarningAttribute::class + + override val keepInInferredDeclarationType: Boolean + get() = true +} + +val ConeAttributes.enhancedTypeForWarning: EnhancedTypeForWarningAttribute? by ConeAttributes.attributeAccessor() + +val ConeKotlinType.enhancedTypeForWarning: ConeKotlinType? + get() = attributes.enhancedTypeForWarning?.coneType \ No newline at end of file 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 131b9722839..4fed763b7ee 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 @@ -40,14 +40,10 @@ private fun ConeKotlinType.enhanceConeKotlinType( ): ConeKotlinType? { return when (this) { is ConeFlexibleType -> { - // Currently, the warnings are left unsupported in K2 (see KT-57307) - // But modulo information for warnings, we reproduce the K1 behavior: if head type qualifier is for warnings, we totally ignore + // We reproduce the K1 behavior: if head type qualifier is for warnings, we totally ignore // enhancement on its arguments, too (see JavaTypeEnhancement.enhancePossiblyFlexible). // It's not totally correct, but tolerable since we would like to avoid excessive breaking changes and the warnings should be // anyway reported. - // TODO: support not loosing information for warnings here, too - if (qualifiers(index).isNullabilityQualifierForWarning) return null - val lowerResult = lowerBound.enhanceInflexibleType( session, TypeComponentPosition.FLEXIBLE_LOWER, qualifiers, index, subtreeSizes ) @@ -96,9 +92,36 @@ private fun ConeSimpleKotlinType.enhanceInflexibleType( val effectiveQualifiers = qualifiers(index) val enhancedTag = lookupTag.enhanceMutability(effectiveQualifiers, position) - // TODO: implement warnings (see KT-57307) - val nullabilityFromQualifiers = effectiveQualifiers.nullability - .takeIf { shouldEnhance && !effectiveQualifiers.isNullabilityQualifierForWarning } + val nullabilityFromQualifiers = effectiveQualifiers.nullability.takeIf { shouldEnhance } + + val enhanced = enhanceInflexibleType( + session, + qualifiers, + index, + subtreeSizes, + isFromDefinitelyNotNullType, + effectiveQualifiers.definitelyNotNull, + nullabilityFromQualifiers, + enhancedTag + ) + + return if (effectiveQualifiers.isNullabilityQualifierForWarning && enhanced != null) { + this.withAttributes(attributes.plus(EnhancedTypeForWarningAttribute(enhanced))) + } else { + enhanced + } +} + +private fun ConeLookupTagBasedType.enhanceInflexibleType( + session: FirSession, + qualifiers: IndexedJavaTypeQualifiers, + index: Int, + subtreeSizes: List, + isFromDefinitelyNotNullType: Boolean, + isDefinitelyNotNull: Boolean, + nullabilityFromQualifiers: NullabilityQualifier?, + enhancedTag: ConeClassifierLookupTag, +): ConeSimpleKotlinType? { val enhancedIsNullable = when (nullabilityFromQualifiers) { NullabilityQualifier.NULLABLE -> true NullabilityQualifier.NOT_NULL -> false @@ -126,7 +149,7 @@ private fun ConeSimpleKotlinType.enhanceInflexibleType( val mergedArguments = Array(typeArguments.size) { enhancedArguments[it] ?: typeArguments[it] } val mergedAttributes = if (shouldAddAttribute) attributes + CompilerConeAttributes.EnhancedNullability else attributes val enhancedType = enhancedTag.constructType(mergedArguments, enhancedIsNullable, mergedAttributes) - return if (effectiveQualifiers.definitelyNotNull || (isFromDefinitelyNotNullType && nullabilityFromQualifiers == null)) + return if (isDefinitelyNotNull || (isFromDefinitelyNotNullType && nullabilityFromQualifiers == null)) ConeDefinitelyNotNullType.create(enhancedType, session.typeContext) ?: enhancedType else enhancedType