FIR IDE: fix behaviour of DiagnosticTraversalCounterTest

This commit is contained in:
Ilya Kirillov
2021-04-09 11:40:00 +02:00
parent 32c1101959
commit e78e8f8c79
@@ -7,7 +7,9 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.diagnostic
import com.intellij.openapi.util.io.FileUtil import com.intellij.openapi.util.io.FileUtil
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.FirRealSourceElementKind
import org.jetbrains.kotlin.fir.SessionConfiguration import org.jetbrains.kotlin.fir.SessionConfiguration
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter
@@ -15,6 +17,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile
import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir
import org.jetbrains.kotlin.idea.fir.low.level.api.createResolveStateForNoCaching import org.jetbrains.kotlin.idea.fir.low.level.api.createResolveStateForNoCaching
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.BeforeElementDiagnosticCollectionHandler import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.BeforeElementDiagnosticCollectionHandler
import org.jetbrains.kotlin.idea.fir.low.level.api.diagnostics.SingleNonLocalDeclarationDiagnosticRetriever
import org.jetbrains.kotlin.idea.fir.low.level.api.renderWithClassName import org.jetbrains.kotlin.idea.fir.low.level.api.renderWithClassName
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -72,7 +75,17 @@ abstract class AbstractDiagnosticTraversalCounterTest : KotlinLightCodeInsightFi
handler: BeforeElementTestDiagnosticCollectionHandler handler: BeforeElementTestDiagnosticCollectionHandler
): List<Pair<FirElement, Int>> { ): List<Pair<FirElement, Int>> {
val errorElements = mutableListOf<Pair<FirElement, Int>>() val errorElements = mutableListOf<Pair<FirElement, Int>>()
val nonDuplicatingElements = findNonDuplicatingFirElements(firFile) val nonDuplicatingElements = findNonDuplicatingFirElements(firFile).filter { element ->
when {
element is FirTypeRef && element.source?.kind != FirRealSourceElementKind -> {
// AbstractDiagnosticCollectorVisitor do not visit such elements
false
}
element.source?.kind == FirRealSourceElementKind -> true
SingleNonLocalDeclarationDiagnosticRetriever.shouldDiagnosticsAlwaysBeCheckedOn(element) -> true
else -> false
}
}
firFile.accept(object : FirVisitorVoid() { firFile.accept(object : FirVisitorVoid() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
if (element !in nonDuplicatingElements) return if (element !in nonDuplicatingElements) return
@@ -86,6 +99,7 @@ abstract class AbstractDiagnosticTraversalCounterTest : KotlinLightCodeInsightFi
return errorElements return errorElements
} }
private fun findNonDuplicatingFirElements( private fun findNonDuplicatingFirElements(
firFile: FirElement, firFile: FirElement,
): Set<FirElement> { ): Set<FirElement> {
@@ -93,6 +107,7 @@ abstract class AbstractDiagnosticTraversalCounterTest : KotlinLightCodeInsightFi
firFile.accept(object : FirVisitorVoid() { firFile.accept(object : FirVisitorVoid() {
override fun visitElement(element: FirElement) { override fun visitElement(element: FirElement) {
elementUsageCount.compute(element) { _, count -> (count ?: 0) + 1 } elementUsageCount.compute(element) { _, count -> (count ?: 0) + 1 }
element.acceptChildren(this)
} }
}) })
return elementUsageCount.filterValues { it == 1 }.keys return elementUsageCount.filterValues { it == 1 }.keys