Use property access syntax: don't report when setter argument is lambda

#KT-30627 Fixed
This commit is contained in:
Toshiaki Kameyama
2019-06-05 17:08:08 +09:00
committed by Dmitry Gridin
parent a3f8987255
commit 1c32941949
10 changed files with 65 additions and 0 deletions
@@ -182,6 +182,13 @@ class UsePropertyAccessSyntaxIntention :
val isSetUsage = callExpression.valueArguments.size == 1
val valueArgumentExpression = callExpression.valueArguments.firstOrNull()?.getArgumentExpression()?.takeUnless {
it is KtLambdaExpression || it is KtNamedFunction || it is KtCallableReferenceExpression
}
if (isSetUsage && valueArgumentExpression == null) {
return null
}
if (isSetUsage && qualifiedExpression.isUsedAsExpression(bindingContext)) {
// call to the setter used as expression can be converted in the only case when it's used as body expression for some declaration and its type is Unit
val parent = qualifiedExpression.parent
@@ -0,0 +1,4 @@
public class J {
public Runnable getR() { return null; }
public void setR(Runnable r) {}
}
@@ -0,0 +1,7 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
fun test() {
J().<caret>setR(fun() {
println("Hello, world!")
})
}
@@ -0,0 +1,4 @@
public class J {
public Runnable getR() { return null; }
public void setR(Runnable r) {}
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
fun test() {
J().<caret>setR(::test)
}
@@ -0,0 +1,4 @@
public class J {
public Runnable getR() { return null; }
public void setR(Runnable r) {}
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
fun test() {
J().<caret>setR { println("Hello, world!") }
}
@@ -0,0 +1,4 @@
public class J {
public Runnable getR() { return null; }
public void setR(Runnable r) {}
}
@@ -0,0 +1,5 @@
// IS_APPLICABLE: false
// WITH_RUNTIME
fun test() {
J().<caret>setR({ println("Hello, world!") })
}
@@ -16575,6 +16575,11 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/usePropertyAccessSyntax/set.kt");
}
@TestMetadata("setAnonymouseFunctionArgument.kt")
public void testSetAnonymouseFunctionArgument() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.kt");
}
@TestMetadata("setAsExpressionBody.kt")
public void testSetAsExpressionBody() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setAsExpressionBody.kt");
@@ -16590,11 +16595,26 @@ public class IntentionTestGenerated extends AbstractIntentionTest {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setAsExpressionBodyUnqualified.kt");
}
@TestMetadata("setFunctionReferenceArgument.kt")
public void testSetFunctionReferenceArgument() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.kt");
}
@TestMetadata("setImplicitReceiver.kt")
public void testSetImplicitReceiver() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setImplicitReceiver.kt");
}
@TestMetadata("setLambdaArgument.kt")
public void testSetLambdaArgument() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.kt");
}
@TestMetadata("setLambdaArgument2.kt")
public void testSetLambdaArgument2() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.kt");
}
@TestMetadata("setReservedWord1.kt")
public void testSetReservedWord1() throws Exception {
runTest("idea/testData/intentions/usePropertyAccessSyntax/setReservedWord1.kt");