diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt index 8c19de5dd9b..70084161930 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt @@ -57,7 +57,7 @@ class JoinDeclarationAndAssignmentIntention : SelfTargetingRangeIntention + hasNoLocalDependencies(it, element) && assignment.analyze().let { context -> (element.isVar && !element.isLocal) || equalNullableTypes(it.getType(context), context[BindingContext.TYPE, element.typeReference]) } @@ -155,10 +155,13 @@ class JoinDeclarationAndAssignmentIntention : SelfTargetingRangeIntention { child -> - child.resolveAllReferences().any { it != null && PsiTreeUtil.isAncestor(localContext, it, false) } + private fun hasNoLocalDependencies(element: KtElement, property: KtProperty): Boolean { + val localContext = property.parent + val nextSiblings = property.siblings(forward = true, withItself = false) + return !element.anyDescendantOfType { child -> + child.resolveAllReferences().any { it != null && PsiTreeUtil.isAncestor(localContext, it, false) && it in nextSiblings } } + } } private fun PsiElement.resolveAllReferences(): Sequence = diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt new file mode 100644 index 00000000000..84edf68e1fa --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt @@ -0,0 +1,8 @@ +class Test(height: Int, width: Int) { + private val size: Int = height * width + private val data: Int + + init { + data = size + } +} \ No newline at end of file diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt.after b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt.after new file mode 100644 index 00000000000..3a1d75860c2 --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt.after @@ -0,0 +1,5 @@ +class Test(height: Int, width: Int) { + private val size: Int = height * width + private val data: Int = size + +} \ No newline at end of file diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt new file mode 100644 index 00000000000..16833580cb5 --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt @@ -0,0 +1,10 @@ +class Foo(size: Int) + +class Test(height: Int, width: Int) { + private val size: Int = height * width + private val data: Foo + + init { + data = Foo(size) + } +} \ No newline at end of file diff --git a/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt.after b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt.after new file mode 100644 index 00000000000..ad41c353e95 --- /dev/null +++ b/idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt.after @@ -0,0 +1,7 @@ +class Foo(size: Int) + +class Test(height: Int, width: Int) { + private val size: Int = height * width + private val data: Foo = Foo(size) + +} \ 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 7361e3149cb..aada917c937 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -10826,6 +10826,16 @@ public class IntentionTestGenerated extends AbstractIntentionTest { runTest("idea/testData/intentions/joinDeclarationAndAssignment/usedLocal2.kt"); } + @TestMetadata("usedLocal3.kt") + public void testUsedLocal3() throws Exception { + runTest("idea/testData/intentions/joinDeclarationAndAssignment/usedLocal3.kt"); + } + + @TestMetadata("usedLocal4.kt") + public void testUsedLocal4() throws Exception { + runTest("idea/testData/intentions/joinDeclarationAndAssignment/usedLocal4.kt"); + } + @TestMetadata("varReassignment.kt") public void testVarReassignment() throws Exception { runTest("idea/testData/intentions/joinDeclarationAndAssignment/varReassignment.kt");