From b0422990d9933064d5b590bcf17f4d77b039ad3c Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sat, 21 Feb 2015 14:45:31 +0300 Subject: [PATCH] KT-6527 Wrong diagnostics when compare dynamic to null #KT-6527 Fixed --- .../resolve/calls/smartcasts/DataFlowValue.java | 2 ++ .../calls/smartcasts/DataFlowValueFactory.java | 3 ++- .../dynamicTypes/comparisonToNull.dynamic.txt | 8 ++++++++ .../dynamicTypes/comparisonToNull.kt | 10 ++++++++++ .../dynamicTypes/comparisonToNull.txt | 3 +++ .../testsWithJsStdLib/dynamicTypes/extensionVals.kt | 8 ++++++-- .../testsWithJsStdLib/dynamicTypes/extensionVars.kt | 9 +++++++-- .../testsWithJsStdLib/dynamicTypes/extensions.kt | 4 +++- .../testsWithJsStdLib/dynamicTypes/membersOfAny.kt | 12 +++++++++--- .../JetDiagnosticsTestWithJsStdLibGenerated.java | 6 ++++++ 10 files changed, 56 insertions(+), 9 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.kt create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue.java index d4f19aaac79..03980b75ea5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValue.java @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.resolve.calls.smartcasts; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.kotlin.types.ErrorUtils; import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.builtins.KotlinBuiltIns; @@ -25,6 +26,7 @@ public class DataFlowValue { public static final DataFlowValue NULL = new DataFlowValue(new Object(), KotlinBuiltIns.getInstance().getNullableNothingType(), false, Nullability.NULL); public static final DataFlowValue NULLABLE = new DataFlowValue(new Object(), KotlinBuiltIns.getInstance().getNullableAnyType(), false, Nullability.UNKNOWN); + public static final DataFlowValue ERROR = new DataFlowValue(new Object(), ErrorUtils.createErrorType("Error type for data flow"), false, Nullability.IMPOSSIBLE); private final boolean stableIdentifier; private final JetType type; diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java index f8549552475..09f31d86ade 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/smartcasts/DataFlowValueFactory.java @@ -45,7 +45,8 @@ public class DataFlowValueFactory { JetConstantExpression constantExpression = (JetConstantExpression) expression; if (constantExpression.getNode().getElementType() == JetNodeTypes.NULL) return DataFlowValue.NULL; } - if (TypeUtils.equalTypes(type, KotlinBuiltIns.getInstance().getNullableNothingType())) return DataFlowValue.NULL; // 'null' is the only inhabitant of 'Nothing?' + if (type.isError()) return DataFlowValue.ERROR; + if (KotlinBuiltIns.getInstance().getNullableNothingType().equals(type)) return DataFlowValue.NULL; // 'null' is the only inhabitant of 'Nothing?' IdentifierInfo result = getIdForStableIdentifier(expression, bindingContext); return new DataFlowValue(result == NO_IDENTIFIER_INFO ? expression : result.id, type, result.isStable, getImmanentNullability(type)); } diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt new file mode 100644 index 00000000000..e8cfa6325fc --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.dynamic.txt @@ -0,0 +1,8 @@ +public final fun get(/*0*/ p0: dynamic): dynamic +public final fun get(/*0*/ p0: dynamic): dynamic +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit +public final var foo: dynamic + public final fun (): dynamic + public final fun (/*0*/ : dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.kt new file mode 100644 index 00000000000..0cb555c90d2 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.kt @@ -0,0 +1,10 @@ +// !DIAGNOSTICS: -UNUSED_VARIABLE + +fun test(d: dynamic) { + d == null + d != null + d["foo"] == null + d["foo"] != null + d.foo == null + d.foo != null +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.txt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.txt new file mode 100644 index 00000000000..41a648f7f82 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.txt @@ -0,0 +1,3 @@ +package + +internal fun test(/*0*/ d: dynamic): kotlin.Unit diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.kt index c43fe713db5..76f5d05ca31 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVals.kt @@ -7,8 +7,12 @@ fun test(d: dynamic) { d?.onAnyVal d?.onAnyVal = 1 - d!!.onAnyVal - d!!.onAnyVal = 1 + run { + d!!.onAnyVal + } + run { + d!!.onAnyVal = 1 + } d.onNullableAnyVal = 1 diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.kt index dfb64ef49fc..07589348d9c 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensionVars.kt @@ -7,8 +7,13 @@ fun test(d: dynamic) { d?.onAnyVar d?.onAnyVar = 1 - d!!.onAnyVar - d!!.onAnyVar = 1 + run { + d!!.onAnyVar + + } + run { + d!!.onAnyVar = 1 + } d.onNullableAnyVar = 1 diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.kt index 18c10749572..cd71691ce52 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/extensions.kt @@ -3,7 +3,9 @@ fun test(d: dynamic) { d.onAny() d?.onAny() - d!!.onAny() + run { + d!!.onAny() + } d.onAny(1) diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/membersOfAny.kt b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/membersOfAny.kt index 361106b1a48..97fb9732d26 100644 --- a/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/membersOfAny.kt +++ b/compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/membersOfAny.kt @@ -5,13 +5,19 @@ fun test(d: dynamic) { d.equals(1) d?.equals(1) - d!!.equals(1) + run { + d!!.equals(1) + } d.hashCode() d?.hashCode() - d!!.hashCode() + run { + d!!.hashCode() + } d.toString() d?.toString() - d!!.toString() + run { + d!!.toString() + } } \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java index 1383156f60f..e3b3994a106 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestWithJsStdLibGenerated.java @@ -67,6 +67,12 @@ public class JetDiagnosticsTestWithJsStdLibGenerated extends AbstractJetDiagnost doTest(fileName); } + @TestMetadata("comparisonToNull.kt") + public void testComparisonToNull() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/comparisonToNull.kt"); + doTest(fileName); + } + @TestMetadata("conditions.kt") public void testConditions() throws Exception { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/testsWithJsStdLib/dynamicTypes/conditions.kt");