From acaa900ee9be224ab74075af366fec82b1d6cf60 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Thu, 13 Mar 2014 14:55:55 +0400 Subject: [PATCH] Introduce reference shortening mode --- .../refactoring/move/MoveKotlinFileHandler.kt | 4 ++-- .../jet/plugin/refactoring/move/moveUtils.kt | 5 +++-- .../references/JetSimpleNameReference.kt | 20 ++++++++++++------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt index bdbc8b1f9c6..6ea5ded05d6 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt @@ -151,7 +151,7 @@ public class MoveKotlinFileHandler : MoveFileHandler() { usageInfos?.forEach { usage -> when (usage) { is MoveRenameKotlinUsageInfo -> { - usage.jetReference.bindToFqName(usage.newFqName, false) + usage.jetReference.bindToFqName(usage.newFqName) } is MoveRenameJavaUsageInfo -> { val lightElements = usage.jetDeclaration.toLightElements() @@ -176,6 +176,6 @@ public class MoveKotlinFileHandler : MoveFileHandler() { file.updateInternalReferencesOnPackageNameChange(packageNameInfo) val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference - packageRef?.bindToFqName(packageNameInfo.newPackageName, true) + packageRef?.bindToFqName(packageNameInfo.newPackageName) } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt index fae8cbe7190..1ac5a1af63f 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt @@ -26,11 +26,12 @@ import org.jetbrains.jet.plugin.references.JetSimpleNameReference import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetElement +import org.jetbrains.jet.plugin.references.JetSimpleNameReference.ShorteningMode public class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName) public fun JetElement.updateInternalReferencesOnPackageNameChange( - packageNameInfo: PackageNameInfo, forceImmediateBinding: Boolean = false + packageNameInfo: PackageNameInfo, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING ) { val file = getContainingFile() as? JetFile if (file == null) return @@ -53,7 +54,7 @@ public fun JetElement.updateInternalReferencesOnPackageNameChange( packageNameInfo.newPackageName -> { val fqName = DescriptorUtils.getFqName(descriptor) if (fqName.isSafe()) { - (refExpr.getReference() as? JetSimpleNameReference)?.bindToFqName(fqName.toSafe(), forceImmediateBinding) + (refExpr.getReference() as? JetSimpleNameReference)?.bindToFqName(fqName.toSafe(), shorteningMode) } } } diff --git a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.kt b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.kt index 4d24041bf16..bfea856bab4 100644 --- a/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.kt +++ b/idea/src/org/jetbrains/jet/plugin/references/JetSimpleNameReference.kt @@ -48,23 +48,29 @@ public class JetSimpleNameReference( return expression.getReferencedNameElement().replace(element) } - // By default reference binding is delayed - override fun bindToElement(element: PsiElement): PsiElement = bindToElement(element, false) - - public fun bindToElement(element: PsiElement, bindImmediately: Boolean): PsiElement { - return element.getFqName()?.let { fqName -> bindToFqName(fqName, bindImmediately) } ?: expression + public enum class ShorteningMode { + NO_SHORTENING + DELAYED_SHORTENING + FORCED_SHORTENING } - public fun bindToFqName(fqName: FqName, forceImmediateBinding: Boolean): PsiElement { + // By default reference binding is delayed + override fun bindToElement(element: PsiElement): PsiElement { + return element.getFqName()?.let { fqName -> bindToFqName(fqName) } ?: expression + } + + public fun bindToFqName(fqName: FqName, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING): PsiElement { if (fqName.isRoot()) return expression val newExpression = expression.changeQualifiedName(fqName).getQualifiedElementSelector() as JetSimpleNameExpression val newQualifiedElement = newExpression.getOutermostNonInterleavingQualifiedElement() + if (shorteningMode == ShorteningMode.NO_SHORTENING) return newExpression + val needToShorten = PsiTreeUtil.getParentOfType(expression, javaClass(), javaClass()) == null if (needToShorten) { - if (forceImmediateBinding) { + if (shorteningMode == ShorteningMode.FORCED_SHORTENING) { ShortenReferences.process(newQualifiedElement) } else {