[K2, MPP] Introduce IGNORE_FIR2IR_EXCEPTIONS_IF_FIR_CONTAINS_ERRORS

Use it for K2 MPP tests
This commit is contained in:
Ivan Kochurkin
2023-03-13 16:31:23 +01:00
committed by Space Team
parent 59b88f33b2
commit ceb34e5a8a
5 changed files with 42 additions and 10 deletions
@@ -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(
@@ -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<FirFile, List<KtDiagnostic>>()) { 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})")
@@ -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)
@@ -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<FirOutputPar
get() = FrontendKinds.FIR
val mainFirFiles: Map<TestFile, FirFile> 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<FirOutputPartForDependsOnModule>) : FirOutputArtifact(parts)
@@ -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()