[Test] Add ability to use custom CompilerConfigurationProvider

This commit is contained in:
Dmitriy Novozhilov
2021-02-01 11:02:08 +03:00
parent c432efc364
commit e9cb30b4f3
3 changed files with 38 additions and 21 deletions
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.test.builders
import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.TestConfiguration
import org.jetbrains.kotlin.test.TestInfrastructureInternals
@@ -41,6 +42,8 @@ class TestConfigurationBuilder {
private val configurationsByTestDataCondition: MutableList<Pair<Regex, TestConfigurationBuilder.() -> Unit>> = mutableListOf()
private val additionalServices: MutableList<ServiceRegistrationData> = mutableListOf()
private var compilerConfigurationProvider: ((Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider)? = null
lateinit var testInfo: KotlinTestInfo
inline fun <reified T : TestService> useAdditionalService(noinline serviceConstructor: (TestServices) -> T) {
@@ -123,6 +126,11 @@ class TestConfigurationBuilder {
moduleStructureTransformers += transformers
}
@TestInfrastructureInternals
fun useCustomCompilerConfigurationProvider(provider: (Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider) {
compilerConfigurationProvider = provider
}
fun useMetaTestConfigurators(vararg configurators: Constructor<MetaTestConfigurator>) {
metaTestConfigurators += configurators
}
@@ -158,6 +166,7 @@ class TestConfigurationBuilder {
moduleStructureTransformers,
metaTestConfigurators,
afterAnalysisCheckers,
compilerConfigurationProvider,
metaInfoHandlerEnabled,
directives,
defaultRegisteredDirectivesBuilder.build(),
@@ -37,6 +37,8 @@ class TestConfigurationImpl(
metaTestConfigurators: List<Constructor<MetaTestConfigurator>>,
afterAnalysisCheckers: List<Constructor<AfterAnalysisChecker>>,
compilerConfigurationProvider: ((Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider)?,
override val metaInfoHandlerEnabled: Boolean,
directives: List<DirectivesContainer>,
@@ -96,7 +98,9 @@ class TestConfigurationImpl(
val sourceFileProvider = SourceFileProviderImpl(this, sourceFilePreprocessors)
register(SourceFileProvider::class, sourceFileProvider)
val environmentProvider = CompilerConfigurationProviderImpl(rootDisposable, this@TestConfigurationImpl.environmentConfigurators)
val environmentProvider =
compilerConfigurationProvider?.invoke(rootDisposable, this@TestConfigurationImpl.environmentConfigurators)
?: CompilerConfigurationProviderImpl(rootDisposable, this@TestConfigurationImpl.environmentConfigurators)
register(CompilerConfigurationProvider::class, environmentProvider)
register(AssertionsService::class, assertions)
@@ -56,7 +56,7 @@ abstract class CompilerConfigurationProvider : TestService {
val TestServices.compilerConfigurationProvider: CompilerConfigurationProvider by TestServices.testServiceAccessor()
class CompilerConfigurationProviderImpl(
open class CompilerConfigurationProviderImpl(
override val testRootDisposable: Disposable,
val configurators: List<EnvironmentConfigurator>
) : CompilerConfigurationProvider() {
@@ -64,28 +64,32 @@ class CompilerConfigurationProviderImpl(
override fun getKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment {
return cache.getOrPut(module) {
val platform = module.targetPlatform
val configFiles = when {
platform.isJvm() -> EnvironmentConfigFiles.JVM_CONFIG_FILES
platform.isJs() -> EnvironmentConfigFiles.JS_CONFIG_FILES
platform.isNative() -> EnvironmentConfigFiles.NATIVE_CONFIG_FILES
// TODO: is it correct?
platform.isCommon() -> EnvironmentConfigFiles.METADATA_CONFIG_FILES
else -> error("Unknown platform: $platform")
}
val applicationEnvironment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(
ApplicationEnvironmentDisposer.ROOT_DISPOSABLE,
CompilerConfiguration()
)
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment)
KotlinCoreEnvironment.createForTests(
projectEnv,
createCompilerConfiguration(module, projectEnv.project),
configFiles
)
createKotlinCoreEnvironment(module)
}
}
protected open fun createKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment {
val platform = module.targetPlatform
val configFiles = when {
platform.isJvm() -> EnvironmentConfigFiles.JVM_CONFIG_FILES
platform.isJs() -> EnvironmentConfigFiles.JS_CONFIG_FILES
platform.isNative() -> EnvironmentConfigFiles.NATIVE_CONFIG_FILES
// TODO: is it correct?
platform.isCommon() -> EnvironmentConfigFiles.METADATA_CONFIG_FILES
else -> error("Unknown platform: $platform")
}
val applicationEnvironment = KotlinCoreEnvironment.getOrCreateApplicationEnvironmentForTests(
ApplicationEnvironmentDisposer.ROOT_DISPOSABLE,
CompilerConfiguration()
)
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment)
return KotlinCoreEnvironment.createForTests(
projectEnv,
createCompilerConfiguration(module, projectEnv.project),
configFiles
)
}
private fun createCompilerConfiguration(module: TestModule, project: MockProject): CompilerConfiguration {
val configuration = CompilerConfiguration()
configuration[CommonConfigurationKeys.MODULE_NAME] = module.name