Extract Function: Do not extract extension receiver from 'implicit invoke'

call
 #KT-6302 Fixed
This commit is contained in:
Alexey Sedunov
2015-01-14 14:01:29 +03:00
parent d54b261c61
commit 70b202dfa6
4 changed files with 35 additions and 7 deletions
@@ -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
@@ -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>
}
@@ -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
}
}
@@ -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");