[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)
|
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 extensions = JvmGeneratorExtensions()
|
||||||
val mangler = JvmManglerDesc(MainFunctionDetector(state.bindingContext, state.languageVersionSettings))
|
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 symbolTable = SymbolTable(JvmIdSignatureDescriptor(mangler), IrFactoryImpl, JvmNameProvider)
|
||||||
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, symbolTable, extensions)
|
val psi2irContext = psi2ir.createGeneratorContext(state.module, state.bindingContext, symbolTable, extensions)
|
||||||
val pluginExtensions = IrGenerationExtension.getInstances(state.project)
|
val pluginExtensions = IrGenerationExtension.getInstances(state.project)
|
||||||
|
|||||||
+7
@@ -6,13 +6,20 @@
|
|||||||
package org.jetbrains.kotlin.test.backend.handlers
|
package org.jetbrains.kotlin.test.backend.handlers
|
||||||
|
|
||||||
import org.jetbrains.kotlin.resolve.AnalyzingUtils
|
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.ClassicFrontendOutputArtifact
|
||||||
import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicFrontendAnalysisHandler
|
import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicFrontendAnalysisHandler
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
|
|
||||||
class NoCompilationErrorsHandler(testServices: TestServices) : ClassicFrontendAnalysisHandler(testServices) {
|
class NoCompilationErrorsHandler(testServices: TestServices) : ClassicFrontendAnalysisHandler(testServices) {
|
||||||
|
override val directivesContainers: List<DirectivesContainer>
|
||||||
|
get() = listOf(CodegenTestDirectives)
|
||||||
|
|
||||||
override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) {
|
override fun processModule(module: TestModule, info: ClassicFrontendOutputArtifact) {
|
||||||
|
if (IGNORE_ERRORS in module.directives) return
|
||||||
AnalyzingUtils.throwExceptionOnErrors(info.analysisResult.bindingContext)
|
AnalyzingUtils.throwExceptionOnErrors(info.analysisResult.bindingContext)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+11
-2
@@ -5,8 +5,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.test.backend.ir
|
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.backend.jvm.JvmIrCodegenFactory
|
||||||
import org.jetbrains.kotlin.test.backend.classic.JavaCompilerFacade
|
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.model.*
|
||||||
import org.jetbrains.kotlin.test.services.TestServices
|
import org.jetbrains.kotlin.test.services.TestServices
|
||||||
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
|
import org.jetbrains.kotlin.test.services.compilerConfigurationProvider
|
||||||
@@ -19,10 +21,17 @@ class JvmIrBackendFacade(
|
|||||||
override fun transform(
|
override fun transform(
|
||||||
module: TestModule,
|
module: TestModule,
|
||||||
inputArtifact: IrBackendInput
|
inputArtifact: IrBackendInput
|
||||||
): BinaryArtifacts.Jvm {
|
): BinaryArtifacts.Jvm? {
|
||||||
val state = inputArtifact.backendInput.state
|
val state = inputArtifact.backendInput.state
|
||||||
val codegenFactory = state.codegenFactory as JvmIrCodegenFactory
|
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()
|
state.factory.done()
|
||||||
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
|
val configuration = testServices.compilerConfigurationProvider.getCompilerConfiguration(module)
|
||||||
javaCompilerFacade.compileJavaFiles(module, configuration, state.factory)
|
javaCompilerFacade.compileJavaFiles(module, configuration, state.factory)
|
||||||
|
|||||||
+25
@@ -6,7 +6,10 @@
|
|||||||
package org.jetbrains.kotlin.test.directives
|
package org.jetbrains.kotlin.test.directives
|
||||||
|
|
||||||
import org.jetbrains.kotlin.test.TargetBackend
|
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
|
||||||
|
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.DirectiveApplicability.Global
|
||||||
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
|
import org.jetbrains.kotlin.test.directives.model.SimpleDirectivesContainer
|
||||||
|
|
||||||
@@ -45,7 +48,29 @@ object CodegenTestDirectives : SimpleDirectivesContainer() {
|
|||||||
description = "Ignore dex checkers"
|
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(
|
val IGNORE_FIR_DIAGNOSTICS by directive(
|
||||||
description = "Run backend even FIR reported some diagnostics with ERROR severity"
|
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.ClassBuilderFactories
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
|
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.BackendKinds
|
||||||
import org.jetbrains.kotlin.test.model.Frontend2BackendConverter
|
import org.jetbrains.kotlin.test.model.Frontend2BackendConverter
|
||||||
import org.jetbrains.kotlin.test.model.FrontendKinds
|
import org.jetbrains.kotlin.test.model.FrontendKinds
|
||||||
@@ -44,6 +45,7 @@ class ClassicFrontend2IrConverter(
|
|||||||
.isIrBackend(true)
|
.isIrBackend(true)
|
||||||
.build()
|
.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