From e287742842f06dd0b578ad7a7b4e781adc23bba4 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 22 Dec 2020 12:20:39 +0300 Subject: [PATCH] [Test] Add ability to provide additional analysis flags in EnvironmentConfigurator --- .../LanguageVersionSettingsBuilder.kt | 9 +++++++- .../test/services/EnvironmentConfigurator.kt | 6 +++++- .../kotlin/test/impl/TestConfigurationImpl.kt | 21 ++++++++++--------- .../impl/ModuleStructureExtractorImpl.kt | 5 +++-- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/builders/LanguageVersionSettingsBuilder.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/builders/LanguageVersionSettingsBuilder.kt index b030aa23494..17c2da42026 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/builders/LanguageVersionSettingsBuilder.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/builders/LanguageVersionSettingsBuilder.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.test.directives.LanguageSettingsDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue import org.jetbrains.kotlin.test.services.DefaultsDsl +import org.jetbrains.kotlin.test.services.EnvironmentConfigurator import org.jetbrains.kotlin.test.util.LANGUAGE_FEATURE_PATTERN import org.jetbrains.kotlin.utils.addToStdlib.runIf @@ -48,7 +49,7 @@ class LanguageVersionSettingsBuilder { analysisFlags[flag] = value } - fun configureUsingDirectives(directives: RegisteredDirectives) { + fun configureUsingDirectives(directives: RegisteredDirectives, environmentConfigurators: List) { val apiVersion = directives.singleOrZeroValue(LanguageSettingsDirectives.API_VERSION) if (apiVersion != null) { this.apiVersion = apiVersion @@ -74,6 +75,12 @@ class LanguageVersionSettingsBuilder { analysisFlags.forEach { withFlag(it.first, it.second) } + environmentConfigurators.forEach { + it.provideAdditionalAnalysisFlags(directives).entries.forEach { (flag, value) -> + withFlag(flag, value) + } + } + directives[LanguageSettingsDirectives.LANGUAGE].forEach { parseLanguageFeature(it) } } diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/EnvironmentConfigurator.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/EnvironmentConfigurator.kt index da93b8e7e19..6060c451844 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/EnvironmentConfigurator.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/EnvironmentConfigurator.kt @@ -6,8 +6,8 @@ package org.jetbrains.kotlin.test.services import com.intellij.mock.MockProject +import org.jetbrains.kotlin.config.AnalysisFlag import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.test.directives.model.ComposedRegisteredDirectives import org.jetbrains.kotlin.test.directives.model.DirectivesContainer import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.model.TestModule @@ -23,4 +23,8 @@ abstract class EnvironmentConfigurator(protected val testServices: TestServices) get() = testServices.moduleStructure open fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) {} + + open fun provideAdditionalAnalysisFlags(directives: RegisteredDirectives): Map, Any?> { + return emptyMap() + } } 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 e82d9f6534e..fa8f5cb9c65 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 @@ -49,11 +49,20 @@ class TestConfigurationImpl( } } + private val environmentConfigurators: List = + environmentConfigurators.map { it.invoke(testServices) }.also { configurators -> + configurators.flatMapTo(allDirectives) { it.directivesContainers } + for (configurator in configurators) { + configurator.additionalServices.forEach { testServices.register(it) } + } + } + override val moduleStructureExtractor: ModuleStructureExtractor = ModuleStructureExtractorImpl( testServices, additionalSourceProviders.map { it.invoke(testServices) }.also { it.flatMapTo(allDirectives) { provider -> provider.directives } - } + }, + this.environmentConfigurators ) override val metaTestConfigurators: List = metaTestConfigurators.map { @@ -75,15 +84,7 @@ class TestConfigurationImpl( val sourceFileProvider = SourceFileProviderImpl(sourceFilePreprocessors) register(SourceFileProvider::class, sourceFileProvider) - val configurators = environmentConfigurators.map { it.invoke(this) } - configurators.flatMapTo(allDirectives) { it.directivesContainers } - for (configurator in configurators) { - configurator.additionalServices.forEach { register(it) } - } - val environmentProvider = CompilerConfigurationProviderImpl( - rootDisposable, - configurators - ) + val environmentProvider = 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/impl/ModuleStructureExtractorImpl.kt b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt index e2724ea52a7..d4aba29e0f7 100644 --- a/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt +++ b/compiler/tests-common-new/tests/org/jetbrains/kotlin/test/services/impl/ModuleStructureExtractorImpl.kt @@ -24,7 +24,8 @@ import java.io.File class ModuleStructureExtractorImpl( testServices: TestServices, - additionalSourceProviders: List + additionalSourceProviders: List, + private val environmentConfigurators: List ) : ModuleStructureExtractor(testServices, additionalSourceProviders) { companion object { private val allowedExtensionsForFiles = listOf(".kt", ".kts", ".java") @@ -210,7 +211,7 @@ class ModuleStructureExtractorImpl( private fun finishModule() { finishFile() val moduleDirectives = directivesBuilder.build() + testServices.defaultDirectives + globalDirectives - currentModuleLanguageVersionSettingsBuilder.configureUsingDirectives(moduleDirectives) + currentModuleLanguageVersionSettingsBuilder.configureUsingDirectives(moduleDirectives, environmentConfigurators) val moduleName = currentModuleName ?: defaultModuleName val testModule = TestModule( name = moduleName,