From 5e87fc35e0d5e30294a9831d10b320f539923a2c Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 3 Mar 2014 15:04:11 +0400 Subject: [PATCH] Do not rely on write action lock during preparation phase of RefactoringHelper #KT-4631 Fixed --- ...otlinShortenReferencesRefactoringHelper.kt | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinShortenReferencesRefactoringHelper.kt b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinShortenReferencesRefactoringHelper.kt index 1c43d65d402..006d37e2c1f 100644 --- a/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinShortenReferencesRefactoringHelper.kt +++ b/idea/src/org/jetbrains/jet/plugin/codeInsight/KotlinShortenReferencesRefactoringHelper.kt @@ -28,11 +28,19 @@ import org.jetbrains.jet.lang.resolve.name.FqName import org.jetbrains.jet.plugin.refactoring.changeQualifiedName import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector import org.jetbrains.jet.lang.psi.psiUtil.getOutermostNonInterleavingQualifiedElement +import com.intellij.openapi.diagnostic.Logger public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper> { + private val LOG = Logger.getInstance(javaClass().getCanonicalName())!! + override fun prepareOperation(usages: Array?): Set? { if (usages != null && usages.isNotEmpty()) { - ApplicationManager.getApplication()!!.runWriteAction { usages[0].getProject().getElementsToShorten(true)!!.clear() } + val project = usages[0].getProject() + val elementsToShorten = project.getElementsToShorten(false) + if (elementsToShorten != null && !elementsToShorten.isEmpty()) { + LOG.warn("Waiting set for reference shortening is not empty") + project.clearElementsToShorten() + } } return null } @@ -40,7 +48,7 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper?) { ApplicationManager.getApplication()!!.runWriteAction { project.getElementsToShorten(false)?.let { bindRequests -> - project.putUserData(ELEMENTS_TO_SHORTEN_KEY, null) + project.clearElementsToShorten() ShortenReferences.process( bindRequests .map() { req -> req.process()?.getOutermostNonInterleavingQualifiedElement() } @@ -51,8 +59,6 @@ public class KotlinShortenReferencesRefactoringHelper: RefactoringHelper>("ELEMENTS_TO_SHORTEN_KEY") - class ReferenceBindRequest(val refExpression: SmartPsiElementPointer, val fqName: FqName) { fun process(): JetSimpleNameExpression? { fun bindToFqName(expression: JetSimpleNameExpression, fqName: FqName): JetSimpleNameExpression { @@ -68,9 +74,10 @@ class ReferenceBindRequest(val refExpression: SmartPsiElementPointer>("ELEMENTS_TO_SHORTEN_KEY") + private fun Project.getElementsToShorten(createIfNeeded: Boolean): MutableSet? { var elementsToShorten = getUserData(ELEMENTS_TO_SHORTEN_KEY) if (createIfNeeded && elementsToShorten == null) { @@ -81,7 +88,11 @@ private fun Project.getElementsToShorten(createIfNeeded: Boolean): MutableSet