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 6060c451844..cacb9169004 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 @@ -8,8 +8,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.DirectivesContainer -import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives +import org.jetbrains.kotlin.config.CompilerConfigurationKey +import org.jetbrains.kotlin.test.directives.model.* import org.jetbrains.kotlin.test.model.TestModule abstract class EnvironmentConfigurator(protected val testServices: TestServices) { @@ -22,9 +22,60 @@ abstract class EnvironmentConfigurator(protected val testServices: TestServices) protected val moduleStructure: TestModuleStructure get() = testServices.moduleStructure - open fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) {} + protected open fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) {} + + fun configureCompileConfigurationWithAdditionalConfigurationKeys( + configuration: CompilerConfiguration, + module: TestModule, + project: MockProject + ) { + configureCompilerConfiguration(configuration, module, project) + val extractor = DirectiveToConfigurationKeyExtractor() + extractor.provideConfigurationKeys() + extractor.configure(configuration, module.directives) + } + + protected open fun DirectiveToConfigurationKeyExtractor.provideConfigurationKeys() {} open fun provideAdditionalAnalysisFlags(directives: RegisteredDirectives): Map, Any?> { return emptyMap() } } + +class DirectiveToConfigurationKeyExtractor { + private val booleanDirectivesMap = mutableMapOf>() + private val invertedBooleanDirectives = mutableSetOf() + private val valueDirectivesMap = mutableMapOf, CompilerConfigurationKey<*>>() + + fun register( + directive: SimpleDirective, + key: CompilerConfigurationKey, + isInverted: Boolean = false + ) { + booleanDirectivesMap[directive] = key + if (isInverted) { + invertedBooleanDirectives += directive + } + } + + fun register( + directive: ValueDirective, + key: CompilerConfigurationKey + ) { + valueDirectivesMap[directive] = key + } + + fun configure(configuration: CompilerConfiguration, registeredDirectives: RegisteredDirectives) { + for ((directive, key) in booleanDirectivesMap) { + if (directive in registeredDirectives) { + val value = directive !in invertedBooleanDirectives + configuration.put(key, value) + } + } + for ((directive, key) in valueDirectivesMap) { + val value = registeredDirectives.singleOrZeroValue(directive) ?: continue + @Suppress("UNCHECKED_CAST") + configuration.put(key as CompilerConfigurationKey, value) + } + } +} 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 6276856ba82..929e9d5f860 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 @@ -104,7 +104,7 @@ class CompilerConfigurationProviderImpl( } configuration.languageVersionSettings = module.languageVersionSettings - configurators.forEach { it.configureCompilerConfiguration(configuration, module, project) } + configurators.forEach { it.configureCompileConfigurationWithAdditionalConfigurationKeys(configuration, module, project) } return configuration }