KotlinIntroduceImportAliasHandler: fix PIEAE
This commit is contained in:
+9
-14
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user