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");