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 -> usageInfos?.forEach { usage ->
when (usage) { when (usage) {
is MoveRenameKotlinUsageInfo -> { is MoveRenameKotlinUsageInfo -> {
usage.jetReference.bindToFqName(usage.newFqName, false) usage.jetReference.bindToFqName(usage.newFqName)
} }
is MoveRenameJavaUsageInfo -> { is MoveRenameJavaUsageInfo -> {
val lightElements = usage.jetDeclaration.toLightElements() val lightElements = usage.jetDeclaration.toLightElements()
@@ -176,6 +176,6 @@ public class MoveKotlinFileHandler : MoveFileHandler() {
file.updateInternalReferencesOnPackageNameChange(packageNameInfo) file.updateInternalReferencesOnPackageNameChange(packageNameInfo)
val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference 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.resolve.name.FqName
import org.jetbrains.jet.lang.psi.JetFile import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.lang.psi.JetElement 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 class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName)
public fun JetElement.updateInternalReferencesOnPackageNameChange( public fun JetElement.updateInternalReferencesOnPackageNameChange(
packageNameInfo: PackageNameInfo, forceImmediateBinding: Boolean = false packageNameInfo: PackageNameInfo, shorteningMode: ShorteningMode = ShorteningMode.DELAYED_SHORTENING
) { ) {
val file = getContainingFile() as? JetFile val file = getContainingFile() as? JetFile
if (file == null) return if (file == null) return
@@ -53,7 +54,7 @@ public fun JetElement.updateInternalReferencesOnPackageNameChange(
packageNameInfo.newPackageName -> { packageNameInfo.newPackageName -> {
val fqName = DescriptorUtils.getFqName(descriptor) val fqName = DescriptorUtils.getFqName(descriptor)
if (fqName.isSafe()) { 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) return expression.getReferencedNameElement().replace(element)
} }
// By default reference binding is delayed public enum class ShorteningMode {
override fun bindToElement(element: PsiElement): PsiElement = bindToElement(element, false) NO_SHORTENING
DELAYED_SHORTENING
public fun bindToElement(element: PsiElement, bindImmediately: Boolean): PsiElement { FORCED_SHORTENING
return element.getFqName()?.let { fqName -> bindToFqName(fqName, bindImmediately) } ?: expression
} }
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 if (fqName.isRoot()) return expression
val newExpression = expression.changeQualifiedName(fqName).getQualifiedElementSelector() as JetSimpleNameExpression val newExpression = expression.changeQualifiedName(fqName).getQualifiedElementSelector() as JetSimpleNameExpression
val newQualifiedElement = newExpression.getOutermostNonInterleavingQualifiedElement() val newQualifiedElement = newExpression.getOutermostNonInterleavingQualifiedElement()
if (shorteningMode == ShorteningMode.NO_SHORTENING) return newExpression
val needToShorten = val needToShorten =
PsiTreeUtil.getParentOfType(expression, javaClass<JetImportDirective>(), javaClass<JetPackageDirective>()) == null PsiTreeUtil.getParentOfType(expression, javaClass<JetImportDirective>(), javaClass<JetPackageDirective>()) == null
if (needToShorten) { if (needToShorten) {
if (forceImmediateBinding) { if (shorteningMode == ShorteningMode.FORCED_SHORTENING) {
ShortenReferences.process(newQualifiedElement) ShortenReferences.process(newQualifiedElement)
} }
else { else {