Extract Function: Consider member property with invoke() a receiver candidate

#KT-9774 Fixed
This commit is contained in:
Alexey Sedunov
2015-11-26 21:21:48 +03:00
parent 03e1480476
commit 6abf13be41
6 changed files with 47 additions and 3 deletions
@@ -46,7 +46,6 @@ import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall
import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getImplicitReceiverValue
import org.jetbrains.kotlin.resolve.calls.smartcasts.DataFlowValueFactory
import org.jetbrains.kotlin.resolve.calls.tasks.isSynthesizedInvoke
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
import org.jetbrains.kotlin.synthetic.SyntheticJavaPropertyDescriptor
import org.jetbrains.kotlin.types.KotlinType
@@ -235,12 +234,13 @@ data class ExtractionData(
val originalFunctionCall = originalResolvedCall?.functionCall
val originalVariableCall = originalResolvedCall?.variableCall
val invokeDescriptor = originalFunctionCall?.resultingDescriptor
if (invokeDescriptor != null && isSynthesizedInvoke(invokeDescriptor) && invokeDescriptor.isExtension) {
if (invokeDescriptor != null) {
val invokeDeclaration = getDeclaration(invokeDescriptor, context) ?: synthesizedInvokeDeclaration
val variableResolveResult = originalResolveResult.copy(resolvedCall = originalVariableCall!!,
descriptor = originalVariableCall.resultingDescriptor)
val functionResolveResult = originalResolveResult.copy(resolvedCall = originalFunctionCall!!,
descriptor = originalFunctionCall.resultingDescriptor,
declaration = synthesizedInvokeDeclaration)
declaration = invokeDeclaration)
referencesInfo.add(ResolvedReferenceInfo(newRef, variableResolveResult, smartCast, possibleTypes))
referencesInfo.add(ResolvedReferenceInfo(newRef, functionResolveResult, smartCast, possibleTypes))
}
@@ -0,0 +1,7 @@
// PARAM_DESCRIPTOR: public final class A defined in root package
// PARAM_TYPES: A
// SIBLING:
class A {
val foo: () -> String = { "OK" }
fun bar() = <selection>foo.invoke()</selection>
}
@@ -0,0 +1,9 @@
// PARAM_DESCRIPTOR: public final class A defined in root package
// PARAM_TYPES: A
// SIBLING:
class A {
val foo: () -> String = { "OK" }
fun bar() = s()
}
private fun A.s() = foo.invoke()
@@ -0,0 +1,7 @@
// PARAM_DESCRIPTOR: public final class A defined in root package
// PARAM_TYPES: A
// SIBLING:
class A {
val foo: () -> String = { "OK" }
fun bar() = <selection>foo()</selection>
}
@@ -0,0 +1,9 @@
// PARAM_DESCRIPTOR: public final class A defined in root package
// PARAM_TYPES: A
// SIBLING:
class A {
val foo: () -> String = { "OK" }
fun bar() = s()
}
private fun A.s() = foo()
@@ -2270,6 +2270,18 @@ public class ExtractionTestGenerated extends AbstractExtractionTest {
doExtractFunctionTest(fileName);
}
@TestMetadata("propertyWithExplicitInvoke.kt")
public void testPropertyWithExplicitInvoke() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithExplicitInvoke.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("propertyWithImplicitInvoke.kt")
public void testPropertyWithImplicitInvoke() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/propertyWithImplicitInvoke.kt");
doExtractFunctionTest(fileName);
}
@TestMetadata("qualifiedThis.kt")
public void testQualifiedThis() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/extractFunction/parameters/extractThis/qualifiedThis.kt");