From 153bc79c08c7ad796e963443eb29ed8b152985e8 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 1 Feb 2017 20:27:31 +0300 Subject: [PATCH] Join declaration & assignment: do not suggest for non-first line of init / constructor #KT-15545 Fixed --- .../JoinDeclarationAndAssignmentIntention.kt | 6 ++++- .../notFirstInitLine.kt | 20 ++++++++++++++++ .../notFirstSecondaryConstructorLine.kt | 24 +++++++++++++++++++ .../intentions/IntentionTestGenerated.java | 12 ++++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 idea/testData/intentions/joinDeclarationAndAssignment/notFirstInitLine.kt create mode 100644 idea/testData/intentions/joinDeclarationAndAssignment/notFirstSecondaryConstructorLine.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt index 26340633f00..04a80bffd6f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt @@ -134,7 +134,11 @@ class JoinDeclarationAndAssignmentIntention : SelfTargetingOffsetIndependentInte val first = assignments.firstOrNull() ?: return null if (assignments.any { it !== first && it.parent.parent is KtSecondaryConstructor}) return null - return first + + if (propertyContainer !is KtClassBody) return first + + val blockParent = first.parent as? KtBlockExpression ?: return null + return if (blockParent.statements.firstOrNull() == first) first else null } // a block that only contains comments is not empty diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/notFirstInitLine.kt b/idea/testData/intentions/joinDeclarationAndAssignment/notFirstInitLine.kt new file mode 100644 index 00000000000..4434140ec43 --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/notFirstInitLine.kt @@ -0,0 +1,20 @@ +// IS_APPLICABLE: false + +class A + +class AFabric { + lateinit var instance: A + fun init(config: Unit) { + instance = A() + } +} + +class V(fabric: AFabric) { + val a: A + init { + val config = getConfig() + fabric.init(config) + a = fabric.instance + } + fun getConfig() = Unit +} \ No newline at end of file diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/notFirstSecondaryConstructorLine.kt b/idea/testData/intentions/joinDeclarationAndAssignment/notFirstSecondaryConstructorLine.kt new file mode 100644 index 00000000000..04e7cd896fc --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/notFirstSecondaryConstructorLine.kt @@ -0,0 +1,24 @@ +// IS_APPLICABLE: false + +class A + +class AFabric { + lateinit var instance: A + fun init(config: Unit) { + instance = A() + } +} + +val fabric = AFabric() + +class V { + val a: A + + constructor() { + val config = getConfig() + fabric.init(config) + a = fabric.instance + } + + fun getConfig() = Unit +} \ 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 a74901f0632..81ad9d64a65 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -8922,6 +8922,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("notFirstInitLine.kt") + public void testNotFirstInitLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/joinDeclarationAndAssignment/notFirstInitLine.kt"); + doTest(fileName); + } + + @TestMetadata("notFirstSecondaryConstructorLine.kt") + public void testNotFirstSecondaryConstructorLine() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/joinDeclarationAndAssignment/notFirstSecondaryConstructorLine.kt"); + doTest(fileName); + } + @TestMetadata("propertyReassignment.kt") public void testPropertyReassignment() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/joinDeclarationAndAssignment/propertyReassignment.kt");