From 80f1efaddc45ac2984989947f5f93f5e017c53c6 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 18 Jan 2019 17:03:47 +0300 Subject: [PATCH] Dispose range markers in UI thread to prevent race condition at getting range (KT-28870) #KT-28870 Fixed --- .../kotlin/idea/conversion/copy/RangeUtils.kt | 15 ++++++++++++++- .../parameterInfo/custom/KotlinCodeHintsModel.kt | 8 ++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/RangeUtils.kt b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/RangeUtils.kt index 3e75e31c965..9861fa47c79 100644 --- a/idea/src/org/jetbrains/kotlin/idea/conversion/copy/RangeUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/conversion/copy/RangeUtils.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.idea.conversion.copy +import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.RangeMarker import com.intellij.openapi.util.TextRange import com.intellij.psi.PsiElement @@ -32,4 +33,16 @@ val PsiElement.range: TextRange get() = textRange!! val RangeMarker.range: TextRange? - get() = if (isValid) TextRange(startOffset, endOffset) else null + get() = if (isValid) { + val start = startOffset + val end = endOffset + if (start in 0..end) { + TextRange(start, end) + } else { + // Probably a race condition had happened + LOG.error("Invalid range [$start, $end] for range marker (valid = $isValid)") + null + } + } else null + +private val LOG = Logger.getInstance("RangeUtils") diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/custom/KotlinCodeHintsModel.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/custom/KotlinCodeHintsModel.kt index 3987f3de725..280a0c7ed2a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/custom/KotlinCodeHintsModel.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/custom/KotlinCodeHintsModel.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.parameterInfo.custom +import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.editor.Document import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.EditorFactory @@ -66,8 +67,11 @@ class KotlinCodeHintsModel(val project: Project) : EditorFactoryListenerWrapper } fun dispose() { - for (marker in lineEndMarkers.keys()) { - marker.dispose() + val keys = lineEndMarkers.keys() + ApplicationManager.getApplication().invokeLater { + for (marker in keys) { + marker.dispose() + } } } }