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.idea.refactoring.comparePossiblyOverridingDescriptors
|
||||
import org.jetbrains.kotlin.idea.util.makeNullable
|
||||
import org.jetbrains.kotlin.resolve.calls.CallTransformer
|
||||
|
||||
private val DEFAULT_FUNCTION_NAME = "myFun"
|
||||
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
|
||||
@@ -567,13 +568,14 @@ private fun ExtractionData.inferParametersInfo(
|
||||
return info
|
||||
}
|
||||
|
||||
val receiverArgument = resolvedCall?.getExtensionReceiver()
|
||||
val receiver = when(receiverArgument) {
|
||||
ReceiverValue.NO_RECEIVER -> resolvedCall?.getDispatchReceiver()
|
||||
else -> receiverArgument
|
||||
} ?: ReceiverValue.NO_RECEIVER
|
||||
val extensionReceiver = resolvedCall?.getExtensionReceiver()
|
||||
val receiverToExtract = when {
|
||||
extensionReceiver == ReceiverValue.NO_RECEIVER,
|
||||
resolvedCall?.getCall() is CallTransformer.CallForImplicitInvoke -> resolvedCall?.getDispatchReceiver()
|
||||
else -> extensionReceiver
|
||||
} ?: ReceiverValue.NO_RECEIVER
|
||||
|
||||
val thisDescriptor = (receiver as? ThisReceiver)?.getDeclarationDescriptor()
|
||||
val thisDescriptor = (receiverToExtract as? ThisReceiver)?.getDeclarationDescriptor()
|
||||
val hasThisReceiver = thisDescriptor != null
|
||||
val thisExpr = ref.getParent() as? JetThisExpression
|
||||
|
||||
@@ -611,7 +613,7 @@ private fun ExtractionData.inferParametersInfo(
|
||||
val extractParameter = extractThis || extractLocalVar
|
||||
if (extractParameter) {
|
||||
val parameterType = when {
|
||||
receiver.exists() -> receiver.getType()
|
||||
receiverToExtract.exists() -> receiverToExtract.getType()
|
||||
else -> bindingContext[BindingContext.SMARTCAST, originalRef]
|
||||
?: bindingContext[BindingContext.EXPRESSION_TYPE, originalRef]
|
||||
?: 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);
|
||||
}
|
||||
|
||||
@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")
|
||||
public void testInnerClassObject() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/misc/innerClassObject.kt");
|
||||
|
||||
Reference in New Issue
Block a user