From f3799a0ce72c9d29999fd58857229955144daf61 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Tue, 24 Mar 2015 22:35:18 +0300 Subject: [PATCH] Partial body resolve correctly handles elvis operator --- .../resolve/lazy/PartialBodyResolveFilter.kt | 21 +++++++++++++++++-- .../resolve/partialBodyResolve/Elvis.dump | 6 ++++++ .../resolve/partialBodyResolve/Elvis.kt | 4 ++++ .../partialBodyResolve/ElvisReturn.dump | 6 ++++++ .../resolve/partialBodyResolve/ElvisReturn.kt | 4 ++++ .../PartialBodyResolveTestGenerated.java | 7 +++++++ 6 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 idea/testData/resolve/partialBodyResolve/Elvis.dump create mode 100644 idea/testData/resolve/partialBodyResolve/Elvis.kt create mode 100644 idea/testData/resolve/partialBodyResolve/ElvisReturn.dump create mode 100644 idea/testData/resolve/partialBodyResolve/ElvisReturn.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt index 24244c9ba0e..e4386445724 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/resolve/lazy/PartialBodyResolveFilter.kt @@ -157,8 +157,9 @@ class PartialBodyResolveFilter( } fun addPlaces(name: SmartCastName, places: Collection) { - assert(!places.isEmpty()) - map.getOrPut(name, { ArrayList(places.size()) }).addAll(places) + if (places.isNotEmpty()) { + map.getOrPut(name, { ArrayList(places.size()) }).addAll(places) + } } fun addIfCanBeSmartCast(expression: JetExpression) { @@ -185,6 +186,22 @@ class PartialBodyResolveFilter( } } + override fun visitBinaryExpression(expression: JetBinaryExpression) { + expression.acceptChildren(this) + + if (expression.getOperationToken() == JetTokens.ELVIS) { + val left = expression.getLeft() + val right = expression.getRight() + if (left != null && right != null) { + val smartCastName = left.smartCastExpressionName() + if (smartCastName != null && filter(smartCastName)) { + val exits = collectAlwaysExitPoints(right) + addPlaces(smartCastName, exits) + } + } + } + } + override fun visitIfExpression(expression: JetIfExpression) { val condition = expression.getCondition() val thenBranch = expression.getThen() diff --git a/idea/testData/resolve/partialBodyResolve/Elvis.dump b/idea/testData/resolve/partialBodyResolve/Elvis.dump new file mode 100644 index 00000000000..f86eb8eb921 --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/Elvis.dump @@ -0,0 +1,6 @@ +Resolve target: value-parameter val p1: kotlin.Any? +---------------------------------------------- +fun foo(p1: Any?, p2: Any) { + /* STATEMENT DELETED: print(p1 ?: p2) */ + p1?.hashCode() +} diff --git a/idea/testData/resolve/partialBodyResolve/Elvis.kt b/idea/testData/resolve/partialBodyResolve/Elvis.kt new file mode 100644 index 00000000000..83da9fedb82 --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/Elvis.kt @@ -0,0 +1,4 @@ +fun foo(p1: Any?, p2: Any) { + print(p1 ?: p2) + p1?.hashCode() +} diff --git a/idea/testData/resolve/partialBodyResolve/ElvisReturn.dump b/idea/testData/resolve/partialBodyResolve/ElvisReturn.dump new file mode 100644 index 00000000000..2599d0854a5 --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/ElvisReturn.dump @@ -0,0 +1,6 @@ +Resolve target: value-parameter val p: kotlin.Any? smart-cast to kotlin.Any +---------------------------------------------- +fun foo(p: Any?) { + print(p ?: return) + p.hashCode() +} diff --git a/idea/testData/resolve/partialBodyResolve/ElvisReturn.kt b/idea/testData/resolve/partialBodyResolve/ElvisReturn.kt new file mode 100644 index 00000000000..fb23680c60c --- /dev/null +++ b/idea/testData/resolve/partialBodyResolve/ElvisReturn.kt @@ -0,0 +1,4 @@ +fun foo(p: Any?) { + print(p ?: return) + p.hashCode() +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/PartialBodyResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/PartialBodyResolveTestGenerated.java index c2f05aed2cf..6d3adc8021f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/PartialBodyResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/PartialBodyResolveTestGenerated.java @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.idea.resolve; import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.InnerTestClasses; import org.jetbrains.kotlin.test.JUnit3RunnerWithInners; import org.jetbrains.kotlin.test.JetTestUtils; import org.jetbrains.kotlin.test.TestMetadata; @@ -77,6 +78,12 @@ public class PartialBodyResolveTestGenerated extends AbstractPartialBodyResolveT doTest(fileName); } + @TestMetadata("Elvis.kt") + public void testElvis() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/partialBodyResolve/Elvis.kt"); + doTest(fileName); + } + @TestMetadata("ElvisReturn.kt") public void testElvisReturn() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/resolve/partialBodyResolve/ElvisReturn.kt");