[Test] Use special test facade for IR actualization and IR plugins in all codegen configurations

Previously application of plugins was part of fir2ir conversion and
  ir actualization was the responsibility of each specific IR backend
  facade. Now (after moving IR extensions after IR actualization) those
  actions are extracted into separate facade for two purposes:
1. Avoid code duplication in backend facades
2. Step with this facade goes exactly after fir2ir conversion before
   irHandlersStep, which allows IR handlers to observe IR which was
   actualized and modified by extensions, which is quite useful

^KT-56173
This commit is contained in:
Dmitriy Novozhilov
2023-07-05 17:44:46 +03:00
committed by Space Team
parent fd87d722c1
commit e7a10057f2
13 changed files with 53 additions and 121 deletions
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.test.backend.ir package org.jetbrains.kotlin.test.backend.ir
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext
import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
@@ -16,33 +17,35 @@ 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
class ActualizerOnlyFacade( class IrActualizerAndPluginsFacade(
val testServices: TestServices, val testServices: TestServices,
) : AbstractTestFacade<IrBackendInput, IrBackendInput>() { ) : AbstractTestFacade<IrBackendInput, IrBackendInput>() {
override fun transform(module: TestModule, inputArtifact: IrBackendInput): IrBackendInput { override fun transform(module: TestModule, inputArtifact: IrBackendInput): IrBackendInput {
if (module.useIrActualizer()) { if (module.frontendKind != FrontendKinds.FIR) return inputArtifact
if (module.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
val builtins = inputArtifact.irModuleFragment.irBuiltins val builtins = inputArtifact.irModuleFragment.irBuiltins
val typeSystemContext = when (module.targetPlatform.isJvm()) { val typeSystemContext = when (module.targetPlatform.isJvm()) {
true -> JvmIrTypeSystemContext(builtins) true -> JvmIrTypeSystemContext(builtins)
false -> IrTypeSystemContextImpl(builtins) false -> IrTypeSystemContextImpl(builtins)
} }
IrActualizer.actualize( val result = IrActualizer.actualize(
inputArtifact.irModuleFragment, inputArtifact.irModuleFragment,
inputArtifact.dependentIrModuleFragments, inputArtifact.dependentIrModuleFragments,
inputArtifact.diagnosticReporter, inputArtifact.diagnosticReporter,
typeSystemContext, typeSystemContext,
testServices.compilerConfigurationProvider.getCompilerConfiguration(module).languageVersionSettings testServices.compilerConfigurationProvider.getCompilerConfiguration(module).languageVersionSettings
) )
inputArtifact.irPluginContext.applyIrGenerationExtensions( inputArtifact.irActualizerResult = result
inputArtifact.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
} }
inputArtifact.irPluginContext.applyIrGenerationExtensions(
inputArtifact.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
return inputArtifact return inputArtifact
} }
private fun TestModule.useIrActualizer(): Boolean { private fun TestModule.irGenerationExtensions(testServices: TestServices): Collection<IrGenerationExtension> {
return frontendKind == FrontendKinds.FIR && languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects) return IrGenerationExtension.getInstances(testServices.compilerConfigurationProvider.getProject(this))
} }
override val inputKind: TestArtifactKind<IrBackendInput> = BackendKinds.IrBackend override val inputKind: TestArtifactKind<IrBackendInput> = BackendKinds.IrBackend
@@ -67,6 +67,14 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
*/ */
abstract val firMangler: FirMangler? abstract val firMangler: FirMangler?
/**
* Results of actualization, came from IrActulizer
*
* @see org.jetbrains.kotlin.backend.common.actualizer
* @see org.jetbrains.kotlin.test.backend.ir.IrActualizerAndPluginsFacade
*/
abstract var irActualizerResult: IrActualizedResult?
abstract val diagnosticReporter: BaseDiagnosticsCollector abstract val diagnosticReporter: BaseDiagnosticsCollector
class JsIrBackendInput( class JsIrBackendInput(
@@ -81,6 +89,7 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
override val descriptorMangler: KotlinMangler.DescriptorMangler, override val descriptorMangler: KotlinMangler.DescriptorMangler,
override val irMangler: KotlinMangler.IrMangler, override val irMangler: KotlinMangler.IrMangler,
override val firMangler: FirMangler?, override val firMangler: FirMangler?,
override var irActualizerResult: IrActualizedResult? = null,
val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment, val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment,
) : IrBackendInput() ) : IrBackendInput()
@@ -96,6 +105,7 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
override val descriptorMangler: KotlinMangler.DescriptorMangler, override val descriptorMangler: KotlinMangler.DescriptorMangler,
override val irMangler: KotlinMangler.IrMangler, override val irMangler: KotlinMangler.IrMangler,
override val firMangler: FirMangler?, override val firMangler: FirMangler?,
override var irActualizerResult: IrActualizedResult? = null,
val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment, val serializeSingleFile: (KtSourceFile, IrActualizedResult?) -> ProtoBuf.PackageFragment,
) : IrBackendInput() ) : IrBackendInput()
@@ -108,6 +118,7 @@ sealed class IrBackendInput : ResultingArtifact.BackendInput<IrBackendInput>() {
override val descriptorMangler: KotlinMangler.DescriptorMangler, override val descriptorMangler: KotlinMangler.DescriptorMangler,
override val irMangler: KotlinMangler.IrMangler, override val irMangler: KotlinMangler.IrMangler,
override val firMangler: FirMangler?, override val firMangler: FirMangler?,
override var irActualizerResult: IrActualizedResult? = null,
) : IrBackendInput() { ) : IrBackendInput() {
override val irModuleFragment: IrModuleFragment override val irModuleFragment: IrModuleFragment
get() = backendInput.irModuleFragment get() = backendInput.irModuleFragment
@@ -7,21 +7,19 @@ package org.jetbrains.kotlin.test.backend.ir
import org.jetbrains.kotlin.KtPsiSourceFile import org.jetbrains.kotlin.KtPsiSourceFile
import org.jetbrains.kotlin.backend.common.BackendException import org.jetbrains.kotlin.backend.common.BackendException
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.backend.common.extensions.IrGenerationExtension
import org.jetbrains.kotlin.backend.jvm.JvmIrTypeSystemContext
import org.jetbrains.kotlin.backend.jvm.MultifileFacadeFileEntry import org.jetbrains.kotlin.backend.jvm.MultifileFacadeFileEntry
import org.jetbrains.kotlin.backend.jvm.lower.getFileClassInfoFromIrFile import org.jetbrains.kotlin.backend.jvm.lower.getFileClassInfoFromIrFile
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil
import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions
import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.PsiIrFileEntry
import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl import org.jetbrains.kotlin.ir.util.NaiveSourceBasedFileEntryImpl
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
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.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.ArtifactKinds
import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.SourceFileInfo
import org.jetbrains.kotlin.test.model.TestModule
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
@@ -37,21 +35,6 @@ class JvmIrBackendFacade(
require(inputArtifact is IrBackendInput.JvmIrBackendInput) { require(inputArtifact is IrBackendInput.JvmIrBackendInput) {
"JvmIrBackendFacade expects IrBackendInput.JvmIrBackendInput as input" "JvmIrBackendFacade expects IrBackendInput.JvmIrBackendInput as input"
} }
if (module.useIrActualizer()) {
IrActualizer.actualize(
inputArtifact.irModuleFragment,
inputArtifact.dependentIrModuleFragments,
inputArtifact.state.diagnosticReporter,
JvmIrTypeSystemContext(inputArtifact.irModuleFragment.irBuiltins),
inputArtifact.state.languageVersionSettings
)
inputArtifact.irPluginContext.applyIrGenerationExtensions(
inputArtifact.irModuleFragment,
module.irGenerationExtensions(testServices)
)
}
val state = inputArtifact.state val state = inputArtifact.state
try { try {
inputArtifact.codegenFactory.generateModule(state, inputArtifact.backendInput) inputArtifact.codegenFactory.generateModule(state, inputArtifact.backendInput)
@@ -97,11 +80,3 @@ class JvmIrBackendFacade(
) )
} }
} }
internal fun TestModule.useIrActualizer(): Boolean {
return frontendKind == FrontendKinds.FIR && languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)
}
fun TestModule.irGenerationExtensions(testServices: TestServices): Collection<IrGenerationExtension> {
return IrGenerationExtension.getInstances(testServices.compilerConfigurationProvider.getProject(this))
}
@@ -42,8 +42,6 @@ import org.jetbrains.kotlin.library.metadata.resolver.KotlinResolvedLibrary
import org.jetbrains.kotlin.library.unresolvedDependencies import org.jetbrains.kotlin.library.unresolvedDependencies
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions
import org.jetbrains.kotlin.test.backend.ir.useIrActualizer
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives 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
@@ -156,13 +154,6 @@ class Fir2IrJsResultsConverter(
) )
} }
if (!module.useIrActualizer()) {
result.irPluginContext.applyIrGenerationExtensions(
result.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
}
return result return result
} }
} }
@@ -30,8 +30,6 @@ import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.resolve.CompilerEnvironment import org.jetbrains.kotlin.resolve.CompilerEnvironment
import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions
import org.jetbrains.kotlin.test.backend.ir.useIrActualizer
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives 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
@@ -140,13 +138,6 @@ class Fir2IrJvmResultsConverter(
firMangler = commonMemberStorage.firSignatureComposer.mangler, firMangler = commonMemberStorage.firSignatureComposer.mangler,
) )
if (!module.useIrActualizer()) {
result.irPluginContext.applyIrGenerationExtensions(
backendInput.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
}
return result return result
} }
} }
@@ -11,7 +11,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver import org.jetbrains.kotlin.fir.symbols.FirLazyDeclarationResolver
import org.jetbrains.kotlin.platform.jvm.JvmPlatforms import org.jetbrains.kotlin.platform.jvm.JvmPlatforms
import org.jetbrains.kotlin.test.* import org.jetbrains.kotlin.test.*
import org.jetbrains.kotlin.test.backend.ir.ActualizerOnlyFacade import org.jetbrains.kotlin.test.backend.ir.IrActualizerAndPluginsFacade
import org.jetbrains.kotlin.test.backend.ir.IrDiagnosticsHandler import org.jetbrains.kotlin.test.backend.ir.IrDiagnosticsHandler
import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder import org.jetbrains.kotlin.test.builders.TestConfigurationBuilder
import org.jetbrains.kotlin.test.builders.configureFirHandlersStep import org.jetbrains.kotlin.test.builders.configureFirHandlersStep
@@ -99,7 +99,7 @@ abstract class AbstractFirWithActualizerDiagnosticsTest(val parser: FirParser) :
baseFirDiagnosticTestConfiguration() baseFirDiagnosticTestConfiguration()
facadeStep(::Fir2IrResultsConverter) facadeStep(::Fir2IrResultsConverter)
facadeStep(::ActualizerOnlyFacade) facadeStep(::IrActualizerAndPluginsFacade)
irHandlersStep { irHandlersStep {
useHandlers( useHandlers(
::IrDiagnosticsHandler ::IrDiagnosticsHandler
@@ -14,6 +14,8 @@ import org.jetbrains.kotlin.test.builders.configureFirHandlersStep
import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING import org.jetbrains.kotlin.test.directives.JvmEnvironmentConfigurationDirectives.USE_PSI_CLASS_FILES_READING
import org.jetbrains.kotlin.test.directives.ConfigurationDirectives.WITH_STDLIB import org.jetbrains.kotlin.test.directives.ConfigurationDirectives.WITH_STDLIB
import org.jetbrains.kotlin.test.FirParser import org.jetbrains.kotlin.test.FirParser
import org.jetbrains.kotlin.test.backend.ir.IrDiagnosticsHandler
import org.jetbrains.kotlin.test.builders.configureIrHandlersStep
import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives
import org.jetbrains.kotlin.test.directives.configureFirParser import org.jetbrains.kotlin.test.directives.configureFirParser
import org.jetbrains.kotlin.test.frontend.fir.Fir2IrResultsConverter import org.jetbrains.kotlin.test.frontend.fir.Fir2IrResultsConverter
@@ -65,6 +67,10 @@ abstract class AbstractFirBlackBoxCodegenTestBase(
) )
} }
configureIrHandlersStep {
useHandlers(::IrDiagnosticsHandler)
}
useAfterAnalysisCheckers( useAfterAnalysisCheckers(
::FirMetaInfoDiffSuppressor ::FirMetaInfoDiffSuppressor
) )
@@ -11,7 +11,9 @@ import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.HandlersStepBuilder import org.jetbrains.kotlin.test.HandlersStepBuilder
import org.jetbrains.kotlin.test.TestJdkKind import org.jetbrains.kotlin.test.TestJdkKind
import org.jetbrains.kotlin.test.backend.handlers.* import org.jetbrains.kotlin.test.backend.handlers.*
import org.jetbrains.kotlin.test.backend.ir.IrActualizerAndPluginsFacade
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.backend.ir.IrDiagnosticsHandler
import org.jetbrains.kotlin.test.builders.* import org.jetbrains.kotlin.test.builders.*
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives import org.jetbrains.kotlin.test.directives.CodegenTestDirectives
import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_SMAP import org.jetbrains.kotlin.test.directives.CodegenTestDirectives.DUMP_SMAP
@@ -39,6 +41,7 @@ fun <F : ResultingArtifact.FrontendOutput<F>, B : ResultingArtifact.BackendInput
classicFrontendHandlersStep() classicFrontendHandlersStep()
firHandlersStep() firHandlersStep()
facadeStep(frontendToBackendConverter) facadeStep(frontendToBackendConverter)
actualizersAndPluginsFacadeStepIfNeeded(targetFrontend)
irHandlersStep(init = {}) irHandlersStep(init = {})
facadeStep(backendFacade) facadeStep(backendFacade)
jvmArtifactsHandlersStep(init = {}) jvmArtifactsHandlersStep(init = {})
@@ -194,6 +197,12 @@ fun HandlersStepBuilder<BinaryArtifacts.Jvm>.inlineHandlers() {
) )
} }
fun TestConfigurationBuilder.actualizersAndPluginsFacadeStepIfNeeded(targetFrontend: FrontendKind<*>) {
if (targetFrontend == FrontendKinds.FIR) {
facadeStep(::IrActualizerAndPluginsFacade)
}
}
fun TestConfigurationBuilder.configureModernJavaTest(jdkKind: TestJdkKind, jvmTarget: JvmTarget) { fun TestConfigurationBuilder.configureModernJavaTest(jdkKind: TestJdkKind, jvmTarget: JvmTarget) {
defaultDirectives { defaultDirectives {
JvmEnvironmentConfigurationDirectives.JDK_KIND with jdkKind JvmEnvironmentConfigurationDirectives.JDK_KIND with jdkKind
@@ -6,18 +6,13 @@
package org.jetbrains.kotlin.js.test.converters package org.jetbrains.kotlin.js.test.converters
import org.jetbrains.kotlin.backend.common.CommonKLibResolver import org.jetbrains.kotlin.backend.common.CommonKLibResolver
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.backend.js.JsFactories import org.jetbrains.kotlin.ir.backend.js.JsFactories
import org.jetbrains.kotlin.ir.backend.js.resolverLogger import org.jetbrains.kotlin.ir.backend.js.resolverLogger
import org.jetbrains.kotlin.ir.backend.js.serializeModuleIntoKlib import org.jetbrains.kotlin.ir.backend.js.serializeModuleIntoKlib
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.js.test.utils.JsIrIncrementalDataProvider import org.jetbrains.kotlin.js.test.utils.JsIrIncrementalDataProvider
import org.jetbrains.kotlin.js.test.utils.jsIrIncrementalDataProvider import org.jetbrains.kotlin.js.test.utils.jsIrIncrementalDataProvider
@@ -25,14 +20,12 @@ import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions
import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.frontend.fir.getAllJsDependenciesPaths import org.jetbrains.kotlin.test.frontend.fir.getAllJsDependenciesPaths
import org.jetbrains.kotlin.test.frontend.fir.resolveLibraries import org.jetbrains.kotlin.test.frontend.fir.resolveLibraries
import org.jetbrains.kotlin.test.model.ArtifactKinds import org.jetbrains.kotlin.test.model.ArtifactKinds
import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
@@ -64,28 +57,7 @@ class FirJsKlibBackendFacade(
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val libraries = resolveLibraries(configuration, getAllJsDependenciesPaths(module, testServices)) val libraries = resolveLibraries(configuration, getAllJsDependenciesPaths(module, testServices))
// TODO: find out how to pass diagnostics to the test infra in this case
val diagnosticReporter = DiagnosticReporterFactory.createReporter()
if (firstTimeCompilation) { if (firstTimeCompilation) {
val irActualizedResult =
if (module.frontendKind == FrontendKinds.FIR && module.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
IrActualizer.actualize(
inputArtifact.irModuleFragment,
inputArtifact.dependentIrModuleFragments,
diagnosticReporter,
IrTypeSystemContextImpl(inputArtifact.irModuleFragment.irBuiltins),
configuration.languageVersionSettings
).also {
inputArtifact.irPluginContext.applyIrGenerationExtensions(
inputArtifact.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
}
} else {
null
}
serializeModuleIntoKlib( serializeModuleIntoKlib(
configuration[CommonConfigurationKeys.MODULE_NAME]!!, configuration[CommonConfigurationKeys.MODULE_NAME]!!,
configuration, configuration,
@@ -102,7 +74,7 @@ class FirJsKlibBackendFacade(
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null jsOutputName = null
) { ) {
inputArtifact.serializeSingleFile(it, irActualizedResult) inputArtifact.serializeSingleFile(it, inputArtifact.irActualizerResult)
} }
} }
@@ -32,7 +32,7 @@ class JsKlibBackendFacade(
override val additionalServices: List<ServiceRegistrationData> override val additionalServices: List<ServiceRegistrationData>
get() = listOf(service(::JsIrIncrementalDataProvider)) get() = listOf(service(::JsIrIncrementalDataProvider))
constructor(testServices: TestServices): this(testServices, firstTimeCompilation = true) constructor(testServices: TestServices) : this(testServices, firstTimeCompilation = true)
override fun shouldRunAnalysis(module: TestModule): Boolean { override fun shouldRunAnalysis(module: TestModule): Boolean {
return module.backendKind == inputKind return module.backendKind == inputKind
@@ -63,7 +63,7 @@ class JsKlibBackendFacade(
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null jsOutputName = null
) { ) {
inputArtifact.serializeSingleFile(it, null) inputArtifact.serializeSingleFile(it, inputArtifact.irActualizerResult)
} }
} }
@@ -91,4 +91,4 @@ class JsKlibBackendFacade(
return BinaryArtifacts.KLib(File(outputFile)) return BinaryArtifacts.KLib(File(outputFile))
} }
} }
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticsHan
import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
import org.jetbrains.kotlin.test.runners.codegen.actualizersAndPluginsFacadeStepIfNeeded
import org.jetbrains.kotlin.test.runners.codegen.commonClassicFrontendHandlersForCodegenTest import org.jetbrains.kotlin.test.runners.codegen.commonClassicFrontendHandlersForCodegenTest
import org.jetbrains.kotlin.test.services.LibraryProvider import org.jetbrains.kotlin.test.services.LibraryProvider
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
@@ -154,6 +155,7 @@ fun <
} }
facadeStep(frontendToBackendConverter) facadeStep(frontendToBackendConverter)
actualizersAndPluginsFacadeStepIfNeeded(targetFrontend)
irHandlersStep() irHandlersStep()
facadeStep(backendFacade) facadeStep(backendFacade)
@@ -19,9 +19,9 @@ import org.jetbrains.kotlin.test.frontend.classic.handlers.ClassicDiagnosticsHan
import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler import org.jetbrains.kotlin.test.frontend.fir.handlers.FirDiagnosticsHandler
import org.jetbrains.kotlin.test.model.* import org.jetbrains.kotlin.test.model.*
import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest import org.jetbrains.kotlin.test.runners.AbstractKotlinCompilerWithTargetBackendTest
import org.jetbrains.kotlin.test.runners.codegen.actualizersAndPluginsFacadeStepIfNeeded
import org.jetbrains.kotlin.test.runners.codegen.commonClassicFrontendHandlersForCodegenTest import org.jetbrains.kotlin.test.runners.codegen.commonClassicFrontendHandlersForCodegenTest
import org.jetbrains.kotlin.test.services.LibraryProvider import org.jetbrains.kotlin.test.services.LibraryProvider
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator
import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider import org.jetbrains.kotlin.test.services.sourceProviders.CoroutineHelpersSourceFilesProvider
import org.jetbrains.kotlin.wasm.test.handlers.WasmBoxRunner import org.jetbrains.kotlin.wasm.test.handlers.WasmBoxRunner
@@ -90,7 +90,7 @@ abstract class AbstractWasmBlackBoxCodegenTestBase<R : ResultingArtifact.Fronten
facadeStep(frontendToBackendConverter) facadeStep(frontendToBackendConverter)
irHandlersStep() irHandlersStep()
actualizersAndPluginsFacadeStepIfNeeded(targetFrontend)
facadeStep(backendFacade) facadeStep(backendFacade)
klibArtifactsHandlersStep() klibArtifactsHandlersStep()
facadeStep(afterBackendFacade) facadeStep(afterBackendFacade)
@@ -6,31 +6,24 @@
package org.jetbrains.kotlin.wasm.test.converters package org.jetbrains.kotlin.wasm.test.converters
import org.jetbrains.kotlin.backend.common.CommonKLibResolver import org.jetbrains.kotlin.backend.common.CommonKLibResolver
import org.jetbrains.kotlin.backend.common.actualizer.IrActualizer
import org.jetbrains.kotlin.config.CommonConfigurationKeys import org.jetbrains.kotlin.config.CommonConfigurationKeys
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl
import org.jetbrains.kotlin.diagnostics.DiagnosticReporterFactory
import org.jetbrains.kotlin.fir.pipeline.applyIrGenerationExtensions
import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.ir.backend.js.JsFactories import org.jetbrains.kotlin.ir.backend.js.JsFactories
import org.jetbrains.kotlin.ir.backend.js.resolverLogger import org.jetbrains.kotlin.ir.backend.js.resolverLogger
import org.jetbrains.kotlin.ir.backend.js.serializeModuleIntoKlib import org.jetbrains.kotlin.ir.backend.js.serializeModuleIntoKlib
import org.jetbrains.kotlin.ir.types.IrTypeSystemContextImpl
import org.jetbrains.kotlin.ir.util.IrMessageLogger import org.jetbrains.kotlin.ir.util.IrMessageLogger
import org.jetbrains.kotlin.library.KotlinAbiVersion import org.jetbrains.kotlin.library.KotlinAbiVersion
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade import org.jetbrains.kotlin.test.backend.ir.IrBackendFacade
import org.jetbrains.kotlin.test.backend.ir.IrBackendInput import org.jetbrains.kotlin.test.backend.ir.IrBackendInput
import org.jetbrains.kotlin.test.backend.ir.irGenerationExtensions
import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.ModuleDescriptorProvider
import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider import org.jetbrains.kotlin.test.frontend.classic.moduleDescriptorProvider
import org.jetbrains.kotlin.test.frontend.fir.getAllWasmDependenciesPaths import org.jetbrains.kotlin.test.frontend.fir.getAllWasmDependenciesPaths
import org.jetbrains.kotlin.test.frontend.fir.resolveLibraries import org.jetbrains.kotlin.test.frontend.fir.resolveLibraries
import org.jetbrains.kotlin.test.model.ArtifactKinds import org.jetbrains.kotlin.test.model.ArtifactKinds
import org.jetbrains.kotlin.test.model.BinaryArtifacts import org.jetbrains.kotlin.test.model.BinaryArtifacts
import org.jetbrains.kotlin.test.model.FrontendKinds
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
import org.jetbrains.kotlin.test.services.* import org.jetbrains.kotlin.test.services.*
import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator import org.jetbrains.kotlin.test.services.configuration.WasmEnvironmentConfigurator
@@ -61,28 +54,7 @@ class FirWasmKlibBackendFacade(
// TODO: consider avoiding repeated libraries resolution // TODO: consider avoiding repeated libraries resolution
val libraries = resolveLibraries(configuration, getAllWasmDependenciesPaths(module, testServices)) val libraries = resolveLibraries(configuration, getAllWasmDependenciesPaths(module, testServices))
// TODO: find out how to pass diagnostics to the test infra in this case
val diagnosticReporter = DiagnosticReporterFactory.createReporter()
if (firstTimeCompilation) { if (firstTimeCompilation) {
val irActualizedResult =
if (module.frontendKind == FrontendKinds.FIR && module.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
IrActualizer.actualize(
inputArtifact.irModuleFragment,
inputArtifact.dependentIrModuleFragments,
diagnosticReporter,
IrTypeSystemContextImpl(inputArtifact.irModuleFragment.irBuiltins),
configuration.languageVersionSettings
).also {
inputArtifact.irPluginContext.applyIrGenerationExtensions(
inputArtifact.irModuleFragment,
irGenerationExtensions = module.irGenerationExtensions(testServices)
)
}
} else {
null
}
serializeModuleIntoKlib( serializeModuleIntoKlib(
configuration[CommonConfigurationKeys.MODULE_NAME]!!, configuration[CommonConfigurationKeys.MODULE_NAME]!!,
configuration, configuration,
@@ -99,7 +71,7 @@ class FirWasmKlibBackendFacade(
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null jsOutputName = null
) { ) {
inputArtifact.serializeSingleFile(it, irActualizedResult) inputArtifact.serializeSingleFile(it, inputArtifact.irActualizerResult)
} }
} }