[Test] Add ability to simply declaring mapping between directives and configuration keys

This commit is contained in:
Dmitriy Novozhilov
2021-01-22 14:25:56 +03:00
parent 5490689fea
commit 7d4adaba21
2 changed files with 55 additions and 4 deletions
@@ -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<AnalysisFlag<*>, Any?> {
return emptyMap()
}
}
class DirectiveToConfigurationKeyExtractor {
private val booleanDirectivesMap = mutableMapOf<SimpleDirective, CompilerConfigurationKey<Boolean>>()
private val invertedBooleanDirectives = mutableSetOf<SimpleDirective>()
private val valueDirectivesMap = mutableMapOf<ValueDirective<*>, CompilerConfigurationKey<*>>()
fun register(
directive: SimpleDirective,
key: CompilerConfigurationKey<Boolean>,
isInverted: Boolean = false
) {
booleanDirectivesMap[directive] = key
if (isInverted) {
invertedBooleanDirectives += directive
}
}
fun <T : Any> register(
directive: ValueDirective<T>,
key: CompilerConfigurationKey<T>
) {
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<Any>, value)
}
}
}
@@ -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
}