From ab93b530f161626c1b43e0751b1c8851ed37572e Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Tue, 17 Feb 2015 07:47:08 +0300 Subject: [PATCH] Don't use annotations after nullability was forced upon a platform type #KT-6762 Fixed #KT-6763 Fixed --- .../load/kotlin/KotlinJvmCheckerProvider.kt | 2 +- .../inferenceInConditionals.kt | 31 +++++++++++++++++++ .../inferenceInConditionals.txt | 5 +++ .../notNullAfterSafeCall.kt | 20 ++++++++++++ .../notNullAfterSafeCall.txt | 3 ++ ...notNullTypeMarkedWithNullableAnnotation.kt | 26 ++++++++++++++++ ...otNullTypeMarkedWithNullableAnnotation.txt | 3 ++ .../checkers/JetDiagnosticsTestGenerated.java | 18 +++++++++++ 8 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.txt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.txt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.kt create mode 100644 compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.txt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt index 6d932e958d4..65b0ceb99a7 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/load/kotlin/KotlinJvmCheckerProvider.kt @@ -159,7 +159,7 @@ public class JavaNullabilityWarningsChecker : AdditionalTypeChecker { private fun JetType.mustNotBeNull(): NullabilityInformationSource? { if (!isFlexible() && !TypeUtils.isNullableType(this)) return NullabilityInformationSource.KOTLIN - if (getAnnotations().isMarkedNotNull()) return NullabilityInformationSource.JAVA + if (!isMarkedNullable() && getAnnotations().isMarkedNotNull()) return NullabilityInformationSource.JAVA return null } diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.kt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.kt new file mode 100644 index 00000000000..2028b23d1f4 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.kt @@ -0,0 +1,31 @@ +// FILE: p/J.java + +package p; + +import org.jetbrains.annotations.*; +import java.util.*; + +public class J { + @NotNull + public String nn() { return ""; } + + @Nullable + public List n() { return null; } +} + +// FILE: k.kt + +import p.* + +fun safeCall(c: J?) { + c?.nn()?.length() +} + +fun ifelse(c: J): Any? { + return if (true) c.nn() else null +} + +fun elvis(c: J): Any? { + return null ?: c.nn() +} + diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.txt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.txt new file mode 100644 index 00000000000..3cd68f13413 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.txt @@ -0,0 +1,5 @@ +package + +internal fun elvis(/*0*/ c: p.J): kotlin.Any? +internal fun ifelse(/*0*/ c: p.J): kotlin.Any? +internal fun safeCall(/*0*/ c: p.J?): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.kt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.kt new file mode 100644 index 00000000000..47bd945635a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.kt @@ -0,0 +1,20 @@ +// FILE: p/J.java + +package p; + +import org.jetbrains.annotations.*; + +public class J { + public @NotNull String nn() { return ""; } +} + +// FILE: k.kt + +import p.J + +fun test(j: J?) { + val s = j?.nn() + if (s != null) { + + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.txt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.txt new file mode 100644 index 00000000000..4811fa11f1a --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.txt @@ -0,0 +1,3 @@ +package + +internal fun test(/*0*/ j: p.J?): kotlin.Unit diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.kt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.kt new file mode 100644 index 00000000000..2c396a46367 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.kt @@ -0,0 +1,26 @@ +// FILE: p/J.java + +package p; + +import org.jetbrains.annotations.*; +import java.util.*; + +public class J { + @Nullable + public List n() { return null; } +} + +// FILE: k.kt + +import p.* + +fun list(j: J): Any { + val a = j.n()!! + + a?.get(0) + if (a == null) {} + a!! + + a.get(0) + return a +} diff --git a/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.txt b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.txt new file mode 100644 index 00000000000..8059f2c7f76 --- /dev/null +++ b/compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.txt @@ -0,0 +1,3 @@ +package + +internal fun list(/*0*/ j: p.J): kotlin.Any diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 59c6552b0ed..e8d072c260a 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -8685,6 +8685,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("inferenceInConditionals.kt") + public void testInferenceInConditionals() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/inferenceInConditionals.kt"); + doTest(fileName); + } + @TestMetadata("invoke.kt") public void testInvoke() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/invoke.kt"); @@ -8697,6 +8703,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("notNullAfterSafeCall.kt") + public void testNotNullAfterSafeCall() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAfterSafeCall.kt"); + doTest(fileName); + } + @TestMetadata("notNullAssertion.kt") public void testNotNullAssertion() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullAssertion.kt"); @@ -8709,6 +8721,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("notNullTypeMarkedWithNullableAnnotation.kt") + public void testNotNullTypeMarkedWithNullableAnnotation() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/notNullTypeMarkedWithNullableAnnotation.kt"); + doTest(fileName); + } + @TestMetadata("passToJava.kt") public void testPassToJava() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/platformTypes/nullabilityWarnings/passToJava.kt");