Extract Function: Do not extract extension receiver from 'implicit invoke'
call #KT-6302 Fixed
This commit is contained in:
+9
-7
@@ -68,6 +68,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
|||||||
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
|
||||||
import org.jetbrains.kotlin.idea.refactoring.comparePossiblyOverridingDescriptors
|
import org.jetbrains.kotlin.idea.refactoring.comparePossiblyOverridingDescriptors
|
||||||
import org.jetbrains.kotlin.idea.util.makeNullable
|
import org.jetbrains.kotlin.idea.util.makeNullable
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||||
|
|
||||||
private val DEFAULT_FUNCTION_NAME = "myFun"
|
private val DEFAULT_FUNCTION_NAME = "myFun"
|
||||||
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
|
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
|
||||||
@@ -567,13 +568,14 @@ private fun ExtractionData.inferParametersInfo(
|
|||||||
return info
|
return info
|
||||||
}
|
}
|
||||||
|
|
||||||
val receiverArgument = resolvedCall?.getExtensionReceiver()
|
val extensionReceiver = resolvedCall?.getExtensionReceiver()
|
||||||
val receiver = when(receiverArgument) {
|
val receiverToExtract = when {
|
||||||
ReceiverValue.NO_RECEIVER -> resolvedCall?.getDispatchReceiver()
|
extensionReceiver == ReceiverValue.NO_RECEIVER,
|
||||||
else -> receiverArgument
|
resolvedCall?.getCall() is CallTransformer.CallForImplicitInvoke -> resolvedCall?.getDispatchReceiver()
|
||||||
} ?: ReceiverValue.NO_RECEIVER
|
else -> extensionReceiver
|
||||||
|
} ?: ReceiverValue.NO_RECEIVER
|
||||||
|
|
||||||
val thisDescriptor = (receiver as? ThisReceiver)?.getDeclarationDescriptor()
|
val thisDescriptor = (receiverToExtract as? ThisReceiver)?.getDeclarationDescriptor()
|
||||||
val hasThisReceiver = thisDescriptor != null
|
val hasThisReceiver = thisDescriptor != null
|
||||||
val thisExpr = ref.getParent() as? JetThisExpression
|
val thisExpr = ref.getParent() as? JetThisExpression
|
||||||
|
|
||||||
@@ -611,7 +613,7 @@ private fun ExtractionData.inferParametersInfo(
|
|||||||
val extractParameter = extractThis || extractLocalVar
|
val extractParameter = extractThis || extractLocalVar
|
||||||
if (extractParameter) {
|
if (extractParameter) {
|
||||||
val parameterType = when {
|
val parameterType = when {
|
||||||
receiver.exists() -> receiver.getType()
|
receiverToExtract.exists() -> receiverToExtract.getType()
|
||||||
else -> bindingContext[BindingContext.SMARTCAST, originalRef]
|
else -> bindingContext[BindingContext.SMARTCAST, originalRef]
|
||||||
?: bindingContext[BindingContext.EXPRESSION_TYPE, originalRef]
|
?: bindingContext[BindingContext.EXPRESSION_TYPE, originalRef]
|
||||||
?: DEFAULT_PARAMETER_TYPE
|
?: DEFAULT_PARAMETER_TYPE
|
||||||
|
|||||||
+8
@@ -0,0 +1,8 @@
|
|||||||
|
// PARAM_TYPES: kotlin.String.() -> T
|
||||||
|
// PARAM_DESCRIPTOR: value-parameter val f: kotlin.String.() -> T defined in test
|
||||||
|
fun <T> test(f: String.() -> T): T {
|
||||||
|
<selection>while (true) {
|
||||||
|
val answer = "Hey!".f()
|
||||||
|
return answer
|
||||||
|
}</selection>
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
// PARAM_TYPES: kotlin.String.() -> T
|
||||||
|
// PARAM_DESCRIPTOR: value-parameter val f: kotlin.String.() -> T defined in test
|
||||||
|
fun <T> test(f: String.() -> T): T {
|
||||||
|
return t(f)
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun <T> t(f: String.() -> T): T {
|
||||||
|
while (true) {
|
||||||
|
val answer = "Hey!".f()
|
||||||
|
return answer
|
||||||
|
}
|
||||||
|
}
|
||||||
+6
@@ -1694,6 +1694,12 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
|||||||
doExtractFunctionTest(fileName);
|
doExtractFunctionTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("extensionLambdaAsParameter.kt")
|
||||||
|
public void testExtensionLambdaAsParameter() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/extensionLambdaAsParameter.kt");
|
||||||
|
doExtractFunctionTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("innerClassObject.kt")
|
@TestMetadata("innerClassObject.kt")
|
||||||
public void testInnerClassObject() throws Exception {
|
public void testInnerClassObject() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/innerClassObject.kt");
|
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/innerClassObject.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user