From 40cd2a16b1d398dd7cb27112fba7898e58cd6124 Mon Sep 17 00:00:00 2001 From: Alexey Belkov Date: Mon, 14 Aug 2023 14:45:02 +0400 Subject: [PATCH] [kotlin] False negative "Join declaration and assignment" with a qualified reference ^KTIJ-26630 Fixed GitOrigin-RevId: 9a4ce1330396b57249cd2eeb1f49c456f081690b --- .../JoinDeclarationAndAssignmentIntention.kt | 11 +++++------ .../idea/intentions/K1IntentionTestGenerated.java | 10 ++++++++++ .../joinDeclarationAndAssignment/qualifiedName.kt | 8 ++++++++ .../qualifiedName.kt.after | 5 +++++ .../joinDeclarationAndAssignment/qualifiedName2.kt | 10 ++++++++++ .../qualifiedName2.kt.after | 7 +++++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt create mode 100644 plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt.after create mode 100644 plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt create mode 100644 plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt.after diff --git a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt index c1053a294a25..8e926a0b2c2f 100644 --- a/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt +++ b/plugins/kotlin/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt @@ -126,19 +126,18 @@ class JoinDeclarationAndAssignmentIntention : SelfTargetingRangeIntention() + fun process(binaryExpr: KtBinaryExpression) { if (binaryExpr.operationToken != KtTokens.EQ) return val leftReference = when (val left = binaryExpr.left) { - is KtNameReferenceExpression -> - left - is KtDotQualifiedExpression -> - if (left.receiverExpression is KtThisExpression) left.selectorExpression as? KtNameReferenceExpression else null - else -> - null + is KtNameReferenceExpression -> left + is KtDotQualifiedExpression -> left.selectorExpression as? KtNameReferenceExpression + else -> null } ?: return if (leftReference.getReferencedName() != property.name) return assignments += binaryExpr } + propertyContainer.forEachDescendantOfType(::process) fun PsiElement?.isInvalidParent(): Boolean { diff --git a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/intentions/K1IntentionTestGenerated.java b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/intentions/K1IntentionTestGenerated.java index d2bb72df5c15..12f6b045460e 100644 --- a/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/intentions/K1IntentionTestGenerated.java +++ b/plugins/kotlin/idea/tests/test/org/jetbrains/kotlin/idea/intentions/K1IntentionTestGenerated.java @@ -12501,6 +12501,16 @@ public abstract class K1IntentionTestGenerated extends AbstractK1IntentionTest { runTest("testData/intentions/joinDeclarationAndAssignment/propertyReassignment.kt"); } + @TestMetadata("qualifiedName.kt") + public void testQualifiedName() throws Exception { + runTest("testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt"); + } + + @TestMetadata("qualifiedName2.kt") + public void testQualifiedName2() throws Exception { + runTest("testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt"); + } + @TestMetadata("simple.kt") public void testSimple() throws Exception { runTest("testData/intentions/joinDeclarationAndAssignment/simple.kt"); diff --git a/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt new file mode 100644 index 000000000000..4720d98bbe2b --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt @@ -0,0 +1,8 @@ +// IS_APPLICABLE: true +object Foo { + val prop: Boolean + + init { + Foo.prop = true + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt.after b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt.after new file mode 100644 index 000000000000..094c475f1c0a --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName.kt.after @@ -0,0 +1,5 @@ +// IS_APPLICABLE: true +object Foo { + val prop: Boolean = true + +} diff --git a/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt new file mode 100644 index 000000000000..08bff9a1076c --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt @@ -0,0 +1,10 @@ +// IS_APPLICABLE: true +package pack + +object Foo { + val prop: Boolean + + init { + pack.Foo.prop = true + } +} \ No newline at end of file diff --git a/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt.after b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt.after new file mode 100644 index 000000000000..eb6cfacdaa1e --- /dev/null +++ b/plugins/kotlin/idea/tests/testData/intentions/joinDeclarationAndAssignment/qualifiedName2.kt.after @@ -0,0 +1,7 @@ +// IS_APPLICABLE: true +package pack + +object Foo { + val prop: Boolean = true + +} \ No newline at end of file