diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImpl.java index 2b4a0659315..a88c3c8a0f3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImpl.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImpl.java @@ -19,14 +19,12 @@ package org.jetbrains.kotlin.psi; import com.intellij.extapi.psi.ASTWrapperPsiElement; import com.intellij.lang.ASTNode; import com.intellij.lang.Language; -import com.intellij.psi.PsiElementVisitor; -import com.intellij.psi.PsiFile; -import com.intellij.psi.PsiReference; -import com.intellij.psi.PsiReferenceService; +import com.intellij.psi.*; import com.intellij.psi.impl.source.resolve.reference.ReferenceProvidersRegistry; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.KotlinLanguage; +import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt; public class KtElementImpl extends ASTWrapperPsiElement implements KtElement { public KtElementImpl(@NotNull ASTNode node) { @@ -96,4 +94,10 @@ public class KtElementImpl extends ASTWrapperPsiElement implements KtElement { public KtElement getPsiOrParent() { return this; } + + @Override + public PsiElement getParent() { + PsiElement substitute = KtPsiUtilKt.getParentSubstitute(this); + return substitute != null ? substitute : super.getParent(); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImplStub.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImplStub.java index 3ead48691fa..96e897cdd13 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImplStub.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtElementImplStub.java @@ -26,6 +26,7 @@ import com.intellij.psi.stubs.StubElement; import com.intellij.util.IncorrectOperationException; import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.idea.KotlinLanguage; +import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt; import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementType; import java.util.Arrays; @@ -117,4 +118,10 @@ public class KtElementImplStub> extends StubBasedPsiEle public KtElement getPsiOrParent() { return this; } + + @Override + public PsiElement getParent() { + PsiElement substitute = KtPsiUtilKt.getParentSubstitute(this); + return substitute != null ? substitute : super.getParent(); + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt index 09b7027a642..9160b6cadce 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/psiUtil/ktPsiUtil.kt @@ -17,6 +17,7 @@ package org.jetbrains.kotlin.psi.psiUtil import com.intellij.extapi.psi.StubBasedPsiElementBase +import com.intellij.openapi.util.Key import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement import com.intellij.psi.PsiParameter @@ -570,4 +571,6 @@ fun KtExpression.getLabeledParent(labelName: String): KtLabeledExpression? { return null } -fun PsiElement.astReplace(newElement: PsiElement) = parent.node.replaceChild(node, newElement.node) \ No newline at end of file +fun PsiElement.astReplace(newElement: PsiElement) = parent.node.replaceChild(node, newElement.node) + +var KtElement.parentSubstitute: PsiElement? by UserDataProperty(Key.create("PARENT_SUBSTITUTE")) \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt index c6aae5b39f0..3bd235ff3fa 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/renameConflictUtils.kt @@ -44,6 +44,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.resolve.BindingContext +import org.jetbrains.kotlin.resolve.DelegatingBindingTrace import org.jetbrains.kotlin.resolve.calls.callUtil.getResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.resolvedCallUtil.getExplicitReceiverValue @@ -288,7 +289,8 @@ private fun checkUsagesRetargeting( newCallee.getReferencedNameElement().replace(psiFactory.createNameIdentifier(name)) } - val newContext = qualifiedExpression.analyzeInContext(scope, refElement) + qualifiedExpression.parentSubstitute = fullCallExpression.parent + val newContext = qualifiedExpression.analyzeInContext(scope, refElement, DelegatingBindingTrace(context, "")) val newResolvedCall = newCallee.getResolvedCall(newContext) val candidateText = newResolvedCall?.candidateDescriptor?.getImportableDescriptor()?.canonicalRender()