Don't store PsiElement in LocalQuickFix instance (EA-90970 - PIEAE: PsiInvalidElementAccessException.createByNode)

This commit is contained in:
Dmitry Jemerov
2016-11-21 19:15:58 +01:00
parent f9f590d270
commit 58d725dac0
@@ -56,14 +56,16 @@ import org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory
import org.jetbrains.kotlin.idea.findUsages.handlers.KotlinFindClassUsagesHandler
import org.jetbrains.kotlin.idea.imports.importableFqName
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.search.usagesSearch.*
import org.jetbrains.kotlin.idea.search.usagesSearch.dataClassComponentFunction
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.idea.search.usagesSearch.getAccessorNames
import org.jetbrains.kotlin.idea.search.usagesSearch.getClassNameForCompanionObject
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.util.findCallableMemberBySignature
import org.jetbrains.kotlin.utils.singletonOrEmptyList
import java.awt.GridBagConstraints
@@ -343,16 +345,19 @@ class UnusedSymbolInspection : AbstractKotlinInspection() {
}
}
class SafeDeleteFix(val declaration: KtDeclaration) : LocalQuickFix {
override fun getName() =
class SafeDeleteFix(declaration: KtDeclaration) : LocalQuickFix {
private val name =
if (declaration is KtConstructor<*>) "Safe delete constructor"
else QuickFixBundle.message("safe.delete.text", declaration.name)
override fun getName() = name
override fun getFamilyName() = "Safe delete"
override fun startInWriteAction(): Boolean = false
override fun applyFix(project: Project, descriptor: ProblemDescriptor) {
val declaration = descriptor.psiElement.getStrictParentOfType<KtDeclaration>() ?: return
if (!FileModificationService.getInstance().prepareFileForWrite(declaration.containingFile)) return
SwingUtilities.invokeLater {
SafeDeleteHandler.invoke(project, arrayOf(declaration), false)