diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt index 0489fe5b902..4788bda1b7a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/introduce/introduceImportAlias/KotlinIntroduceImportAliasHandler.kt @@ -9,10 +9,7 @@ import com.intellij.openapi.actionSystem.DataContext import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project -import com.intellij.psi.PsiDocumentManager -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile -import com.intellij.psi.PsiNamedElement +import com.intellij.psi.* import com.intellij.psi.search.searches.ReferencesSearch import com.intellij.refactoring.RefactoringActionHandler import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer @@ -23,7 +20,6 @@ import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.core.util.CodeInsightUtils import org.jetbrains.kotlin.idea.imports.importableFqName import org.jetbrains.kotlin.idea.refactoring.selectElement -import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.references.findPsiDeclarations import org.jetbrains.kotlin.idea.references.mainReference import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors @@ -36,15 +32,13 @@ import org.jetbrains.kotlin.idea.util.getResolutionScope import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.KtUserType +import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.* import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier import org.jetbrains.kotlin.resolve.scopes.utils.findPackage +import org.jetbrains.kotlin.utils.addToStdlib.safeAs object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { const val REFACTORING_NAME = "Introduce Import Alias" @@ -61,7 +55,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { descriptor.findPsiDeclarations(project, resolveScope).flatMap { ReferencesSearch.search(it, fileSearchScope) .findAll() - .map { reference -> UsageContext(reference as KtSimpleNameReference, isExtension = isExtension) } + .map { reference -> UsageContext(reference.element.createSmartPointer(), isExtension = isExtension) } } } @@ -69,7 +63,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { val oldName = element.mainReference.value val scopes = usages.mapNotNull { - val expression = it.reference.element + val expression = it.pointer.element as? KtElement ?: return@mapNotNull null expression.getResolutionScope(expression.analyze(BodyResolveMode.PARTIAL_FOR_COMPLETION)) }.distinct() @@ -111,7 +105,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler { } } -private data class UsageContext(val reference: KtSimpleNameReference, val isExtension: Boolean) +private data class UsageContext(val pointer: SmartPsiElementPointer, val isExtension: Boolean) private fun cleanImport(file: KtFile, fqName: FqName) { file.importDirectives.find { it.alias == null && fqName == it.importedFqName }?.delete() @@ -129,10 +123,11 @@ private fun invokeRename( } private fun replaceUsages(usages: List, newName: String) { - usages.filter { !it.reference.isImportUsage() } + usages.filter { it.pointer.element?.safeAs()?.mainReference?.isImportUsage() == false } .reversed() // case: inner element .forEach { - val newExpression = it.reference.handleElementRename(newName) as KtNameReferenceExpression + val reference = it.pointer.element?.safeAs()?.mainReference ?: return@forEach + val newExpression = reference.handleElementRename(newName) as KtNameReferenceExpression if (it.isExtension) { newExpression.getQualifiedElementSelector()?.replace(newExpression) return@forEach