From a2ae6181858516a6e21c97799a29b056326d6d87 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 18 Jan 2021 15:50:28 +0300 Subject: [PATCH] [Test] Introduce IGNORE_ERRORS diagnostic to suppressing backend errors --- .../kotlin/backend/jvm/JvmIrCodegenFactory.kt | 5 ++-- .../handlers/NoCompilationErrorsHandler.kt | 7 ++++++ .../test/backend/ir/JvmIrBackendFacade.kt | 13 ++++++++-- .../test/directives/CodegenTestDirectives.kt | 25 +++++++++++++++++++ .../classic/ClassicFrontend2IrConverter.kt | 4 ++- 5 files changed, 49 insertions(+), 5 deletions(-) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt index 9377e498c7b..20448eacf35 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmIrCodegenFactory.kt @@ -57,10 +57,11 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory doGenerateFilesInternal(input) } - fun convertToIr(state: GenerationState, files: Collection): JvmIrBackendInput { + @JvmOverloads + fun convertToIr(state: GenerationState, files: Collection, ignoreErrors: Boolean = false): JvmIrBackendInput { val extensions = JvmGeneratorExtensions() val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings)) - val psi2ir = Psi2IrTranslator(state.languageVersionSettings, Psi2IrConfiguration()) + val psi2ir = Psi2IrTranslator(state.languageVersionSettings, Psi2IrConfiguration(ignoreErrors)) val symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider) val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, symbolTable, extensions) val pluginExtensions = IrGenerationExtension.getInstances(state.project) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoCompilationErrorsHandler.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoCompilationErrorsHandler.kt index 1dd5c945063..7fb53fdb433 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoCompilationErrorsHandler.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/handlers/NoCompilationErrorsHandler.kt @@ -6,13 +6,20 @@ package org.jetbrains.kotlin.test.backend.handlers import org.jetbrains.kotlin.resolve.AnalyzingUtils +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.IGNORE_ERRORS +import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.frontend.classic.ClassicFrontendOutputArtifact import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicFrontendAnalysisHandler import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices class NoCompilationErrorsHandler(testServices: TestServices) : ClassicFrontendAnalysisHandler(testServices) { + override val directivesContainers: List + get() = listOf(CodegenTestDirectives) + override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) { + if (IGNORE_ERRORS in module.directives) return AnalyzingUtils.throwExceptionOnErrors(info.analysisResult.bindingContext) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt index 522ca4ad17c..1e21f3e79c8 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/backend/ir/JvmIrBackendFacade.kt @@ -5,8 +5,10 @@ package org.jetbrains.kotlin.test.backend.ir +import org.jetbrains.kotlin.backend.common.BackendException import org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory import org.jetbrains.kotlin.test.backend.classic.JavaCompilerFacade +import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.services.TestServices import org.jetbrains.kotlin.test.services.compilerConfigurationProvider @@ -19,10 +21,17 @@ class JvmIrBackendFacade( override fun transform( module: TestModule, inputArtifact: IrBackendInput - ): BinaryArtifacts.Jvm { + ): BinaryArtifacts.Jvm? { val state = inputArtifact.backendInput.state val codegenFactory = state.codegenFactory as JvmIrCodegenFactory - codegenFactory.doGenerateFilesInternal(inputArtifact.backendInput) + try { + codegenFactory.doGenerateFilesInternal(inputArtifact.backendInput) + } catch (e: BackendException) { + if (CodegenTestDirectives.IGNORE_ERRORS in module.directives) { + return null + } + throw e + } state.factory.done() val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module) javaCompilerFacade.compileJavaFiles(module, configuration, state.factory) 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 b72f6694491..3fc068dcdf4 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 @@ -6,7 +6,10 @@ package org.jetbrains.kotlin.test.directives import org.jetbrains.kotlin.test.TargetBackend +import org.jetbrains.kotlin.test.backend.handlers.NoCompilationErrorsHandler +import org.jetbrains.kotlin.test.backend.ir.JvmIrBackendFacade import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability +import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability.File import org.jetbrains.kotlin.test.directives.model.DirectiveApplicability.Global import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer @@ -45,7 +48,29 @@ object CodegenTestDirectives : SimpleDirectivesContainer() { description = "Ignore dex checkers" ) + val IGNORE_ERRORS by directive( + description = """ + Ignore frontend errors in ${NoCompilationErrorsHandler::class} + If this directive is enabled then ${JvmIrBackendFacade::class} won't produce any binaries for test + if there are errors in it + """.trimIndent() + ) + val IGNORE_FIR_DIAGNOSTICS by directive( description = "Run backend even FIR reported some diagnostics with ERROR severity" ) + + val IR_FILE by stringDirective( + description = "Specifies file name for IR text dump", + applicability = File + ) + + val DUMP_EXTERNAL_CLASS by stringDirective( + description = "Specifies names of external classes which IR should be dumped" + ) + + val EXTERNAL_FILE by directive( + description = "Indicates that test file is external", + applicability = File + ) } diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt index 089e44c0a56..10b960cc1b6 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/frontend/classic/ClassicFrontend2IrConverter.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys import org.jetbrains.kotlin.codegen.ClassBuilderFactories import org.jetbrains.kotlin.codegen.state.GenerationState 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 @@ -44,6 +45,7 @@ class ClassicFrontend2IrConverter( .isIrBackend(true) .build() - return IrBackendInput(codegenFactory.convertToIr(state, files)) + val ignoreErrors = CodegenTestDirectives.IGNORE_ERRORS in module.directives + return IrBackendInput(codegenFactory.convertToIr(state, files, ignoreErrors)) } }