From 63366042ed06103f36f84778964d9bcad8475234 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 17 Oct 2014 13:21:33 +0400 Subject: [PATCH] Fix incorrect "senseless null in when" on nullable type --- .../PatternMatchingTypingVisitor.java | 2 +- .../noSenselessNullOnNullableType.kt | 21 ++++++++++++++ .../noSenselessNullOnNullableType.txt | 28 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 6 ++++ 4 files changed, 56 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.kt create mode 100644 compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.txt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java index 13b7be36ffb..d2d4ff18cd5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java @@ -320,7 +320,7 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { } // check if the pattern is essentially a 'null' expression - if (KotlinBuiltIns.getInstance().isNullableNothing(type) && !subjectType.isNullable()) { + if (KotlinBuiltIns.getInstance().isNullableNothing(type) && !TypeUtils.isNullableType(subjectType)) { context.trace.report(SENSELESS_NULL_IN_WHEN.on(reportErrorOn)); } } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.kt b/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.kt new file mode 100644 index 00000000000..b0624fd098e --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.kt @@ -0,0 +1,21 @@ +// FILE: A.java + +class A { + enum Empty {} + + static Empty foo() { return null; } +} + +// FILE: 1.kt + +fun bar() = when (A.foo()) { + null -> "null" + else -> "else" +} + +fun baz(t: T) = when (t) { + is Int -> "int" + is Long -> "long" + null -> "null" + else -> "else" +} diff --git a/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.txt b/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.txt new file mode 100644 index 00000000000..cb1f52fae89 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.txt @@ -0,0 +1,28 @@ +package + +internal fun bar(): kotlin.String +internal fun baz(/*0*/ t: T): kotlin.String + +public/*package*/ open class A { + public/*package*/ constructor A() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + public/*package*/ final enum class Empty : kotlin.Enum { + public/*package*/ constructor Empty() + public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: A.Empty!): kotlin.Int + public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final override /*1*/ /*fake_override*/ fun name(): kotlin.String + public final override /*1*/ /*fake_override*/ fun ordinal(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): A.Empty + public final /*synthesized*/ fun values(): kotlin.Array + } + + // Static members + public/*package*/ open fun foo(): A.Empty! +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 59f521fa499..84e62e5d8ab 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -7031,6 +7031,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest(fileName); } + @TestMetadata("noSenselessNullOnNullableType.kt") + public void testNoSenselessNullOnNullableType() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noSenselessNullOnNullableType.kt"); + doTest(fileName); + } + @TestMetadata("noUnnecessaryNotNullAssertionOnErrorType.kt") public void testNoUnnecessaryNotNullAssertionOnErrorType() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/nullabilityAndSmartCasts/noUnnecessaryNotNullAssertionOnErrorType.kt");