From e9cb30b4f3b866998582b9390ed61fc9a1f89752 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Mon, 1 Feb 2021 11:02:08 +0300 Subject: [PATCH] [Test] Add ability to use custom CompilerConfigurationProvider --- .../test/builders/TestConfigurationBuilder.kt | 9 ++++ .../kotlin/test/impl/TestConfigurationImpl.kt | 6 ++- .../services/CompilerConfigurationProvider.kt | 44 ++++++++++--------- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt index ebc5be27049..8220e3d0c7d 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/builders/TestConfigurationBuilder.kt @@ -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 Unit>> = mutableListOf() private val additionalServices: MutableList = mutableListOf() + private var compilerConfigurationProvider: ((Disposable, List) -> CompilerConfigurationProvider)? = null + lateinit var testInfo: KotlinTestInfo inline fun useAdditionalService(noinline serviceConstructor: (TestServices) -> T) { @@ -123,6 +126,11 @@ class TestConfigurationBuilder { moduleStructureTransformers += transformers } + @TestInfrastructureInternals + fun useCustomCompilerConfigurationProvider(provider: (Disposable, List) -> CompilerConfigurationProvider) { + compilerConfigurationProvider = provider + } + fun useMetaTestConfigurators(vararg configurators: Constructor) { metaTestConfigurators += configurators } @@ -158,6 +166,7 @@ class TestConfigurationBuilder { moduleStructureTransformers, metaTestConfigurators, afterAnalysisCheckers, + compilerConfigurationProvider, metaInfoHandlerEnabled, directives, defaultRegisteredDirectivesBuilder.build(), diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt index 3ab89227f97..cbfb5c47fed 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/impl/TestConfigurationImpl.kt @@ -37,6 +37,8 @@ class TestConfigurationImpl( metaTestConfigurators: List>, afterAnalysisCheckers: List>, + compilerConfigurationProvider: ((Disposable, List) -> CompilerConfigurationProvider)?, + override val metaInfoHandlerEnabled: Boolean, directives: List, @@ -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) diff --git a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt index 929e9d5f860..48fcd38274a 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/CompilerConfigurationProvider.kt @@ -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 ) : 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