diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java index 47bc89327dc..7836942a62c 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated extend runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -796,6 +802,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaTestGenerated extend runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index 7e7a9ca869e..55fc4a582f5 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -742,6 +742,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingT runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -854,6 +860,12 @@ public class FirPsiOldFrontendForeignAnnotationsCompiledJavaWithPsiClassReadingT runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java index 8e11515d260..952454228f8 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated.java @@ -742,6 +742,12 @@ public class FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated extends runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -854,6 +860,12 @@ public class FirPsiOldFrontendForeignAnnotationsSourceJavaTestGenerated extends runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt new file mode 100644 index 00000000000..3e7316d6d7b --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt @@ -0,0 +1,29 @@ +// FIR_IDENTICAL +// JSPECIFY_STATE: strict + +// FILE: SomeJavaClass.java + +import org.jspecify.annotations.*; + +public class SomeJavaClass { + @NonNull + public String foo() { return ""; } + + @Nullable + public String bar() { return ""; } +} + +// FILE: test.kt + +class DerivedNullable : SomeJavaClass() { + // jspecify_nullness_mismatch + override fun foo(): String? { return null } + + override fun bar(): String? { return null } +} + +class DerivedNonNull : SomeJavaClass() { + override fun foo(): String { return "" } + + override fun bar(): String { return "" } +} diff --git a/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt new file mode 100644 index 00000000000..b401f46b88c --- /dev/null +++ b/compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt @@ -0,0 +1,28 @@ +// FIR_IDENTICAL +// JSPECIFY_STATE: warn + +// FILE: SomeJavaClass.java + +import org.jspecify.annotations.*; + +public class SomeJavaClass { + @NonNull + public String foo() { return ""; } + + @Nullable + public String bar() { return ""; } +} + +// FILE: test.kt + +class DerivedNullable : SomeJavaClass() { + override fun foo(): String? { return null } + + override fun bar(): String? { return null } +} + +class DerivedNonNull : SomeJavaClass() { + override fun foo(): String { return "" } + + override fun bar(): String { return "" } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java index 4eae38fe573..aac52b9a68c 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaTestGenerated.java @@ -684,6 +684,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -796,6 +802,12 @@ public class ForeignAnnotationsCompiledJavaTestGenerated extends AbstractForeign runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java index e821f33077a..ea8602228c2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated.java @@ -742,6 +742,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -854,6 +860,12 @@ public class ForeignAnnotationsCompiledJavaWithPsiClassReadingTestGenerated exte runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java index 494ab606d8b..17bd7f6f469 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ForeignAnnotationsSourceJavaTestGenerated.java @@ -742,6 +742,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/strictMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { @@ -854,6 +860,12 @@ public class ForeignAnnotationsSourceJavaTestGenerated extends AbstractForeignAn runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/Defaults.kt"); } + @Test + @TestMetadata("DerivedAsNullableOrNotNull.kt") + public void testDerivedAsNullableOrNotNull() throws Exception { + runTest("compiler/testData/diagnostics/foreignAnnotationsTests/java8Tests/jspecify/warnMode/DerivedAsNullableOrNotNull.kt"); + } + @Test @TestMetadata("IgnoreAnnotations.kt") public void testIgnoreAnnotations() throws Exception { diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AbstractAnnotationTypeQualifierResolver.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AbstractAnnotationTypeQualifierResolver.kt index 56766be9a35..6a18a7e4aa1 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AbstractAnnotationTypeQualifierResolver.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/AbstractAnnotationTypeQualifierResolver.kt @@ -185,6 +185,7 @@ abstract class AbstractAnnotationTypeQualifierResolver( in NULLABLE_ANNOTATIONS -> NullabilityQualifier.NULLABLE in NOT_NULL_ANNOTATIONS -> NullabilityQualifier.NOT_NULL JSPECIFY_OLD_NULLABLE, JSPECIFY_NULLABLE -> NullabilityQualifier.NULLABLE + JSPECIFY_NON_NULL -> NullabilityQualifier.NOT_NULL JSPECIFY_OLD_NULLNESS_UNKNOWN, JSPECIFY_NULLNESS_UNKNOWN -> NullabilityQualifier.FORCE_FLEXIBILITY JAVAX_NONNULL_ANNOTATION -> when (annotation.enumArguments(onlyValue = false).firstOrNull()) { diff --git a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.kt b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.kt index 608d083e84c..4124c8e0843 100644 --- a/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.kt +++ b/core/compiler.common.jvm/src/org/jetbrains/kotlin/load/java/JvmAnnotationNames.kt @@ -25,6 +25,7 @@ val JSPECIFY_OLD_NULL_MARKED = FqName("org.jspecify.nullness.NullMarked") val JSPECIFY_NULLABLE = FqName("org.jspecify.annotations.Nullable") val JSPECIFY_NULLNESS_UNKNOWN = FqName("org.jspecify.annotations.NullnessUnspecified") val JSPECIFY_NULL_MARKED = FqName("org.jspecify.annotations.NullMarked") +val JSPECIFY_NON_NULL = FqName("org.jspecify.annotations.NonNull") val NULLABLE_ANNOTATIONS = listOf( JvmAnnotationNames.JETBRAINS_NULLABLE_ANNOTATION,