KT-13111: lambda --> reference support methods called via this now

This commit is contained in:
Mikhail Glukhikh
2017-03-10 17:38:03 +03:00
parent 19db4869e6
commit 2c692de98f
4 changed files with 35 additions and 13 deletions
@@ -240,8 +240,10 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio
is KtNameReferenceExpression -> selector.getReferencedName() is KtNameReferenceExpression -> selector.getReferencedName()
else -> return null else -> return null
} }
val receiver = singleStatement.receiverExpression as? KtNameReferenceExpression ?: return null val receiver = singleStatement.receiverExpression
val context = receiver.analyze() val context = receiver.analyze()
when (receiver) {
is KtNameReferenceExpression -> {
val receiverDescriptor = context[REFERENCE_TARGET, receiver] ?: return null val receiverDescriptor = context[REFERENCE_TARGET, receiver] ?: return null
val lambdaValueParameters = context[FUNCTION, lambdaExpression.functionLiteral]?.valueParameters ?: return null val lambdaValueParameters = context[FUNCTION, lambdaExpression.functionLiteral]?.valueParameters ?: return null
if (receiverDescriptor is ParameterDescriptor && receiverDescriptor == lambdaValueParameters.firstOrNull()) { if (receiverDescriptor is ParameterDescriptor && receiverDescriptor == lambdaValueParameters.firstOrNull()) {
@@ -258,6 +260,12 @@ class ConvertLambdaToReferenceIntention : SelfTargetingOffsetIndependentIntentio
"${receiverDescriptor.name}::$selectorReferenceName" "${receiverDescriptor.name}::$selectorReferenceName"
} }
} }
is KtThisExpression -> {
"${receiver.text}::$selectorReferenceName"
}
else -> null
}
}
else -> null else -> null
} }
} }
@@ -0,0 +1,4 @@
class Owner(val z: Int) {
fun foo(y: Int) = y + z
val x = { y: Int -><caret> this.foo(y) }
}
@@ -0,0 +1,4 @@
class Owner(val z: Int) {
fun foo(y: Int) = y + z
val x = this::foo
}
@@ -4466,6 +4466,12 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("memberViaThis.kt")
public void testMemberViaThis() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/memberViaThis.kt");
doTest(fileName);
}
@TestMetadata("name.kt") @TestMetadata("name.kt")
public void testName() throws Exception { public void testName() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/name.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertLambdaToReference/name.kt");