[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,18 +6,13 @@
package org.jetbrains.kotlin.js.test.converters
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.LanguageFeature
import org.jetbrains.kotlin.config.languageVersionSettings
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.ir.backend.js.JsFactories
import org.jetbrains.kotlin.ir.backend.js.resolverLogger
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.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.test.backend.ir.IrBackendFacade
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.fir.getAllJsDependenciesPaths
import org.jetbrains.kotlin.test.frontend.fir.resolveLibraries
import org.jetbrains.kotlin.test.model.ArtifactKinds
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.services.*
import org.jetbrains.kotlin.test.services.configuration.JsEnvironmentConfigurator
@@ -64,28 +57,7 @@ class FirJsKlibBackendFacade(
// TODO: consider avoiding repeated libraries resolution
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) {
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(
configuration[CommonConfigurationKeys.MODULE_NAME]!!,
configuration,
@@ -102,7 +74,7 @@ class FirJsKlibBackendFacade(
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null
) {
inputArtifact.serializeSingleFile(it, irActualizedResult)
inputArtifact.serializeSingleFile(it, inputArtifact.irActualizerResult)
}
}
@@ -32,7 +32,7 @@ class JsKlibBackendFacade(
override val additionalServices: List<ServiceRegistrationData>
get() = listOf(service(::JsIrIncrementalDataProvider))
constructor(testServices: TestServices): this(testServices, firstTimeCompilation = true)
constructor(testServices: TestServices) : this(testServices, firstTimeCompilation = true)
override fun shouldRunAnalysis(module: TestModule): Boolean {
return module.backendKind == inputKind
@@ -63,7 +63,7 @@ class JsKlibBackendFacade(
abiVersion = KotlinAbiVersion.CURRENT, // TODO get from test file data
jsOutputName = null
) {
inputArtifact.serializeSingleFile(it, null)
inputArtifact.serializeSingleFile(it, inputArtifact.irActualizerResult)
}
}
@@ -91,4 +91,4 @@ class JsKlibBackendFacade(
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.model.*
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.services.LibraryProvider
import org.jetbrains.kotlin.test.services.configuration.CommonEnvironmentConfigurator
@@ -154,6 +155,7 @@ fun <
}
facadeStep(frontendToBackendConverter)
actualizersAndPluginsFacadeStepIfNeeded(targetFrontend)
irHandlersStep()
facadeStep(backendFacade)