From 0c0232f42b14b5587c43e5d653a7c9e726b0a1bc Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Fri, 20 Jul 2012 17:39:09 +0400 Subject: [PATCH] Senseless null in when (KT-2457 frontend part) --- .../src/org/jetbrains/jet/lang/diagnostics/Errors.java | 1 + .../diagnostics/rendering/DefaultErrorMessages.java | 1 + .../expressions/PatternMatchingTypingVisitor.java | 5 +++++ .../nullabilityAndAutoCasts/SenselessNullInWhen.kt | 10 ++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 5 files changed, 22 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java index 2b6f6c33b92..fba88aadc4e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/Errors.java @@ -283,6 +283,7 @@ public interface Errors { DiagnosticFactory3.create(ERROR); DiagnosticFactory2 SENSELESS_COMPARISON = DiagnosticFactory2.create(WARNING); + SimpleDiagnosticFactory SENSELESS_NULL_IN_WHEN = SimpleDiagnosticFactory.create(WARNING); DiagnosticFactory2 OVERRIDING_FINAL_MEMBER = DiagnosticFactory2.create(ERROR); DiagnosticFactory3 CANNOT_WEAKEN_ACCESS_PRIVILEGE = diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java index 71ebfa2ddea..25522dd56a2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/diagnostics/rendering/DefaultErrorMessages.java @@ -345,6 +345,7 @@ public class DefaultErrorMessages { }, RENDER_TYPE, RENDER_TYPE); MAP.put(SENSELESS_COMPARISON, "Condition ''{0}'' is always ''{1}''", ELEMENT_TEXT, TO_STRING); + MAP.put(SENSELESS_NULL_IN_WHEN, "Expression under 'when' is never equal to null"); MAP.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", NAME, NAME); MAP.put(CANNOT_WEAKEN_ACCESS_PRIVILEGE, "Cannot weaken access privilege ''{0}'' for ''{1}'' in ''{2}''", TO_STRING, NAME, NAME); 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 f595a08fdc5..550e05fa088 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 @@ -330,6 +330,11 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { return; } + // check if the pattern is essentially a 'null' expression + if (type == JetStandardClasses.getNullableNothingType() && !subjectType.isNullable()) { + context.trace.report(SENSELESS_NULL_IN_WHEN.on(reportErrorOn)); + } + if (BasicExpressionTypingVisitor.isCastErased(subjectType, type, JetTypeChecker.INSTANCE)) { context.trace.report(Errors.CANNOT_CHECK_FOR_ERASED.on(reportErrorOn, type)); } diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt new file mode 100644 index 00000000000..8e48d129c13 --- /dev/null +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt @@ -0,0 +1,10 @@ +//KT-2457 Verify error when comparing not null value with null in when + +package kt2457 + +fun foo(i: Int) : Int = + when (i) { + 1 -> 1 + null -> 1 + else -> 1 + } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index ba8d41255e8..a07455b87fd 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1481,6 +1481,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/ReceiverNullability.kt"); } + @TestMetadata("SenselessNullInWhen.kt") + public void testSenselessNullInWhen() throws Exception { + doTest("compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/SenselessNullInWhen.kt"); + } + } @TestMetadata("compiler/testData/diagnostics/tests/objects")