From 57b3bc049631f2ae64bf465299e9e0668bf211b3 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 8 Dec 2015 10:04:37 +0300 Subject: [PATCH] Regression: getPredictableNullability for unnecessary safe call check #KT-10276 Fixed --- .../kotlin/resolve/calls/CallExpressionResolver.java | 2 +- .../tests/smartCasts/falseUnnecessaryCall.kt | 11 +++++++++++ .../tests/smartCasts/falseUnnecessaryCall.txt | 10 ++++++++++ .../kotlin/checkers/DiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.kt create mode 100644 compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java index 849bc9bd2fb..f5c008a1ce4 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/CallExpressionResolver.java @@ -429,7 +429,7 @@ public class CallExpressionResolver { // Should be applied if we consider a safe call if (element.getSafe()) { DataFlowInfo dataFlowInfo = contextForSelector.dataFlowInfo; - if (dataFlowInfo.getNullability(receiverDataFlowValue).canBeNull()) { + if (dataFlowInfo.getPredictableNullability(receiverDataFlowValue).canBeNull()) { contextForSelector = contextForSelector.replaceDataFlowInfo( dataFlowInfo.disequate(receiverDataFlowValue, DataFlowValue.nullValue(builtIns))); } diff --git a/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.kt b/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.kt new file mode 100644 index 00000000000..90df45ae42b --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.kt @@ -0,0 +1,11 @@ +// See KT-10276 + +class Bar() { + var test: String? = null + fun foo() { + if (test != null) { + // No warning: test is a mutable property + test?.hashCode() + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.txt b/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.txt new file mode 100644 index 00000000000..bd4af5e6634 --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.txt @@ -0,0 +1,10 @@ +package + +public final class Bar { + public constructor Bar() + public final var test: kotlin.String? + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index d5b1d447f85..e45e9abbbe4 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -14766,6 +14766,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("falseUnnecessaryCall.kt") + public void testFalseUnnecessaryCall() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/falseUnnecessaryCall.kt"); + doTest(fileName); + } + @TestMetadata("fieldExclExcl.kt") public void testFieldExclExcl() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/fieldExclExcl.kt");