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 1a0240371df..bdbc8b1f9c6 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/move/MoveKotlinFileHandler.kt @@ -40,12 +40,7 @@ import java.util.Collections import org.jetbrains.jet.plugin.references.JetSimpleNameReference import com.intellij.openapi.util.Key import org.jetbrains.jet.plugin.refactoring.getAndRemoveCopyableUserData -import org.jetbrains.jet.lang.psi.JetSimpleNameExpression import org.jetbrains.jet.lang.psi.psiUtil.getPackage -import org.jetbrains.jet.plugin.codeInsight.JetFileReferencesResolver -import org.jetbrains.jet.lang.resolve.BindingContext -import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor -import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor import org.jetbrains.jet.plugin.references.JetReference import org.jetbrains.jet.asJava.toLightElements import org.jetbrains.jet.lang.psi.JetDeclaration @@ -75,8 +70,6 @@ public class MoveKotlinFileHandler : MoveFileHandler() { val jetDeclaration: JetDeclaration get() = getReferencedElement() as JetDeclaration } - class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName) - private val PACKAGE_NAME_INFO_KEY = Key.create("${javaClass().getCanonicalName()}.PACKAGE_NAME_INFO_KEY") } @@ -180,29 +173,7 @@ public class MoveKotlinFileHandler : MoveFileHandler() { val packageNameInfo = file.getAndRemoveCopyableUserData(PACKAGE_NAME_INFO_KEY) if (packageNameInfo == null) return - val referenceToContext = JetFileReferencesResolver.resolve(file = file, visitReceivers = false) - - for ((refExpr, bindingContext) in referenceToContext) { - if (refExpr !is JetSimpleNameExpression) continue - - val descriptor = bindingContext[BindingContext.REFERENCE_TARGET, refExpr]?.let { descriptor -> - if (descriptor is ConstructorDescriptor) descriptor.getContainingDeclaration() else descriptor - } - if (descriptor == null) continue - - val packageName = DescriptorUtils.getParentOfType( - descriptor, javaClass(), false - )?.let { DescriptorUtils.getFqName(it).toSafe() } - when (packageName) { - packageNameInfo.oldPackageName, - packageNameInfo.newPackageName -> { - val fqName = DescriptorUtils.getFqName(descriptor) - if (fqName.isSafe()) { - (refExpr.getReference() as? JetSimpleNameReference)?.bindToFqName(fqName.toSafe(), false) - } - } - } - } + file.updateInternalReferencesOnPackageNameChange(packageNameInfo) val packageRef = file.getPackageDirective()?.getLastReferenceExpression()?.getReference() as? JetSimpleNameReference packageRef?.bindToFqName(packageNameInfo.newPackageName, true) diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt new file mode 100644 index 00000000000..fae8cbe7190 --- /dev/null +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/move/moveUtils.kt @@ -0,0 +1,61 @@ +/* + * Copyright 2010-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.jet.plugin.refactoring.move + +import org.jetbrains.jet.plugin.codeInsight.JetFileReferencesResolver +import org.jetbrains.jet.lang.psi.JetSimpleNameExpression +import org.jetbrains.jet.lang.resolve.BindingContext +import org.jetbrains.jet.lang.descriptors.ConstructorDescriptor +import org.jetbrains.jet.lang.resolve.DescriptorUtils +import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor +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 + +public class PackageNameInfo(val oldPackageName: FqName, val newPackageName: FqName) + +public fun JetElement.updateInternalReferencesOnPackageNameChange( + packageNameInfo: PackageNameInfo, forceImmediateBinding: Boolean = false +) { + val file = getContainingFile() as? JetFile + if (file == null) return + + val referenceToContext = JetFileReferencesResolver.resolve(file = file, elements = listOf(this), visitReceivers = false) + + for ((refExpr, bindingContext) in referenceToContext) { + if (refExpr !is JetSimpleNameExpression) continue + + val descriptor = bindingContext[BindingContext.REFERENCE_TARGET, refExpr]?.let { descriptor -> + if (descriptor is ConstructorDescriptor) descriptor.getContainingDeclaration() else descriptor + } + if (descriptor == null) continue + + val packageName = DescriptorUtils.getParentOfType( + descriptor, javaClass(), false + )?.let { DescriptorUtils.getFqName(it).toSafe() } + when (packageName) { + packageNameInfo.oldPackageName, + packageNameInfo.newPackageName -> { + val fqName = DescriptorUtils.getFqName(descriptor) + if (fqName.isSafe()) { + (refExpr.getReference() as? JetSimpleNameReference)?.bindToFqName(fqName.toSafe(), forceImmediateBinding) + } + } + } + } +} \ No newline at end of file