New J2K: do not call custom diagnostic fixes in EDT as they may have resolve inside
This commit is contained in:
+18
-14
@@ -11,7 +11,6 @@ import com.intellij.psi.PsiElement
|
|||||||
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
import org.jetbrains.kotlin.caches.resolve.KotlinCacheService
|
||||||
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
import org.jetbrains.kotlin.diagnostics.Diagnostic
|
||||||
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory
|
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.core.util.range
|
||||||
import org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix
|
import org.jetbrains.kotlin.idea.quickfix.AddExclExclCallFix
|
||||||
import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory
|
import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory
|
||||||
@@ -36,17 +35,20 @@ class DiagnosticBasedPostProcessingGroup(diagnosticBasedProcessings: List<Diagno
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun runProcessing(file: KtFile, allFiles: List<KtFile>, rangeMarker: RangeMarker?, converterContext: NewJ2kConverterContext) {
|
override fun runProcessing(file: KtFile, allFiles: List<KtFile>, rangeMarker: RangeMarker?, converterContext: NewJ2kConverterContext) {
|
||||||
val resolutionFacade = runReadAction { KotlinCacheService.getInstance(converterContext.project).getResolutionFacade(allFiles) }
|
val diagnostics = runReadAction {
|
||||||
val diagnostics = runReadAction { analyzeFileRange(file, rangeMarker, resolutionFacade).all() }
|
val resolutionFacade = KotlinCacheService.getInstance(converterContext.project).getResolutionFacade(allFiles)
|
||||||
runUndoTransparentActionInEdt(inWriteAction = true) {
|
analyzeFileRange(file, rangeMarker, resolutionFacade).all()
|
||||||
for (diagnostic in diagnostics) {
|
}
|
||||||
|
for (diagnostic in diagnostics) {
|
||||||
|
val elementIsInRange = runReadAction {
|
||||||
val range = rangeMarker?.range ?: file.textRange
|
val range = rangeMarker?.range ?: file.textRange
|
||||||
if (diagnostic.psiElement.isInRange(range)) {
|
diagnostic.psiElement.isInRange(range)
|
||||||
diagnosticToFix[diagnostic.factory]?.forEach { fix ->
|
}
|
||||||
if (diagnostic.psiElement.isValid) {
|
if (!elementIsInRange) continue
|
||||||
fix(diagnostic)
|
diagnosticToFix[diagnostic.factory]?.forEach { fix ->
|
||||||
}
|
val elementIsValid = runReadAction { diagnostic.psiElement.isValid }
|
||||||
}
|
if (elementIsValid) {
|
||||||
|
fix(diagnostic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -78,7 +80,7 @@ inline fun <reified T : PsiElement> diagnosticBasedProcessing(
|
|||||||
override val diagnosticFactories = diagnosticFactory.toList()
|
override val diagnosticFactories = diagnosticFactory.toList()
|
||||||
override fun fix(diagnostic: Diagnostic) {
|
override fun fix(diagnostic: Diagnostic) {
|
||||||
val element = diagnostic.psiElement as? T
|
val element = diagnostic.psiElement as? T
|
||||||
if (element != null) {
|
if (element != null) runUndoTransparentActionInEdt(inWriteAction = true) {
|
||||||
fix(element, diagnostic)
|
fix(element, diagnostic)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -88,8 +90,10 @@ fun diagnosticBasedProcessing(fixFactory: KotlinIntentionActionsFactory, vararg
|
|||||||
object : DiagnosticBasedProcessing {
|
object : DiagnosticBasedProcessing {
|
||||||
override val diagnosticFactories = diagnosticFactory.toList()
|
override val diagnosticFactories = diagnosticFactory.toList()
|
||||||
override fun fix(diagnostic: Diagnostic) {
|
override fun fix(diagnostic: Diagnostic) {
|
||||||
val fix = fixFactory.createActions(diagnostic).singleOrNull()
|
val fix = runReadAction { fixFactory.createActions(diagnostic).singleOrNull() } ?: return
|
||||||
fix?.invoke(diagnostic.psiElement.project, null, diagnostic.psiFile)
|
runUndoTransparentActionInEdt(inWriteAction = true) {
|
||||||
|
fix.invoke(diagnostic.psiElement.project, null, diagnostic.psiFile)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -83,7 +83,7 @@ inline fun <reified T : PsiElement> List<PsiElement>.descendantsOfType(): List<T
|
|||||||
fun PsiElement.isInRange(outerRange: TextRange) =
|
fun PsiElement.isInRange(outerRange: TextRange) =
|
||||||
outerRange.contains(range)
|
outerRange.contains(range)
|
||||||
|
|
||||||
internal fun runUndoTransparentActionInEdt(inWriteAction: Boolean, action: () -> Unit) {
|
fun runUndoTransparentActionInEdt(inWriteAction: Boolean, action: () -> Unit) {
|
||||||
ApplicationManager.getApplication().invokeAndWait {
|
ApplicationManager.getApplication().invokeAndWait {
|
||||||
CommandProcessor.getInstance().runUndoTransparentAction {
|
CommandProcessor.getInstance().runUndoTransparentAction {
|
||||||
if (inWriteAction) {
|
if (inWriteAction) {
|
||||||
|
|||||||
Reference in New Issue
Block a user