Extract Function: Add support of property-as-function calls
#KT-5179 Fixed
This commit is contained in:
@@ -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.JetDeclaration
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
||||||
import org.jetbrains.jet.lang.psi.JetUserType
|
import org.jetbrains.jet.lang.psi.JetUserType
|
||||||
|
import org.jetbrains.jet.lang.resolve.calls.model.VariableAsFunctionResolvedCall
|
||||||
|
|
||||||
data class ExtractionOptions(val inferUnitTypeForUnusedValues: Boolean) {
|
data class ExtractionOptions(val inferUnitTypeForUnusedValues: Boolean) {
|
||||||
class object {
|
class object {
|
||||||
@@ -102,7 +103,9 @@ class ExtractionData(
|
|||||||
if (ref !is JetSimpleNameExpression) continue
|
if (ref !is JetSimpleNameExpression) continue
|
||||||
|
|
||||||
val resolvedCallKey = (ref.getParent() as? JetThisExpression) ?: ref
|
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]
|
val descriptor = context[BindingContext.REFERENCE_TARGET, ref]
|
||||||
if (descriptor == null) continue
|
if (descriptor == null) continue
|
||||||
|
|||||||
+4
-9
@@ -379,15 +379,10 @@ private fun ExtractionData.inferParametersInfo(
|
|||||||
|
|
||||||
val extractParameter = extractThis || extractLocalVar
|
val extractParameter = extractThis || extractLocalVar
|
||||||
if (extractParameter) {
|
if (extractParameter) {
|
||||||
val parameterType =
|
val parameterType = when {
|
||||||
if (hasThisReceiver) {
|
receiver.exists() -> receiver.getType()
|
||||||
when (descriptorToExtract) {
|
else -> bindingContext[BindingContext.EXPRESSION_TYPE, originalRef] ?: DEFAULT_PARAMETER_TYPE
|
||||||
is ClassDescriptor -> descriptorToExtract.getDefaultType()
|
}
|
||||||
is CallableDescriptor -> descriptorToExtract.getReceiverParameter()?.getType()
|
|
||||||
else -> null
|
|
||||||
} ?: DEFAULT_PARAMETER_TYPE
|
|
||||||
}
|
|
||||||
else bindingContext[BindingContext.EXPRESSION_TYPE, originalRef] ?: DEFAULT_PARAMETER_TYPE
|
|
||||||
|
|
||||||
if (!parameterType.processTypeIfExtractable(bindingContext, typeParameters, nonDenotableTypes)) continue
|
if (!parameterType.processTypeIfExtractable(bindingContext, typeParameters, nonDenotableTypes)) continue
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
// PARAM_TYPES: A
|
||||||
|
class A {
|
||||||
|
fun invoke() = 20
|
||||||
|
}
|
||||||
|
// SIBLING:
|
||||||
|
fun testProp() {
|
||||||
|
val foo = A()
|
||||||
|
<selection>foo()</selection>
|
||||||
|
}
|
||||||
@@ -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()
|
||||||
|
}
|
||||||
+5
@@ -794,6 +794,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
|||||||
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt");
|
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")
|
@TestMetadata("idea/testData/refactoring/extractFunction/parameters/nonDenotableTypes")
|
||||||
|
|||||||
Reference in New Issue
Block a user