diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt index d2e3aa444a7..bc6054effc6 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/directives/CodegenTestDirectives.kt @@ -212,6 +212,12 @@ object CodegenTestDirectives : SimpleDirectivesContainer() { is same as required jdk for test """.trimIndent() ) + + val IGNORE_FIR2IR_EXCEPTIONS_IF_FIR_CONTAINS_ERRORS by directive( + description = """ + Ignore FIR2IR exceptions if FIR reported some diagnostics with ERROR severity + """.trimIndent() + ) } fun extractIgnoredDirectivesForTargetBackend( diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt index ad065b94f63..0af4c5c322d 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrJsResultsConverter.kt @@ -15,8 +15,6 @@ import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory -import org.jetbrains.kotlin.diagnostics.KtDiagnostic -import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade import org.jetbrains.kotlin.fir.FirAnalyzerFacade import org.jetbrains.kotlin.fir.backend.* @@ -102,12 +100,6 @@ class Fir2IrJsResultsConverter( val metadataVersion = configuration.metadataVersion(module.languageVersionSettings.languageVersion) - // At this point, checkers will already have been run by a previous test step. `runCheckers` returns the cached diagnostics map. - val diagnosticsMap = inputArtifact.partsForDependsOnModules.fold(mutableMapOf>()) { result, part -> - result.also { it.putAll(part.firAnalyzerFacade.runCheckers()) } - } - val hasErrors = diagnosticsMap.any { entry -> entry.value.any { it.severity == Severity.ERROR } } - return IrBackendInput.JsIrBackendInput( mainIrPart, dependentIrParts, @@ -116,7 +108,7 @@ class Fir2IrJsResultsConverter( configuration.incrementalDataProvider?.getSerializedData(sourceFiles) ?: emptyList(), expectDescriptorToSymbol = mutableMapOf(), diagnosticsCollector = DiagnosticReporterFactory.createReporter(), - hasErrors = hasErrors + hasErrors = inputArtifact.hasErrors ) { file -> val (firFile, components) = firFilesAndComponentsBySourceFile[file] ?: error("cannot find FIR file by source file ${file.name} (${file.path})") diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt index 7e58d6f562f..c204c933c05 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/Fir2IrResultsConverter.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.CompilerEnvironment import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.test.backend.ir.IrBackendInput +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.model.BackendKinds import org.jetbrains.kotlin.test.model.Frontend2BackendConverter import org.jetbrains.kotlin.test.model.FrontendKinds @@ -46,7 +47,22 @@ class Fir2IrResultsConverter( override fun transform( module: TestModule, inputArtifact: FirOutputArtifact - ): IrBackendInput { + ): IrBackendInput? { + return try { + transformInternal(module, inputArtifact) + } catch (e: Throwable) { + if (CodegenTestDirectives.IGNORE_FIR2IR_EXCEPTIONS_IF_FIR_CONTAINS_ERRORS in module.directives && inputArtifact.hasErrors) { + null + } else { + throw e + } + } + } + + private fun transformInternal( + module: TestModule, + inputArtifact: FirOutputArtifact + ): IrBackendInput.JvmIrBackendInput { val compilerConfigurationProvider = testServices.compilerConfigurationProvider val configuration = compilerConfigurationProvider.getCompilerConfiguration(module) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirOutputArtifact.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirOutputArtifact.kt index a02e5c24f40..0962c17ccad 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirOutputArtifact.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/fir/FirOutputArtifact.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.test.frontend.fir +import org.jetbrains.kotlin.diagnostics.Severity import org.jetbrains.kotlin.fir.AbstractFirAnalyzerFacade import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirFile @@ -28,6 +29,12 @@ abstract class FirOutputArtifact(val partsForDependsOnModules: List by lazy { allFirFiles.filterKeys { !it.isAdditional } } + + val hasErrors: Boolean by lazy { + partsForDependsOnModules.any { part -> + part.firAnalyzerFacade.runCheckers().values.any { diagnostics -> diagnostics.any { it.severity == Severity.ERROR } } + } + } } class FirOutputArtifactImpl(parts: List) : FirOutputArtifact(parts) \ No newline at end of file diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirDiagnosticTest.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirDiagnosticTest.kt index 4e191571a87..a6ea02704a2 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirDiagnosticTest.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/runners/AbstractFirDiagnosticTest.kt @@ -36,6 +36,8 @@ import org.jetbrains.kotlin.test.services.fir.FirOldFrontendMetaConfigurator import org.jetbrains.kotlin.test.services.service import org.jetbrains.kotlin.test.services.sourceProviders.AdditionalDiagnosticsSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider +import org.jetbrains.kotlin.test.FirParser +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives abstract class AbstractFirDiagnosticTestBase(val parser: FirParser) : AbstractKotlinCompilerTest() { override fun TestConfigurationBuilder.configuration() { @@ -49,6 +51,15 @@ abstract class AbstractFirPsiDiagnosticTest : AbstractFirDiagnosticTestBase(FirP abstract class AbstractFirLightTreeDiagnosticsTest : AbstractFirDiagnosticTestBase(FirParser.LightTree) abstract class AbstractFirWithActualizerDiagnosticsTest(val parser: FirParser) : AbstractKotlinCompilerWithTargetBackendTest(TargetBackend.JVM_IR) { + override fun configure(builder: TestConfigurationBuilder) { + super.configure(builder) + with (builder) { + defaultDirectives { + +CodegenTestDirectives.IGNORE_FIR2IR_EXCEPTIONS_IF_FIR_CONTAINS_ERRORS + } + } + } + override fun TestConfigurationBuilder.configuration() { configureFirParser(parser) baseFirDiagnosticTestConfiguration()