From 83bb07e5ac3eb83067f60182d9eb9bbce727a0ca Mon Sep 17 00:00:00 2001 From: Mikhail Zarechenskiy Date: Sat, 12 Oct 2019 00:42:43 +0300 Subject: [PATCH] Revert "Fix performance issue for case when there are a lot of warnings in file" This reverts commit 3d8e5c4f8ea920f111549aece083290b35392d41. Temporarily reverting this commit due to new flaky tests --- .../kotlin/codegen/state/GenerationState.kt | 3 --- .../kotlin/diagnostics/diagnosticUtils.kt | 6 ++--- .../kotlin/resolve/CompositeBindingContext.kt | 4 ---- .../kotlin/resolve/diagnostics/Diagnostics.kt | 5 ---- .../MutableDiagnosticsWithSuppression.kt | 23 +++++-------------- .../resolve/diagnostics/SimpleDiagnostics.kt | 1 + 6 files changed, 10 insertions(+), 32 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt index a897b4c5f4e..86a5c808a40 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/state/GenerationState.kt @@ -336,9 +336,6 @@ private class LazyJvmDiagnostics(compute: () -> Diagnostics) : Diagnostics { override fun noSuppression() = delegate.noSuppression() - override fun hasDiagnostic(diagnostic: Diagnostic) = - delegate.hasDiagnostic(diagnostic) - override fun iterator() = delegate.iterator() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/diagnosticUtils.kt b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/diagnosticUtils.kt index b3cc4d33ef0..c6a4957c83f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/diagnosticUtils.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/diagnosticUtils.kt @@ -112,9 +112,9 @@ fun ResolutionContext<*>.reportTypeMismatchDueToTypeProjection( } fun BindingTrace.reportDiagnosticOnce(diagnostic: Diagnostic) { - if (!bindingContext.diagnostics.hasDiagnostic(diagnostic)) { - report(diagnostic) - } + if (bindingContext.diagnostics.forElement(diagnostic.psiElement).any { it.factory == diagnostic.factory }) return + + report(diagnostic) } class TypeMismatchDueToTypeProjectionsData( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompositeBindingContext.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompositeBindingContext.kt index fdeadd1fca8..c4aee43a64f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompositeBindingContext.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompositeBindingContext.kt @@ -93,9 +93,5 @@ class CompositeBindingContext private constructor( override fun noSuppression(): Diagnostics { return CompositeDiagnostics(delegates.map { it.noSuppression() }) } - - override fun hasDiagnostic(diagnostic: Diagnostic): Boolean { - return delegates.any { it.hasDiagnostic(diagnostic) } - } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt index 811b6e91994..da83ac5b40c 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/Diagnostics.kt @@ -34,10 +34,6 @@ interface Diagnostics : Iterable { fun noSuppression(): Diagnostics - @JvmDefault - fun hasDiagnostic(diagnostic: Diagnostic): Boolean = - forElement(diagnostic.psiElement).any { it.factory == diagnostic.factory } - override fun iterator() = all().iterator() companion object { @@ -46,7 +42,6 @@ interface Diagnostics : Iterable { override val modificationTracker: ModificationTracker = ModificationTracker.NEVER_CHANGED override fun all() = listOf() override fun forElement(psiElement: PsiElement) = listOf() - override fun hasDiagnostic(diagnostic: Diagnostic): Boolean = false } } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt index b414bd80e08..47b3f4934ce 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/MutableDiagnosticsWithSuppression.kt @@ -17,11 +17,11 @@ package org.jetbrains.kotlin.resolve.diagnostics import org.jetbrains.kotlin.diagnostics.Diagnostic +import java.util.ArrayList import com.intellij.openapi.util.CompositeModificationTracker import com.intellij.util.CachedValueImpl import com.intellij.psi.util.CachedValueProvider import com.intellij.psi.PsiElement -import com.intellij.util.SmartList import org.jetbrains.annotations.TestOnly import org.jetbrains.kotlin.resolve.BindingContext @@ -29,12 +29,11 @@ class MutableDiagnosticsWithSuppression @JvmOverloads constructor( private val bindingContext: BindingContext, private val delegateDiagnostics: Diagnostics = Diagnostics.EMPTY ) : Diagnostics { - // Usually, we don't report on an element more than one diagnostic, so it's better to use SmartList here - private val diagnosticMap = HashMap>() + private val diagnosticList = ArrayList() //NOTE: CachedValuesManager is not used because it requires Project passed to this object private val cache = CachedValueImpl(CachedValueProvider { - val allDiagnostics = delegateDiagnostics.noSuppression().all() + getOwnDiagnostics() + val allDiagnostics = delegateDiagnostics.noSuppression().all() + diagnosticList CachedValueProvider.Result(DiagnosticsWithSuppression(bindingContext, allDiagnostics), modificationTracker) }) @@ -48,29 +47,19 @@ class MutableDiagnosticsWithSuppression @JvmOverloads constructor( //essential that this list is readonly fun getOwnDiagnostics(): List { - return diagnosticMap.values.flatten() + return diagnosticList } fun report(diagnostic: Diagnostic) { - diagnosticMap.getOrPut(diagnostic.psiElement, { SmartList() }).add(diagnostic) + diagnosticList.add(diagnostic) modificationTracker.incModificationCount() } fun clear() { - diagnosticMap.clear() + diagnosticList.clear() modificationTracker.incModificationCount() } - override fun hasDiagnostic(diagnostic: Diagnostic): Boolean { - if (cache.hasUpToDateValue()) return cache.value.hasDiagnostic(diagnostic) - if (delegateDiagnostics.hasDiagnostic(diagnostic)) return true - - // It's totally fine to check without any suppression logic as if passed diagnostic has the same factory & psiElement, - // then it has the same suppression logic, so it doesn't matter if we add it or not later - val list = diagnosticMap[diagnostic.psiElement] ?: return false - return list.any { it.factory == diagnostic.factory && it.psiElement == diagnostic.psiElement } - } - @TestOnly fun getReadonlyView(): DiagnosticsWithSuppression = readonlyView() } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/SimpleDiagnostics.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/SimpleDiagnostics.kt index 4de1bd9f889..6c4af145141 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/SimpleDiagnostics.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/diagnostics/SimpleDiagnostics.kt @@ -16,6 +16,7 @@ package org.jetbrains.kotlin.resolve.diagnostics +import com.intellij.openapi.util.Condition import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Diagnostic import java.util.ArrayList