[Test] Introduce IGNORE_ERRORS diagnostic to suppressing backend errors

This commit is contained in:
Dmitriy Novozhilov
2021-01-18 15:50:28 +03:00
committed by TeamCityServer
parent acb6d2e196
commit a2ae618185
5 changed files with 49 additions and 5 deletions
@@ -57,10 +57,11 @@ class JvmIrCodegenFactory(private val phaseConfig: PhaseConfig) : CodegenFactory
doGenerateFilesInternal(input)
}
fun convertToIr(state: GenerationState, files: Collection<KtFile>): JvmIrBackendInput {
@JvmOverloads
fun convertToIr(state: GenerationState, files: Collection<KtFile>, 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)
@@ -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<DirectivesContainer>
get() = listOf(CodegenTestDirectives)
override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) {
if (IGNORE_ERRORS in module.directives) return
AnalyzingUtils.throwExceptionOnErrors(info.analysisResult.bindingContext)
}
@@ -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)
@@ -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
)
}
@@ -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))
}
}