[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 package org.jetbrains.kotlin.test.builders
import com.intellij.openapi.Disposable
import org.jetbrains.kotlin.test.Constructor import org.jetbrains.kotlin.test.Constructor
import org.jetbrains.kotlin.test.TestConfiguration import org.jetbrains.kotlin.test.TestConfiguration
import org.jetbrains.kotlin.test.TestInfrastructureInternals import org.jetbrains.kotlin.test.TestInfrastructureInternals
@@ -41,6 +42,8 @@ class TestConfigurationBuilder {
private val configurationsByTestDataCondition: MutableList<Pair<Regex, TestConfigurationBuilder.() -> Unit>> = mutableListOf() private val configurationsByTestDataCondition: MutableList<Pair<Regex, TestConfigurationBuilder.() -> Unit>> = mutableListOf()
private val additionalServices: MutableList<ServiceRegistrationData> = mutableListOf() private val additionalServices: MutableList<ServiceRegistrationData> = mutableListOf()
private var compilerConfigurationProvider: ((Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider)? = null
lateinit var testInfo: KotlinTestInfo lateinit var testInfo: KotlinTestInfo
inline fun <reified T : TestService> useAdditionalService(noinline serviceConstructor: (TestServices) -> T) { inline fun <reified T : TestService> useAdditionalService(noinline serviceConstructor: (TestServices) -> T) {
@@ -123,6 +126,11 @@ class TestConfigurationBuilder {
moduleStructureTransformers += transformers moduleStructureTransformers += transformers
} }
@TestInfrastructureInternals
fun useCustomCompilerConfigurationProvider(provider: (Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider) {
compilerConfigurationProvider = provider
}
fun useMetaTestConfigurators(vararg configurators: Constructor<MetaTestConfigurator>) { fun useMetaTestConfigurators(vararg configurators: Constructor<MetaTestConfigurator>) {
metaTestConfigurators += configurators metaTestConfigurators += configurators
} }
@@ -158,6 +166,7 @@ class TestConfigurationBuilder {
moduleStructureTransformers, moduleStructureTransformers,
metaTestConfigurators, metaTestConfigurators,
afterAnalysisCheckers, afterAnalysisCheckers,
compilerConfigurationProvider,
metaInfoHandlerEnabled, metaInfoHandlerEnabled,
directives, directives,
defaultRegisteredDirectivesBuilder.build(), defaultRegisteredDirectivesBuilder.build(),
@@ -37,6 +37,8 @@ class TestConfigurationImpl(
metaTestConfigurators: List<Constructor<MetaTestConfigurator>>, metaTestConfigurators: List<Constructor<MetaTestConfigurator>>,
afterAnalysisCheckers: List<Constructor<AfterAnalysisChecker>>, afterAnalysisCheckers: List<Constructor<AfterAnalysisChecker>>,
compilerConfigurationProvider: ((Disposable, List<EnvironmentConfigurator>) -> CompilerConfigurationProvider)?,
override val metaInfoHandlerEnabled: Boolean, override val metaInfoHandlerEnabled: Boolean,
directives: List<DirectivesContainer>, directives: List<DirectivesContainer>,
@@ -96,7 +98,9 @@ class TestConfigurationImpl(
val sourceFileProvider = SourceFileProviderImpl(this, sourceFilePreprocessors) val sourceFileProvider = SourceFileProviderImpl(this, sourceFilePreprocessors)
register(SourceFileProvider::class, sourceFileProvider) 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(CompilerConfigurationProvider::class, environmentProvider)
register(AssertionsService::class, assertions) register(AssertionsService::class, assertions)
@@ -56,7 +56,7 @@ abstract class CompilerConfigurationProvider : TestService {
val TestServices.compilerConfigurationProvider: CompilerConfigurationProvider by TestServices.testServiceAccessor() val TestServices.compilerConfigurationProvider: CompilerConfigurationProvider by TestServices.testServiceAccessor()
class CompilerConfigurationProviderImpl( open class CompilerConfigurationProviderImpl(
override val testRootDisposable: Disposable, override val testRootDisposable: Disposable,
val configurators: List<EnvironmentConfigurator> val configurators: List<EnvironmentConfigurator>
) : CompilerConfigurationProvider() { ) : CompilerConfigurationProvider() {
@@ -64,6 +64,11 @@ class CompilerConfigurationProviderImpl(
override fun getKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment { override fun getKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment {
return cache.getOrPut(module) { return cache.getOrPut(module) {
createKotlinCoreEnvironment(module)
}
}
protected open fun createKotlinCoreEnvironment(module: TestModule): KotlinCoreEnvironment {
val platform = module.targetPlatform val platform = module.targetPlatform
val configFiles = when { val configFiles = when {
platform.isJvm() -> EnvironmentConfigFiles.JVM_CONFIG_FILES platform.isJvm() -> EnvironmentConfigFiles.JVM_CONFIG_FILES
@@ -78,13 +83,12 @@ class CompilerConfigurationProviderImpl(
CompilerConfiguration() CompilerConfiguration()
) )
val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment) val projectEnv = KotlinCoreEnvironment.ProjectEnvironment(testRootDisposable, applicationEnvironment)
KotlinCoreEnvironment.createForTests( return KotlinCoreEnvironment.createForTests(
projectEnv, projectEnv,
createCompilerConfiguration(module, projectEnv.project), createCompilerConfiguration(module, projectEnv.project),
configFiles configFiles
) )
} }
}
private fun createCompilerConfiguration(module: TestModule, project: MockProject): CompilerConfiguration { private fun createCompilerConfiguration(module: TestModule, project: MockProject): CompilerConfiguration {
val configuration = CompilerConfiguration() val configuration = CompilerConfiguration()