From 1ca3c5e3b8a29d9ffcb5cc61411b93d14ccc4e59 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 2 Sep 2015 18:47:49 +0300 Subject: [PATCH] PSI Unifier: Use convention-based call for array access expressions when comparing elements by resolved calls #KT-8312 Fixed --- .../util/psi/patternMatching/JetPsiUnifier.kt | 15 ++++++++++----- .../introduceVariable/ComplexCallee.kt | 7 +++++++ .../introduceVariable/ComplexCallee.kt.after | 10 ++++++++++ .../expressions/calls/callAndCalleeRuntime.kt | 6 ++++++ .../calls/callAndCalleeRuntime.kt.match | 7 +++++++ .../introduce/JetExtractionTestGenerated.java | 6 ++++++ .../JetPsiUnifierTestGenerated.java | 6 ++++++ 7 files changed, 52 insertions(+), 5 deletions(-) create mode 100644 idea/testData/refactoring/introduceVariable/ComplexCallee.kt create mode 100644 idea/testData/refactoring/introduceVariable/ComplexCallee.kt.after create mode 100644 idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt create mode 100644 idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt.match diff --git a/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt b/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt index d63fc218a48..d0b0fcafb77 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/psi/patternMatching/JetPsiUnifier.kt @@ -306,11 +306,16 @@ public class JetPsiUnifier( private val JetElement.bindingContext: BindingContext get() = if (this in originalPattern) patternContext else targetContext private fun JetElement.getAdjustedResolvedCall(): ResolvedCall<*>? { - val rc = getResolvedCall(bindingContext)?.let { - when { - it !is VariableAsFunctionResolvedCall -> it - this is JetSimpleNameExpression -> it.variableCall - else -> it.functionCall + val rc = if (this is JetArrayAccessExpression) { + bindingContext[BindingContext.INDEXED_LVALUE_GET, this] + } + else { + getResolvedCall(bindingContext)?.let { + when { + it !is VariableAsFunctionResolvedCall -> it + this is JetSimpleNameExpression -> it.variableCall + else -> it.functionCall + } } } diff --git a/idea/testData/refactoring/introduceVariable/ComplexCallee.kt b/idea/testData/refactoring/introduceVariable/ComplexCallee.kt new file mode 100644 index 00000000000..dedca1a8f9c --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ComplexCallee.kt @@ -0,0 +1,7 @@ +// WITH_RUNTIME + +fun fn(index : Int, list: List<()->Unit>) { + when { + index in list.indices -> list[index]() + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/introduceVariable/ComplexCallee.kt.after b/idea/testData/refactoring/introduceVariable/ComplexCallee.kt.after new file mode 100644 index 00000000000..31df8b9a042 --- /dev/null +++ b/idea/testData/refactoring/introduceVariable/ComplexCallee.kt.after @@ -0,0 +1,10 @@ +// WITH_RUNTIME + +fun fn(index : Int, list: List<()->Unit>) { + when { + index in list.indices -> { + val function = list[index] + function() + } + } +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt b/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt new file mode 100644 index 00000000000..0761e5bdcc2 --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt @@ -0,0 +1,6 @@ +fun test(index: Int, array: Array<() -> Unit>) { + val a = array[index]() + val b = array[index] + val c = array.get(index) + val d = array.get(index).invoke() +} \ No newline at end of file diff --git a/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt.match b/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt.match new file mode 100644 index 00000000000..981fc90c7fe --- /dev/null +++ b/idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt.match @@ -0,0 +1,7 @@ +array[index] + +array[index] + +array.get(index) + +array.get(index) \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java index 8ec7c71a9b0..355adfe345f 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/introduce/JetExtractionTestGenerated.java @@ -61,6 +61,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doIntroduceVariableTest(fileName); } + @TestMetadata("ComplexCallee.kt") + public void testComplexCallee() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ComplexCallee.kt"); + doIntroduceVariableTest(fileName); + } + @TestMetadata("ConstructorDelegationCall.kt") public void testConstructorDelegationCall() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/introduceVariable/ConstructorDelegationCall.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java index 0fa82c8a107..64ac7eb507c 100644 --- a/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/psi/patternMatching/JetPsiUnifierTestGenerated.java @@ -389,6 +389,12 @@ public class JetPsiUnifierTestGenerated extends AbstractJetPsiUnifierTest { doTest(fileName); } + @TestMetadata("callAndCalleeRuntime.kt") + public void testCallAndCalleeRuntime() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/calls/callAndCalleeRuntime.kt"); + doTest(fileName); + } + @TestMetadata("callTypeArgumentsRuntime.kt") public void testCallTypeArgumentsRuntime() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/unifier/equivalence/expressions/calls/callTypeArgumentsRuntime.kt");