From 9b3c3ae4ba0c04ca2c0e4e45d49d4ee5789a25cd Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Fri, 3 Apr 2020 11:33:53 +0900 Subject: [PATCH] "Replace 'invoke' with direct call" intention: do not add unnecessary parenthesis #KT-37967 Fixed --- .../org/jetbrains/kotlin/psi/KtPsiUtil.java | 22 ++++++++++++------- .../replaceInvoke/dotQualifiedReceiver.kt | 11 ++++++++++ .../dotQualifiedReceiver.kt.after | 11 ++++++++++ .../replaceInvoke/dotQualifiedReceiver2.kt | 11 ++++++++++ .../dotQualifiedReceiver2.kt.after | 11 ++++++++++ .../replaceInvoke/dotQualifiedReceiver3.kt | 12 ++++++++++ .../dotQualifiedReceiver3.kt.after | 12 ++++++++++ .../intentions/IntentionTestGenerated.java | 15 +++++++++++++ 8 files changed, 97 insertions(+), 8 deletions(-) create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt.after create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt.after create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt create mode 100644 idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt.after diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiUtil.java b/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiUtil.java index 9ee9cf61a0c..67b7a99d193 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiUtil.java +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtPsiUtil.java @@ -455,15 +455,21 @@ public class KtPsiUtil { if (parentElement instanceof KtCallExpression && currentInner == ((KtCallExpression) parentElement).getCalleeExpression()) { KtCallExpression parentCall = (KtCallExpression) parentElement; - if (innerExpression instanceof KtSimpleNameExpression) return false; + KtExpression targetInnerExpression = innerExpression; + if (targetInnerExpression instanceof KtDotQualifiedExpression) { + KtExpression selector = ((KtDotQualifiedExpression) targetInnerExpression).getSelectorExpression(); + if (selector != null) { + targetInnerExpression = selector; + } + } + if (targetInnerExpression instanceof KtSimpleNameExpression) return false; if (KtPsiUtilKt.getQualifiedExpressionForSelector(parentElement) != null) return true; - if (innerExpression instanceof KtCallExpression - && parentCall.getValueArgumentList() == null) return true; - return !(innerExpression instanceof KtThisExpression - || innerExpression instanceof KtArrayAccessExpression - || innerExpression instanceof KtConstantExpression - || innerExpression instanceof KtStringTemplateExpression - || innerExpression instanceof KtCallExpression); + if (targetInnerExpression instanceof KtCallExpression && parentCall.getValueArgumentList() == null) return true; + return !(targetInnerExpression instanceof KtThisExpression + || targetInnerExpression instanceof KtArrayAccessExpression + || targetInnerExpression instanceof KtConstantExpression + || targetInnerExpression instanceof KtStringTemplateExpression + || targetInnerExpression instanceof KtCallExpression); } if (parentElement instanceof KtValueArgument) { diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt new file mode 100644 index 00000000000..5377358bc76 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt @@ -0,0 +1,11 @@ +class A { + val b = B() +} + +class B { + operator fun invoke() {} +} + +fun test(a: A) { + a.b.invoke() +} \ No newline at end of file diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt.after b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt.after new file mode 100644 index 00000000000..d9aea6a52c2 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt.after @@ -0,0 +1,11 @@ +class A { + val b = B() +} + +class B { + operator fun invoke() {} +} + +fun test(a: A) { + a.b() +} \ No newline at end of file diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt new file mode 100644 index 00000000000..4e4457806e9 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt @@ -0,0 +1,11 @@ +class A { + fun b() = B() +} + +class B { + operator fun invoke() {} +} + +fun test(a: A) { + a.b().invoke() +} \ No newline at end of file diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt.after b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt.after new file mode 100644 index 00000000000..58f60176ed3 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt.after @@ -0,0 +1,11 @@ +class A { + fun b() = B() +} + +class B { + operator fun invoke() {} +} + +fun test(a: A) { + a.b()() +} \ No newline at end of file diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt new file mode 100644 index 00000000000..6bcf87d90c0 --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt @@ -0,0 +1,12 @@ +class A { + fun b() = B() +} + +class B { + operator fun invoke(f: () -> Unit) {} +} + +fun test(a: A) { + a.b().invoke { + } +} \ No newline at end of file diff --git a/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt.after b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt.after new file mode 100644 index 00000000000..e238365251c --- /dev/null +++ b/idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt.after @@ -0,0 +1,12 @@ +class A { + fun b() = B() +} + +class B { + operator fun invoke(f: () -> Unit) {} +} + +fun test(a: A) { + (a.b()) { + } +} \ 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 16483a3ea4a..5671edd2a65 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -3910,6 +3910,21 @@ public class IntentionTestGenerated extends AbstractIntentionTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("idea/testData/intentions/conventionNameCalls/replaceInvoke"), Pattern.compile("^([\\w\\-_]+)\\.(kt|kts)$"), null, true); } + @TestMetadata("dotQualifiedReceiver.kt") + public void testDotQualifiedReceiver() throws Exception { + runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver.kt"); + } + + @TestMetadata("dotQualifiedReceiver2.kt") + public void testDotQualifiedReceiver2() throws Exception { + runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver2.kt"); + } + + @TestMetadata("dotQualifiedReceiver3.kt") + public void testDotQualifiedReceiver3() throws Exception { + runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/dotQualifiedReceiver3.kt"); + } + @TestMetadata("expressionReceiver.kt") public void testExpressionReceiver() throws Exception { runTest("idea/testData/intentions/conventionNameCalls/replaceInvoke/expressionReceiver.kt");