From a4564351d73a403402528a762c93b3028103a2e3 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 30 Oct 2023 16:46:47 +0100 Subject: [PATCH] [LL FIR] separate non-reversed/reversed test suppressors Each compiler-based LL FIR test can: - fail in both non-reversed and reversed configurations, muted with `// MUTE_LL_FIR` - fail in non-reversed test only, muted with `// IGNORE_NON_REVERSED_RESOLVE` - fail in reversed test only, muted with `// IGNORE_REVERSED_RESOLVE` --- .../low/level/api/fir/TestSuppressor.kt | 81 +++++++++++++++++++ .../based/AbstractCompilerBasedTestForFir.kt | 4 +- .../AbstractLLFirBlackBoxCodegenBasedTest.kt | 4 + ...ersedDiagnosticCompilerTestDataSpecTest.kt | 3 +- ...dReversedDiagnosticCompilerTestDataTest.kt | 28 +------ ...ctLLFirReversedBlackBoxCodegenBasedTest.kt | 3 +- .../based/LLFirCompiledBasedTestSuppressor.kt | 37 --------- 7 files changed, 93 insertions(+), 67 deletions(-) create mode 100644 analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/TestSuppressor.kt delete mode 100644 analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirCompiledBasedTestSuppressor.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/TestSuppressor.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/TestSuppressor.kt new file mode 100644 index 00000000000..49422d7f97b --- /dev/null +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/TestSuppressor.kt @@ -0,0 +1,81 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.low.level.api.fir + +import org.jetbrains.kotlin.test.WrappedException +import org.jetbrains.kotlin.test.directives.model.DirectivesContainer +import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer +import org.jetbrains.kotlin.test.directives.model.StringDirective +import org.jetbrains.kotlin.test.model.AfterAnalysisChecker +import org.jetbrains.kotlin.test.services.TestServices +import org.jetbrains.kotlin.test.services.moduleStructure + +abstract class TestByDirectiveSuppressor( + val suppressDirective: StringDirective, + directivesContainer: DirectivesContainer, + testServices: TestServices, +) : AfterAnalysisChecker(testServices) { + init { + require(suppressDirective in directivesContainer) + } + + override val directiveContainers: List = listOf(directivesContainer) + + override fun suppressIfNeeded(failedAssertions: List): List { + if (!isDisabled()) { + return failedAssertions + } + + return if (failedAssertions.isEmpty()) { + listOf( + AssertionError( + "Test contains $suppressDirective directive but no errors was reported. Please remove directive", + ).wrap() + ) + } else { + emptyList() + } + } + + private fun isDisabled(): Boolean = suppressDirective in testServices.moduleStructure.allDirectives +} + +class LLFirTestSuppressor( + testServices: TestServices, +) : TestByDirectiveSuppressor( + suppressDirective = Directives.MUTE_LL_FIR, + directivesContainer = Directives, + testServices +) { + + private object Directives : SimpleDirectivesContainer() { + val MUTE_LL_FIR by stringDirective("Temporary mute Low Level FIR implementation due to some error. YT ticket must be provided") + } +} + +class LLFirOnlyReversedTestSuppressor( + testServices: TestServices, +) : TestByDirectiveSuppressor( + suppressDirective = Directives.IGNORE_REVERSED_RESOLVE, + directivesContainer = Directives, + testServices +) { + private object Directives : SimpleDirectivesContainer() { + val IGNORE_REVERSED_RESOLVE by stringDirective("Temporary disables reversed resolve checks until the issue is fixed. YT ticket must be provided") + } +} + +class LLFirOnlyNonReversedTestSuppressor( + testServices: TestServices, +) : TestByDirectiveSuppressor( + suppressDirective = Directives.IGNORE_NON_REVERSED_RESOLVE, + directivesContainer = Directives, + testServices +) { + private object Directives : SimpleDirectivesContainer() { + val IGNORE_NON_REVERSED_RESOLVE by stringDirective("Temporary disables non-reversed resolve checks until the issue is fixed. YT ticket must be provided") + } +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt index 2ebc3c37fa0..61cb9776661 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/compiler/based/AbstractCompilerBasedTestForFir.kt @@ -7,9 +7,9 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirResolveSessionService +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirTestSuppressor import org.jetbrains.kotlin.analysis.low.level.api.fir.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile -import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.LLFirCompiledBasedTestSuppressor import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.FirLowLevelCompilerBasedTestConfigurator import org.jetbrains.kotlin.analysis.project.structure.KtModule @@ -60,7 +60,7 @@ abstract class AbstractCompilerBasedTestForFir : AbstractCompilerBasedTest() { useMetaTestConfigurators(::LLFirMetaTestConfigurator) useAfterAnalysisCheckers(::LLFirIdenticalChecker) useAfterAnalysisCheckers(::LLFirDivergenceCommentChecker) - useAfterAnalysisCheckers(::LLFirCompiledBasedTestSuppressor) + useAfterAnalysisCheckers(::LLFirTestSuppressor) } open fun TestConfigurationBuilder.configureTest() {} diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirBlackBoxCodegenBasedTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirBlackBoxCodegenBasedTest.kt index e8c2d1d842a..920d085f4f9 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirBlackBoxCodegenBasedTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirBlackBoxCodegenBasedTest.kt @@ -5,6 +5,9 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirOnlyNonReversedTestSuppressor +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirOnlyReversedTestSuppressor +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirTestSuppressor import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactoryWithoutPreresolve import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -13,5 +16,6 @@ abstract class AbstractLLFirBlackBoxCodegenBasedTest : AbstractLLFirBlackBoxCode override fun TestConfigurationBuilder.configureTest() { facadeStep(::LowLevelFirFrontendFacade.bind(LLFirAnalyzerFacadeFactoryWithoutPreresolve)) baseConfiguration() + useAfterAnalysisCheckers(::LLFirOnlyNonReversedTestSuppressor) } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTest.kt index d8984f89d9e..0a9917e21c5 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTest.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirOnlyReversedTestSuppressor import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTestForFir import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactoryWithPreresolveInReversedOrder import org.jetbrains.kotlin.test.bind @@ -17,7 +18,7 @@ abstract class AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataSpecTes frontendFacade = ::LowLevelFirFrontendFacade.bind(LLFirAnalyzerFacadeFactoryWithPreresolveInReversedOrder) ) baseFirSpecDiagnosticTestConfigurationForIde() - useAfterAnalysisCheckers(::FirReversedSuppressor) + useAfterAnalysisCheckers(::LLFirOnlyReversedTestSuppressor) useMetaTestConfigurators(::ReversedDiagnosticsConfigurator) useAfterAnalysisCheckers(::ReversedFirIdenticalChecker) } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest.kt index ae92ea4c4f6..63a71c146b7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirOnlyReversedTestSuppressor import java.io.File import org.jetbrains.kotlin.analysis.low.level.api.fir.compiler.based.AbstractCompilerBasedTestForFir import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactoryWithPreresolveInReversedOrder @@ -30,7 +31,7 @@ abstract class AbstractLLFirPreresolvedReversedDiagnosticCompilerTestDataTest : testDataConsistencyHandler = ::ReversedFirIdenticalChecker, ) - useAfterAnalysisCheckers(::FirReversedSuppressor) + useAfterAnalysisCheckers(::LLFirOnlyReversedTestSuppressor) useMetaTestConfigurators(::ReversedDiagnosticsConfigurator) } } @@ -42,31 +43,6 @@ internal class ReversedDiagnosticsConfigurator(testServices: TestServices) : Met } } -internal class FirReversedSuppressor(testServices: TestServices) : AfterAnalysisChecker(testServices) { - override val directiveContainers: List get() = listOf(Companion) - - override fun suppressIfNeeded(failedAssertions: List): List { - if (!isDisabled()) { - return failedAssertions - } - - return if (failedAssertions.isEmpty()) { - listOf( - AssertionError( - "Test contains $IGNORE_REVERSED_RESOLVE directive but no errors was reported. Please remove directive", - ).wrap() - ) - } else { - emptyList() - } - } - - private fun isDisabled(): Boolean = IGNORE_REVERSED_RESOLVE in testServices.moduleStructure.allDirectives - - companion object : SimpleDirectivesContainer() { - val IGNORE_REVERSED_RESOLVE by directive("Temporary disables reversed resolve checks until the issue is fixed") - } -} class ReversedFirIdenticalChecker(testServices: TestServices) : AbstractFirIdenticalChecker(testServices) { override fun checkTestDataFile(testDataFile: File) { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirReversedBlackBoxCodegenBasedTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirReversedBlackBoxCodegenBasedTest.kt index ddcb9752570..91d7f91a078 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirReversedBlackBoxCodegenBasedTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/AbstractLLFirReversedBlackBoxCodegenBasedTest.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based +import org.jetbrains.kotlin.analysis.low.level.api.fir.LLFirOnlyReversedTestSuppressor import org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based.facades.LLFirAnalyzerFacadeFactoryWithPreresolveInReversedOrder import org.jetbrains.kotlin.test.bind import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder @@ -13,6 +14,6 @@ abstract class AbstractLLFirReversedBlackBoxCodegenBasedTest : AbstractLLFirBlac override fun TestConfigurationBuilder.configureTest() { facadeStep(::LowLevelFirFrontendFacade.bind(LLFirAnalyzerFacadeFactoryWithPreresolveInReversedOrder)) baseConfiguration() - useAfterAnalysisCheckers(::FirReversedSuppressor) + useAfterAnalysisCheckers(::LLFirOnlyReversedTestSuppressor) } } diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirCompiledBasedTestSuppressor.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirCompiledBasedTestSuppressor.kt deleted file mode 100644 index cbc88a26eb6..00000000000 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirCompiledBasedTestSuppressor.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.analysis.low.level.api.fir.diagnostic.compiler.based - -import org.jetbrains.kotlin.test.WrappedException -import org.jetbrains.kotlin.test.directives.model.DirectivesContainer -import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer -import org.jetbrains.kotlin.test.model.AfterAnalysisChecker -import org.jetbrains.kotlin.test.services.TestServices -import org.jetbrains.kotlin.test.services.moduleStructure - -class LLFirCompiledBasedTestSuppressor(testServices: TestServices) : AfterAnalysisChecker(testServices) { - override val directiveContainers: List get() = listOf(Companion) - - override fun suppressIfNeeded(failedAssertions: List): List { - if (MUTE_LL_FIR !in testServices.moduleStructure.allDirectives) return failedAssertions - - return if (failedAssertions.isEmpty()) { - listOf( - AssertionError( - "Test contains $MUTE_LL_FIR directive but no errors was reported. Please remove directive", - ).wrap() - ) - } else { - emptyList() - } - } - - private companion object : SimpleDirectivesContainer() { - val MUTE_LL_FIR by stringDirective( - "Temporary mute Low Level FIR implementation due to some error. YT ticket must be provided" - ) - } -}