[Test] Add ability to simply declaring mapping between directives and configuration keys
This commit is contained in:
+54
-3
@@ -8,8 +8,8 @@ package org.jetbrains.kotlin.test.services
|
|||||||
import com.intellij.mock.MockProject
|
import com.intellij.mock.MockProject
|
||||||
import org.jetbrains.kotlin.config.AnalysisFlag
|
import org.jetbrains.kotlin.config.AnalysisFlag
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.test.directives.model.DirectivesContainer
|
import org.jetbrains.kotlin.config.CompilerConfigurationKey
|
||||||
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
|
import org.jetbrains.kotlin.test.directives.model.*
|
||||||
import org.jetbrains.kotlin.test.model.TestModule
|
import org.jetbrains.kotlin.test.model.TestModule
|
||||||
|
|
||||||
abstract class EnvironmentConfigurator(protected val testServices: TestServices) {
|
abstract class EnvironmentConfigurator(protected val testServices: TestServices) {
|
||||||
@@ -22,9 +22,60 @@ abstract class EnvironmentConfigurator(protected val testServices: TestServices)
|
|||||||
protected val moduleStructure: TestModuleStructure
|
protected val moduleStructure: TestModuleStructure
|
||||||
get() = testServices.moduleStructure
|
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?> {
|
open fun provideAdditionalAnalysisFlags(directives: RegisteredDirectives): Map<AnalysisFlag<*>, Any?> {
|
||||||
return emptyMap()
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -104,7 +104,7 @@ class CompilerConfigurationProviderImpl(
|
|||||||
}
|
}
|
||||||
configuration.languageVersionSettings = module.languageVersionSettings
|
configuration.languageVersionSettings = module.languageVersionSettings
|
||||||
|
|
||||||
configurators.forEach { it.configureCompilerConfiguration(configuration, module, project) }
|
configurators.forEach { it.configureCompileConfigurationWithAdditionalConfigurationKeys(configuration, module, project) }
|
||||||
|
|
||||||
return configuration
|
return configuration
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user