diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt index 2e7fc5d2bc4..ee75e50b67c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/UsePropertyAccessSyntaxIntention.kt @@ -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 diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.1.java b/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.1.java new file mode 100644 index 00000000000..403f69e3378 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.1.java @@ -0,0 +1,4 @@ +public class J { + public Runnable getR() { return null; } + public void setR(Runnable r) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.kt b/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.kt new file mode 100644 index 00000000000..f92684aa9a5 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setAnonymouseFunctionArgument.kt @@ -0,0 +1,7 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun test() { + J().setR(fun() { + println("Hello, world!") + }) +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.1.java b/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.1.java new file mode 100644 index 00000000000..403f69e3378 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.1.java @@ -0,0 +1,4 @@ +public class J { + public Runnable getR() { return null; } + public void setR(Runnable r) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.kt b/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.kt new file mode 100644 index 00000000000..5afc3eb0568 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setFunctionReferenceArgument.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun test() { + J().setR(::test) +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.1.java b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.1.java new file mode 100644 index 00000000000..403f69e3378 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.1.java @@ -0,0 +1,4 @@ +public class J { + public Runnable getR() { return null; } + public void setR(Runnable r) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.kt b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.kt new file mode 100644 index 00000000000..bfb2e5ddd2e --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun test() { + J().setR { println("Hello, world!") } +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.1.java b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.1.java new file mode 100644 index 00000000000..403f69e3378 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.1.java @@ -0,0 +1,4 @@ +public class J { + public Runnable getR() { return null; } + public void setR(Runnable r) {} +} \ No newline at end of file diff --git a/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.kt b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.kt new file mode 100644 index 00000000000..ac3663e5e02 --- /dev/null +++ b/idea/testData/intentions/usePropertyAccessSyntax/setLambdaArgument2.kt @@ -0,0 +1,5 @@ +// IS_APPLICABLE: false +// WITH_RUNTIME +fun test() { + J().setR({ println("Hello, world!") }) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index 000c8afef73..543bc03d1fd 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -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");