Introduce reference shortening mode
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<JetImportDirective>(), javaClass<JetPackageDirective>()) == null
|
||||
if (needToShorten) {
|
||||
if (forceImmediateBinding) {
|
||||
if (shorteningMode == ShorteningMode.FORCED_SHORTENING) {
|
||||
ShortenReferences.process(newQualifiedElement)
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user