From c7d8ab8219cca0ff430eac0858ca3b00f9927f54 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 19 Jun 2014 16:17:48 +0400 Subject: [PATCH] Extract Function: Add support of property-as-function calls #KT-5179 Fixed --- .../refactoring/extractFunction/ExtractionData.kt | 5 ++++- .../extractFunction/extractFunctionUtils.kt | 13 ++++--------- .../parameters/misc/variableAsFunction.kt | 9 +++++++++ .../parameters/misc/variableAsFunction.kt.after | 13 +++++++++++++ .../JetExtractionTestGenerated.java | 5 +++++ 5 files changed, 35 insertions(+), 10 deletions(-) create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt create mode 100644 idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt.after diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt index c98a1cc68bd..4f8681f7cc9 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt @@ -45,6 +45,7 @@ import org.jetbrains.jet.lang.psi.psiUtil.getParentByType import org.jetbrains.jet.lang.psi.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclarationWithBody import org.jetbrains.jet.lang.psi.JetUserType +import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall data class ExtractionOptions(val inferUnitTypeForUnusedValues: Boolean) { class object { @@ -102,7 +103,9 @@ class ExtractionData( if (ref !is JetSimpleNameExpression) continue val resolvedCallKey = (ref.getParent() as? JetThisExpression) ?: ref - val resolvedCall = context[BindingContext.RESOLVED_CALL, resolvedCallKey] + val resolvedCall = context[BindingContext.RESOLVED_CALL, resolvedCallKey]?.let { + (it as? VariableAsFunctionResolvedCall)?.functionCall ?: it + } val descriptor = context[BindingContext.REFERENCE_TARGET, ref] if (descriptor == null) continue diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt index eac0647d964..199d01c6713 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/extractFunctionUtils.kt @@ -379,15 +379,10 @@ private fun ExtractionData.inferParametersInfo( val extractParameter = extractThis || extractLocalVar if (extractParameter) { - val parameterType = - if (hasThisReceiver) { - when (descriptorToExtract) { - is ClassDescriptor -> descriptorToExtract.getDefaultType() - is CallableDescriptor -> descriptorToExtract.getReceiverParameter()?.getType() - else -> null - } ?: DEFAULT_PARAMETER_TYPE - } - else bindingContext[BindingContext.EXPRESSION_TYPE, originalRef] ?: DEFAULT_PARAMETER_TYPE + val parameterType = when { + receiver.exists() -> receiver.getType() + else -> bindingContext[BindingContext.EXPRESSION_TYPE, originalRef] ?: DEFAULT_PARAMETER_TYPE + } if (!parameterType.processTypeIfExtractable(bindingContext, typeParameters, nonDenotableTypes)) continue diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt b/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt new file mode 100644 index 00000000000..c2f7f75c3b8 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt @@ -0,0 +1,9 @@ +// PARAM_TYPES: A +class A { + fun invoke() = 20 +} +// SIBLING: +fun testProp() { + val foo = A() + foo() +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt.after new file mode 100644 index 00000000000..565522f7989 --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt.after @@ -0,0 +1,13 @@ +// PARAM_TYPES: A +class A { + fun invoke() = 20 +} +// SIBLING: +fun testProp() { + val foo = A() + unit(foo) +} + +fun unit(foo: A) { + foo() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index a867122af38..8678c9e7db2 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -794,6 +794,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt"); } + @TestMetadata("variableAsFunction.kt") + public void testVariableAsFunction() throws Exception { + doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/variableAsFunction.kt"); + } + } @TestMetadata("idea/testData/refactoring/extractFunction/parameters/nonDenotableTypes")