KotlinIntroduceImportAliasHandler: fix PIEAE

This commit is contained in:
Dmitry Gridin
2019-10-16 13:44:22 +07:00
parent d9faaddcca
commit aa364ea14e
@@ -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<PsiElement>, 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<UsageContext>, newName: String) {
usages.filter { !it.reference.isImportUsage() }
usages.filter { it.pointer.element?.safeAs<KtElement>()?.mainReference?.isImportUsage() == false }
.reversed() // case: inner element
.forEach {
val newExpression = it.reference.handleElementRename(newName) as KtNameReferenceExpression
val reference = it.pointer.element?.safeAs<KtElement>()?.mainReference ?: return@forEach
val newExpression = reference.handleElementRename(newName) as KtNameReferenceExpression
if (it.isExtension) {
newExpression.getQualifiedElementSelector()?.replace(newExpression)
return@forEach