From 37de9a0a2622089d2cefc43d8de4111d85193ecc Mon Sep 17 00:00:00 2001 From: Alexander Podkhalyuzin Date: Fri, 22 Mar 2019 13:27:12 +0300 Subject: [PATCH] Do not call find editor outside UI thread #KT-30117 Fixed --- .../KotlinUnusedImportInspection.kt | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt index 0886a8ae7c6..0d0345a8a1f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/KotlinUnusedImportInspection.kt @@ -39,6 +39,7 @@ import com.intellij.psi.PsiDocumentManager import com.intellij.psi.PsiElement import com.intellij.psi.PsiFile import com.intellij.psi.PsiWhiteSpace +import com.intellij.psi.util.PsiModificationTracker import com.intellij.psi.util.PsiUtilBase import com.intellij.util.DocumentUtil import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade @@ -154,26 +155,26 @@ class KotlinUnusedImportInspection : AbstractKotlinInspection() { val highlightingSession = HighlightingSessionImpl.getHighlightingSession(file, progress) val project = highlightingSession.project - val editor = PsiUtilBase.findEditor(file) - if (editor != null) { - val modificationStamp = editor.document.modificationStamp - val invokeFixLater = Disposable { - // later because should invoke when highlighting is finished - ApplicationManager.getApplication().invokeLater { - if (timeToOptimizeImportsOnTheFly(file, editor, project) && editor.document.modificationStamp == modificationStamp) { - optimizeImportsOnTheFly(file, optimizedImports, editor, project) - } + + val modificationCount = PsiModificationTracker.SERVICE.getInstance(project).modificationCount + val invokeFixLater = Disposable { + // later because should invoke when highlighting is finished + ApplicationManager.getApplication().invokeLater { + val editor = PsiUtilBase.findEditor(file) + val currentModificationCount = PsiModificationTracker.SERVICE.getInstance(project).modificationCount + if (editor != null && currentModificationCount == modificationCount && timeToOptimizeImportsOnTheFly(file, editor, project)) { + optimizeImportsOnTheFly(file, optimizedImports, editor, project) } } + } - if (Disposer.isDisposed(progress)) return - Disposer.register(progress, invokeFixLater) + if (Disposer.isDisposed(progress)) return + Disposer.register(progress, invokeFixLater) - if (progress.isCanceled) { - Disposer.dispose(invokeFixLater) - Disposer.dispose(progress) - progress.checkCanceled() - } + if (progress.isCanceled) { + Disposer.dispose(invokeFixLater) + Disposer.dispose(progress) + progress.checkCanceled() } }