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.application.ApplicationManager
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiDocumentManager
|
import com.intellij.psi.*
|
||||||
import com.intellij.psi.PsiElement
|
|
||||||
import com.intellij.psi.PsiFile
|
|
||||||
import com.intellij.psi.PsiNamedElement
|
|
||||||
import com.intellij.psi.search.searches.ReferencesSearch
|
import com.intellij.psi.search.searches.ReferencesSearch
|
||||||
import com.intellij.refactoring.RefactoringActionHandler
|
import com.intellij.refactoring.RefactoringActionHandler
|
||||||
import com.intellij.refactoring.rename.inplace.VariableInplaceRenamer
|
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.core.util.CodeInsightUtils
|
||||||
import org.jetbrains.kotlin.idea.imports.importableFqName
|
import org.jetbrains.kotlin.idea.imports.importableFqName
|
||||||
import org.jetbrains.kotlin.idea.refactoring.selectElement
|
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.findPsiDeclarations
|
||||||
import org.jetbrains.kotlin.idea.references.mainReference
|
import org.jetbrains.kotlin.idea.references.mainReference
|
||||||
import org.jetbrains.kotlin.idea.references.resolveMainReferenceToDescriptors
|
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.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
|
||||||
import org.jetbrains.kotlin.psi.KtNameReferenceExpression
|
|
||||||
import org.jetbrains.kotlin.psi.KtUserType
|
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier
|
import org.jetbrains.kotlin.resolve.scopes.utils.findClassifier
|
||||||
import org.jetbrains.kotlin.resolve.scopes.utils.findPackage
|
import org.jetbrains.kotlin.resolve.scopes.utils.findPackage
|
||||||
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
|
|
||||||
object KotlinIntroduceImportAliasHandler : RefactoringActionHandler {
|
object KotlinIntroduceImportAliasHandler : RefactoringActionHandler {
|
||||||
const val REFACTORING_NAME = "Introduce Import Alias"
|
const val REFACTORING_NAME = "Introduce Import Alias"
|
||||||
@@ -61,7 +55,7 @@ object KotlinIntroduceImportAliasHandler : RefactoringActionHandler {
|
|||||||
descriptor.findPsiDeclarations(project, resolveScope).flatMap {
|
descriptor.findPsiDeclarations(project, resolveScope).flatMap {
|
||||||
ReferencesSearch.search(it, fileSearchScope)
|
ReferencesSearch.search(it, fileSearchScope)
|
||||||
.findAll()
|
.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 oldName = element.mainReference.value
|
||||||
val scopes = usages.mapNotNull {
|
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))
|
expression.getResolutionScope(expression.analyze(BodyResolveMode.PARTIAL_FOR_COMPLETION))
|
||||||
}.distinct()
|
}.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) {
|
private fun cleanImport(file: KtFile, fqName: FqName) {
|
||||||
file.importDirectives.find { it.alias == null && fqName == it.importedFqName }?.delete()
|
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) {
|
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
|
.reversed() // case: inner element
|
||||||
.forEach {
|
.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) {
|
if (it.isExtension) {
|
||||||
newExpression.getQualifiedElementSelector()?.replace(newExpression)
|
newExpression.getQualifiedElementSelector()?.replace(newExpression)
|
||||||
return@forEach
|
return@forEach
|
||||||
|
|||||||
Reference in New Issue
Block a user