From d12a24418e1dd94fafff5d53f178ace7557693dc Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Wed, 26 May 2021 20:52:52 +0000 Subject: [PATCH] FIR IDE: Remove multiple nested params in RemoveUselessElvisFix and RemoveUselessCastFix. --- .../HighLevelQuickFixTestGenerated.java | 30 +++++++++++++++++++ .../idea/core/frontendIndependentPsiUtils.kt | 16 ++++++---- ...ssCastForLambdaInNecessaryNestedParens2.kt | 9 ++++++ ...ForLambdaInNecessaryNestedParens2.kt.after | 9 ++++++ ...emoveUselessCastForLambdaInNestedParens.kt | 5 ++++ ...selessCastForLambdaInNestedParens.kt.after | 5 ++++ .../removeUselessCastInNestedParens.kt | 9 ++++++ .../removeUselessCastInNestedParens.kt.after | 9 ++++++ ...ssElvisForLambdaInNecessaryNestedParens.kt | 8 +++++ ...sForLambdaInNecessaryNestedParens.kt.after | 8 +++++ .../uselessElvisForLambdaInNestedParens.kt | 4 +++ ...elessElvisForLambdaInNestedParens.kt.after | 4 +++ .../expressions/uselessElvisInNestedParens.kt | 4 +++ .../uselessElvisInNestedParens.kt.after | 4 +++ .../idea/quickfix/QuickFixTestGenerated.java | 30 +++++++++++++++++++ 15 files changed, 148 insertions(+), 6 deletions(-) create mode 100644 idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt create mode 100644 idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt.after create mode 100644 idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt create mode 100644 idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt.after create mode 100644 idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt create mode 100644 idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt.after create mode 100644 idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt create mode 100644 idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt.after create mode 100644 idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt create mode 100644 idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt.after create mode 100644 idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt create mode 100644 idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt.after diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java index 73d31fc7345..206dc2ce950 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/quickfix/HighLevelQuickFixTestGenerated.java @@ -561,6 +561,16 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/expressions/removeUselessCast.kt"); } + @TestMetadata("removeUselessCastForLambdaInNecessaryNestedParens2.kt") + public void testRemoveUselessCastForLambdaInNecessaryNestedParens2() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt"); + } + + @TestMetadata("removeUselessCastForLambdaInNestedParens.kt") + public void testRemoveUselessCastForLambdaInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt"); + } + @TestMetadata("removeUselessCastForLambdaInParens1.kt") public void testRemoveUselessCastForLambdaInParens1() throws Exception { runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInParens1.kt"); @@ -591,6 +601,11 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInParens6.kt"); } + @TestMetadata("removeUselessCastInNestedParens.kt") + public void testRemoveUselessCastInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt"); + } + @TestMetadata("removeUselessCastInParens.kt") public void testRemoveUselessCastInParens() throws Exception { runTest("idea/testData/quickfix/expressions/removeUselessCastInParens.kt"); @@ -691,6 +706,21 @@ public class HighLevelQuickFixTestGenerated extends AbstractHighLevelQuickFixTes runTest("idea/testData/quickfix/expressions/uselessElvis.kt"); } + @TestMetadata("uselessElvisForLambdaInNecessaryNestedParens.kt") + public void testUselessElvisForLambdaInNecessaryNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt"); + } + + @TestMetadata("uselessElvisForLambdaInNestedParens.kt") + public void testUselessElvisForLambdaInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt"); + } + + @TestMetadata("uselessElvisInNestedParens.kt") + public void testUselessElvisInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt"); + } + @TestMetadata("uselessElvisRightIsNull.kt") public void testUselessElvisRightIsNull() throws Exception { runTest("idea/testData/quickfix/expressions/uselessElvisRightIsNull.kt"); diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/core/frontendIndependentPsiUtils.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/core/frontendIndependentPsiUtils.kt index 9f3f7d3d678..733f34a26bc 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/core/frontendIndependentPsiUtils.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/core/frontendIndependentPsiUtils.kt @@ -11,14 +11,21 @@ import org.jetbrains.kotlin.psi.KtParenthesizedExpression import org.jetbrains.kotlin.psi.KtPsiUtil inline fun PsiElement.replaced(newElement: T): T { + if (this == newElement) return newElement val result = replace(newElement) return result as? T ?: (result as KtParenthesizedExpression).expression as T } fun KtExpression.dropEnclosingParenthesesIfPossible(): KtExpression { - val parent = parent as? KtParenthesizedExpression ?: return this - if (!KtPsiUtil.areParenthesesUseless(parent)) return this - return parent.replaced(this) + val innermostExpression = this + var current = innermostExpression + + while (true) { + val parent = current.parent as? KtParenthesizedExpression ?: break + if (!KtPsiUtil.areParenthesesUseless(parent)) break + current = parent + } + return current.replaced(innermostExpression) } //todo make inline @@ -26,6 +33,3 @@ fun KtExpression.dropEnclosingParenthesesIfPossible(): KtExpression { fun T.copied(): T = copy() as T fun String.unquote(): String = KtPsiUtil.unquoteIdentifier(this) - - - diff --git a/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt new file mode 100644 index 00000000000..e9cc904f8b8 --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt @@ -0,0 +1,9 @@ +// "Remove useless cast" "true" +fun foo() {} + +fun test() { + foo() + // comment + ((({ "" } as () -> String))) +} +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt.after b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt.after new file mode 100644 index 00000000000..fb1192c5a1e --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt.after @@ -0,0 +1,9 @@ +// "Remove useless cast" "true" +fun foo() {} + +fun test() { + foo() + // comment + ({ "" }) +} +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt new file mode 100644 index 00000000000..0e16f44bb1d --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt @@ -0,0 +1,5 @@ +// "Remove useless cast" "true" +fun test() { + ((({ "" } as () -> String))) +} +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt.after b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt.after new file mode 100644 index 00000000000..9939faaaaec --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt.after @@ -0,0 +1,5 @@ +// "Remove useless cast" "true" +fun test() { + { "" } +} +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt b/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt new file mode 100644 index 00000000000..460d34ffd5a --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt @@ -0,0 +1,9 @@ +// "Remove useless cast" "true" +fun test(x: Any): Int { + if (x is String) { + return (((x as String))).length + } + return -1 +} + +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt.after b/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt.after new file mode 100644 index 00000000000..3c49e654ca4 --- /dev/null +++ b/idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt.after @@ -0,0 +1,9 @@ +// "Remove useless cast" "true" +fun test(x: Any): Int { + if (x is String) { + return x.length + } + return -1 +} + +/* IGNORE_FIR */ \ No newline at end of file diff --git a/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt new file mode 100644 index 00000000000..6c4e87b622c --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt @@ -0,0 +1,8 @@ +// "Remove useless elvis operator" "true" +fun foo() {} + +fun test() { + foo() + // comment + ((({ "" } ?: null))) +} diff --git a/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt.after b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt.after new file mode 100644 index 00000000000..d0280367b5e --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt.after @@ -0,0 +1,8 @@ +// "Remove useless elvis operator" "true" +fun foo() {} + +fun test() { + foo() + // comment + ({ "" }) +} diff --git a/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt new file mode 100644 index 00000000000..244c000c84f --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt @@ -0,0 +1,4 @@ +// "Remove useless elvis operator" "true" +fun test() { + ((({ "" } ?: null))) +} diff --git a/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt.after b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt.after new file mode 100644 index 00000000000..81171668112 --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt.after @@ -0,0 +1,4 @@ +// "Remove useless elvis operator" "true" +fun test() { + { "" } +} diff --git a/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt b/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt new file mode 100644 index 00000000000..c114f77568e --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt @@ -0,0 +1,4 @@ +// "Remove useless elvis operator" "true" +fun foo(a: String) { + val b : String = (((a ?: "s"))) +} diff --git a/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt.after b/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt.after new file mode 100644 index 00000000000..8ed7ed0f216 --- /dev/null +++ b/idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt.after @@ -0,0 +1,4 @@ +// "Remove useless elvis operator" "true" +fun foo(a: String) { + val b : String = a +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 90f0c8b6d32..2f517f339a0 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -7750,6 +7750,16 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/expressions/removeUselessCast.kt"); } + @TestMetadata("removeUselessCastForLambdaInNecessaryNestedParens2.kt") + public void testRemoveUselessCastForLambdaInNecessaryNestedParens2() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInNecessaryNestedParens2.kt"); + } + + @TestMetadata("removeUselessCastForLambdaInNestedParens.kt") + public void testRemoveUselessCastForLambdaInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInNestedParens.kt"); + } + @TestMetadata("removeUselessCastForLambdaInParens1.kt") public void testRemoveUselessCastForLambdaInParens1() throws Exception { runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInParens1.kt"); @@ -7780,6 +7790,11 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/expressions/removeUselessCastForLambdaInParens6.kt"); } + @TestMetadata("removeUselessCastInNestedParens.kt") + public void testRemoveUselessCastInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/removeUselessCastInNestedParens.kt"); + } + @TestMetadata("removeUselessCastInParens.kt") public void testRemoveUselessCastInParens() throws Exception { runTest("idea/testData/quickfix/expressions/removeUselessCastInParens.kt"); @@ -7880,6 +7895,21 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { runTest("idea/testData/quickfix/expressions/uselessElvis.kt"); } + @TestMetadata("uselessElvisForLambdaInNecessaryNestedParens.kt") + public void testUselessElvisForLambdaInNecessaryNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisForLambdaInNecessaryNestedParens.kt"); + } + + @TestMetadata("uselessElvisForLambdaInNestedParens.kt") + public void testUselessElvisForLambdaInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisForLambdaInNestedParens.kt"); + } + + @TestMetadata("uselessElvisInNestedParens.kt") + public void testUselessElvisInNestedParens() throws Exception { + runTest("idea/testData/quickfix/expressions/uselessElvisInNestedParens.kt"); + } + @TestMetadata("uselessElvisRightIsNull.kt") public void testUselessElvisRightIsNull() throws Exception { runTest("idea/testData/quickfix/expressions/uselessElvisRightIsNull.kt");