[Test] Introduce IGNORE_ERRORS diagnostic to suppressing backend errors
This commit is contained in:
committed by
TeamCityServer
parent
acb6d2e196
commit
a2ae618185
@@ -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)
|
||||
|
||||
+7
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
+11
-2
@@ -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)
|
||||
|
||||
+25
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
+3
-1
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user