From 37124e0c0d660666c8dfcb46bd721631bdf6d416 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Sat, 9 Jun 2018 15:22:48 +0300 Subject: [PATCH] Make collectSlowLineMarker handle parents to deal with changes correctly So #KT-20825 Fixed So #KT-21113 Fixed Related to IDEA-141330 fix --- .../markers/KotlinLineMarkerProvider.kt | 35 ++++++++++--------- .../markers/KotlinLineMarkerProvider.kt.172 | 35 ++++++++++--------- 2 files changed, 36 insertions(+), 34 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt index 433acfad7d2..c04449c455a 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt @@ -20,10 +20,7 @@ import com.intellij.openapi.editor.markup.SeparatorPlacement import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.NavigatablePsiElement -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiNameIdentifierOwner +import com.intellij.psi.* import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.LightClassUtil @@ -87,11 +84,14 @@ class KotlinLineMarkerProvider : LineMarkerProvider { val first = elements.first() if (DumbService.getInstance(first.project).isDumb || !ProjectRootsUtil.isInProjectOrLibSource(first)) return - val functions = HashSet() - val properties = HashSet() + val functions = hashSetOf() + val properties = hashSetOf() + val declarations = hashSetOf() - for (element in elements) { + for (leaf in elements) { ProgressManager.checkCanceled() + val element = leaf.parent as? KtNamedDeclaration ?: continue + if (!declarations.add(element)) continue when (element) { is KtClass -> { @@ -113,20 +113,11 @@ class KotlinLineMarkerProvider : LineMarkerProvider { } } } + collectMultiplatformMarkers(element, result) } collectOverriddenFunctions(functions, result) collectOverriddenPropertyAccessors(properties, result) - - for (element in elements) { - if (element !is KtNamedDeclaration) continue - - if (element.isExpectDeclaration()) { - collectActualMarkers(element, result) - } else if (element.isEffectivelyActual()) { - collectExpectedMarkers(element, result) - } - } } } @@ -339,6 +330,16 @@ private val KtNamedDeclaration.expectOrActualAnchor else -> null } ?: this +private fun collectMultiplatformMarkers( + declaration: KtNamedDeclaration, + result: MutableCollection> +) { + when { + declaration.isExpectDeclaration() -> collectActualMarkers(declaration, result) + declaration.isEffectivelyActual() -> collectExpectedMarkers(declaration, result) + } +} + private fun collectActualMarkers( declaration: KtNamedDeclaration, result: MutableCollection> diff --git a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt.172 b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt.172 index 4ca65a40ab4..3270653d4de 100644 --- a/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt.172 +++ b/idea/src/org/jetbrains/kotlin/idea/highlighter/markers/KotlinLineMarkerProvider.kt.172 @@ -20,10 +20,7 @@ import com.intellij.openapi.editor.markup.SeparatorPlacement import com.intellij.openapi.progress.ProgressManager import com.intellij.openapi.project.DumbService import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.NavigatablePsiElement -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiNameIdentifierOwner +import com.intellij.psi.* import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.asJava.LightClassUtil @@ -87,11 +84,14 @@ class KotlinLineMarkerProvider : LineMarkerProvider { val first = elements.first() if (DumbService.getInstance(first.project).isDumb || !ProjectRootsUtil.isInProjectOrLibSource(first)) return - val functions = HashSet() - val properties = HashSet() + val functions = hashSetOf() + val properties = hashSetOf() + val declarations = hashSetOf() - for (element in elements) { + for (leaf in elements) { ProgressManager.checkCanceled() + val element = leaf.parent as? KtNamedDeclaration ?: continue + if (!declarations.add(element)) continue when (element) { is KtClass -> { @@ -113,20 +113,11 @@ class KotlinLineMarkerProvider : LineMarkerProvider { } } } + collectMultiplatformMarkers(element, result) } collectOverriddenFunctions(functions, result) collectOverriddenPropertyAccessors(properties, result) - - for (element in elements) { - if (element !is KtNamedDeclaration) continue - - if (element.isExpectDeclaration()) { - collectActualMarkers(element, result) - } else if (element.isEffectivelyActual()) { - collectExpectedMarkers(element, result) - } - } } } @@ -337,6 +328,16 @@ private val KtNamedDeclaration.expectOrActualAnchor else -> null } ?: this +private fun collectMultiplatformMarkers( + declaration: KtNamedDeclaration, + result: MutableCollection> +) { + when { + declaration.isExpectDeclaration() -> collectActualMarkers(declaration, result) + declaration.isEffectivelyActual() -> collectExpectedMarkers(declaration, result) + } +} + private fun collectActualMarkers( declaration: KtNamedDeclaration, result: MutableCollection>