diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/diagnosticBasedPostProcessing.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/diagnosticBasedPostProcessing.kt index 768723616f6..bd6c15fa25f 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/diagnosticBasedPostProcessing.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/diagnosticBasedPostProcessing.kt @@ -11,7 +11,6 @@ import com.intellij.psi.PsiElement import org.jetbrains.kotlin.caches.resolve.KotlinCacheService import org.jetbrains.kotlin.diagnostics.Diagnostic import org.jetbrains.kotlin.diagnostics.DiagnosticFactory -import org.jetbrains.kotlin.idea.caches.resolve.getResolutionFacade import org.jetbrains.kotlin.idea.core.util.range import org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory @@ -36,17 +35,20 @@ class DiagnosticBasedPostProcessingGroup(diagnosticBasedProcessings: List, rangeMarker: RangeMarker?, converterContext: NewJ2kConverterContext) { - val resolutionFacade = runReadAction { KotlinCacheService.getInstance(converterContext.project).getResolutionFacade(allFiles) } - val diagnostics = runReadAction { analyzeFileRange(file, rangeMarker, resolutionFacade).all() } - runUndoTransparentActionInEdt(inWriteAction = true) { - for (diagnostic in diagnostics) { + val diagnostics = runReadAction { + val resolutionFacade = KotlinCacheService.getInstance(converterContext.project).getResolutionFacade(allFiles) + analyzeFileRange(file, rangeMarker, resolutionFacade).all() + } + for (diagnostic in diagnostics) { + val elementIsInRange = runReadAction { val range = rangeMarker?.range ?: file.textRange - if (diagnostic.psiElement.isInRange(range)) { - diagnosticToFix[diagnostic.factory]?.forEach { fix -> - if (diagnostic.psiElement.isValid) { - fix(diagnostic) - } - } + diagnostic.psiElement.isInRange(range) + } + if (!elementIsInRange) continue + diagnosticToFix[diagnostic.factory]?.forEach { fix -> + val elementIsValid = runReadAction { diagnostic.psiElement.isValid } + if (elementIsValid) { + fix(diagnostic) } } } @@ -78,7 +80,7 @@ inline fun diagnosticBasedProcessing( override val diagnosticFactories = diagnosticFactory.toList() override fun fix(diagnostic: Diagnostic) { val element = diagnostic.psiElement as? T - if (element != null) { + if (element != null) runUndoTransparentActionInEdt(inWriteAction = true) { fix(element, diagnostic) } } @@ -88,8 +90,10 @@ fun diagnosticBasedProcessing(fixFactory: KotlinIntentionActionsFactory, vararg object : DiagnosticBasedProcessing { override val diagnosticFactories = diagnosticFactory.toList() override fun fix(diagnostic: Diagnostic) { - val fix = fixFactory.createActions(diagnostic).singleOrNull() - fix?.invoke(diagnostic.psiElement.project, null, diagnostic.psiFile) + val fix = runReadAction { fixFactory.createActions(diagnostic).singleOrNull() } ?: return + runUndoTransparentActionInEdt(inWriteAction = true) { + fix.invoke(diagnostic.psiElement.project, null, diagnostic.psiFile) + } } } diff --git a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/utils.kt b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/utils.kt index d77311bc341..d5f73157b68 100644 --- a/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/utils.kt +++ b/nj2k/nj2k-services/src/org/jetbrains/kotlin/nj2k/postProcessing/utils.kt @@ -83,7 +83,7 @@ inline fun List.descendantsOfType(): List Unit) { +fun runUndoTransparentActionInEdt(inWriteAction: Boolean, action: () -> Unit) { ApplicationManager.getApplication().invokeAndWait { CommandProcessor.getInstance().runUndoTransparentAction { if (inWriteAction) {