From 81e083a133c4fcabbaa10f784f95667b27219195 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Fri, 3 Feb 2017 19:23:09 +0300 Subject: [PATCH] Join declaration and assignment: extra descriptor check for assignment of the same property --- .../JoinDeclarationAndAssignmentIntention.kt | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt index 04a80bffd6f..b42c17fe018 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/JoinDeclarationAndAssignmentIntention.kt @@ -30,6 +30,7 @@ import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.callUtil.getType import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.TypeUtils @@ -132,13 +133,18 @@ class JoinDeclarationAndAssignmentIntention : SelfTargetingOffsetIndependentInte if (assignments.any { it.parent.invalidParent() }) return null - val first = assignments.firstOrNull() ?: return null - if (assignments.any { it !== first && it.parent.parent is KtSecondaryConstructor}) return null + val firstAssignment = assignments.firstOrNull() ?: return null + if (assignments.any { it !== firstAssignment && it.parent.parent is KtSecondaryConstructor}) return null - if (propertyContainer !is KtClassBody) return first + val context = firstAssignment.analyze() + val propertyDescriptor = context[BindingContext.DECLARATION_TO_DESCRIPTOR, property] ?: return null + val assignedDescriptor = firstAssignment.left.getResolvedCall(context)?.candidateDescriptor ?: return null + if (propertyDescriptor != assignedDescriptor) return null - val blockParent = first.parent as? KtBlockExpression ?: return null - return if (blockParent.statements.firstOrNull() == first) first else null + if (propertyContainer !is KtClassBody) return firstAssignment + + val blockParent = firstAssignment.parent as? KtBlockExpression ?: return null + return if (blockParent.statements.firstOrNull() == firstAssignment) firstAssignment else null } // a block that only contains comments is not empty