Introduce reference shortening mode

This commit is contained in:
Alexey Sedunov
2014-03-13 14:55:55 +04:00
parent a0ab7f6f22
commit acaa900ee9
3 changed files with 18 additions and 11 deletions
@@ -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 {