diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt index d0d677fb61b..e0df603af60 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Simple.fir.txt @@ -1,9 +1,9 @@ public open class Simple : R|kotlin/Any| { @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - @R|javax/annotation/Nullable|() public open fun foo(@R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|kotlin/String?| + @R|javax/annotation/Nullable|() public open fun foo(@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|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|Simple| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt index 3d41c1703cd..260ec9f45c4 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/Strange.fir.txt @@ -1,9 +1,9 @@ public open class Strange : R|kotlin/Any| { @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.UNKNOWN|()) public open field field: R|ft!| - @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|kotlin/String|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|kotlin/CharSequence?|): R|kotlin/String?| + @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.MAYBE|()) public open fun foo(@R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.ALWAYS|()) x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/Nonnull|(R|javax/annotation/meta/When.NEVER|()) y: R|kotlin/CharSequence?|): R|kotlin/String?| - @R|javax/annotation/Nonnull|() public open fun bar(): R|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|Strange| 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 9df2309bf85..372f9072a83 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,11 +1,11 @@ @R|FieldsAreNullable|() public open class A : R|kotlin/Any| { public open field field: R|kotlin/String?| - @R|javax/annotation/Nonnull|() public open field nonNullField: R|kotlin/String| + @R|javax/annotation/Nonnull|() public open field nonNullField: R|@EnhancedNullability kotlin/String| - public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| + public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| - @R|javax/annotation/Nonnull|() public open fun bar(): R|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|A| 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 678b989dda3..336254b586f 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,7 +1,7 @@ @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| - @R|spr/ForceFlexibility|() public open fun bar(x: R|ft!|, @R|javax/annotation/Nonnull|() y: R|kotlin/CharSequence|): R|ft!| + @R|spr/ForceFlexibility|() public open fun bar(x: R|ft!|, @R|javax/annotation/Nonnull|() y: R|@EnhancedNullability kotlin/CharSequence|): R|ft!| public constructor(): R|A| diff --git a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibleOverOverrides.fir.txt b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibleOverOverrides.fir.txt index d7cb91761aa..cb880e8f5c5 100644 --- a/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibleOverOverrides.fir.txt +++ b/compiler/fir/analysis-tests/testData/enhancement/jsr305/typeQualifierDefault/ForceFlexibleOverOverrides.fir.txt @@ -11,13 +11,13 @@ } public abstract interface B : R|kotlin/Any| { - public abstract fun foo(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit| + public abstract fun foo(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/Unit| - public abstract fun bar(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit| + public abstract fun bar(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/Unit| - public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit| + public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/Unit| - public abstract fun foobar(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/Unit| + public abstract fun foobar(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/Unit| } @R|java/lang/annotation/Retention|(R|java/lang/annotation/RetentionPolicy.RUNTIME|()) @R|java/lang/annotation/Documented|() @R|spr/UnknownNullability|() @R|javax/annotation/meta/TypeQualifierDefault|((R|java/lang/annotation/ElementType.METHOD|(), R|java/lang/annotation/ElementType.PARAMETER|())) public abstract annotation class ForceFlexibility : R|kotlin/Annotation| { 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 04d67d4e2f8..3701f432020 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 @@ -9,7 +9,7 @@ @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|kotlin/String|): R|kotlin/String| + public open fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/String| public constructor(): R|A| @@ -25,13 +25,13 @@ @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|kotlin/String|): R|kotlin/CharSequence| + public abstract fun baz(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/CharSequence| } @R|NullableApi|() public open class B : R|A|, R|AInt| { public open fun foo1(x: R|kotlin/String|): R|kotlin/String| - @R|javax/annotation/Nonnull|() public open fun foo2(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|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?| @@ -43,7 +43,7 @@ @R|NonNullApi|() public open class C : R|A|, R|AInt| { public open fun foo1(x: R|kotlin/String|): R|kotlin/String| - public open fun foo2(@R|javax/annotation/Nonnull|() x: R|kotlin/String|): R|kotlin/String| + public open fun foo2(@R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|): R|kotlin/String| public open fun bar1(x: R|kotlin/String?|): R|kotlin/String?| 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 5c8964984e6..123389cd236 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,9 +1,9 @@ @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|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| + 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|ft!| - @R|javax/annotation/Nonnull|() public open fun bar(): R|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|A| 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 69e4ed575dc..8e60410e6d3 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,9 +1,9 @@ public open class A : R|kotlin/Any| { @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| + public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| - @R|javax/annotation/Nonnull|() public open fun bar(): R|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|test/A| @@ -11,9 +11,9 @@ public open class A : R|kotlin/Any| { public open class A2 : R|kotlin/Any| { @R|javax/annotation/Nullable|() public open field field: R|kotlin/String?| - public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| + public open fun foo(q: R|ft!|, @R|javax/annotation/Nonnull|() x: R|@EnhancedNullability kotlin/String|, @R|javax/annotation/CheckForNull|() y: R|kotlin/CharSequence?|): R|ft!| - @R|javax/annotation/Nonnull|() public open fun bar(): R|kotlin/String| + @R|javax/annotation/Nonnull|() public open fun bar(): R|@EnhancedNullability kotlin/String| public constructor(): R|test2/A2| 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 535431ee6ff..37a6135f0d4 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 @@ -328,7 +328,11 @@ internal fun List.computeTypeAttributesForJavaType(): ConeAtt computeTypeAttributes { classId -> when (classId) { CompilerConeAttributes.EnhancedNullability.ANNOTATION_CLASS_ID -> add(CompilerConeAttributes.EnhancedNullability) - // TODO: Need to handle others too? E.g., COMPATQUAL_NONNULL_ANNOTATION_ID in NOT_NULL_ANNOTATION_IDS -> add(CompilerConeAttributes.EnhancedNullability) + JAVAX_NONNULL_ANNOTATION_ID, + JAVAX_CHECKFORNULL_ANNOTATION_ID, + COMPATQUAL_NONNULL_ANNOTATION_ID, + ANDROIDX_RECENTLY_NON_NULL_ANNOTATION_ID + -> add(CompilerConeAttributes.EnhancedNullability) } } diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt index 4f42a617130..59d1b235b3a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/nullabilityUtils.kt @@ -83,8 +83,9 @@ private fun FirAnnotationCall.extractNullabilityTypeFromArgument(): NullabilityQ private val NULLABLE_ANNOTATION_IDS = NULLABLE_ANNOTATIONS.map { ClassId.topLevel(it) } val NOT_NULL_ANNOTATION_IDS = NOT_NULL_ANNOTATIONS.map { ClassId.topLevel(it) } -private val JAVAX_NONNULL_ANNOTATION_ID = ClassId.topLevel(JAVAX_NONNULL_ANNOTATION) +val JAVAX_NONNULL_ANNOTATION_ID = ClassId.topLevel(JAVAX_NONNULL_ANNOTATION) +val JAVAX_CHECKFORNULL_ANNOTATION_ID = ClassId.topLevel(JAVAX_CHECKFORNULL_ANNOTATION) private val COMPATQUAL_NULLABLE_ANNOTATION_ID = ClassId.topLevel(COMPATQUAL_NULLABLE_ANNOTATION) -private val COMPATQUAL_NONNULL_ANNOTATION_ID = ClassId.topLevel(COMPATQUAL_NONNULL_ANNOTATION) -private val ANDROIDX_RECENTLY_NON_NULL_ANNOTATION_ID = ClassId.topLevel(ANDROIDX_RECENTLY_NON_NULL_ANNOTATION) +val COMPATQUAL_NONNULL_ANNOTATION_ID = ClassId.topLevel(COMPATQUAL_NONNULL_ANNOTATION) +val ANDROIDX_RECENTLY_NON_NULL_ANNOTATION_ID = ClassId.topLevel(ANDROIDX_RECENTLY_NON_NULL_ANNOTATION) private val ANDROIDX_RECENTLY_NULLABLE_ANNOTATION_ID = ClassId.topLevel(ANDROIDX_RECENTLY_NULLABLE_ANNOTATION)