[Test] Add ability to provide additional analysis flags in EnvironmentConfigurator

This commit is contained in:
Dmitriy Novozhilov
2020-12-22 12:20:39 +03:00
committed by TeamCityServer
parent c4691de72d
commit e287742842
4 changed files with 27 additions and 14 deletions
@@ -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.RegisteredDirectives
import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue import org.jetbrains.kotlin.test.directives.model.singleOrZeroValue
import org.jetbrains.kotlin.test.services.DefaultsDsl 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.test.util.LANGUAGE_FEATURE_PATTERN
import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runIf
@@ -48,7 +49,7 @@ class LanguageVersionSettingsBuilder {
analysisFlags[flag] = value analysisFlags[flag] = value
} }
fun configureUsingDirectives(directives: RegisteredDirectives) { fun configureUsingDirectives(directives: RegisteredDirectives, environmentConfigurators: List<EnvironmentConfigurator>) {
val apiVersion = directives.singleOrZeroValue(LanguageSettingsDirectives.API_VERSION) val apiVersion = directives.singleOrZeroValue(LanguageSettingsDirectives.API_VERSION)
if (apiVersion != null) { if (apiVersion != null) {
this.apiVersion = apiVersion this.apiVersion = apiVersion
@@ -74,6 +75,12 @@ class LanguageVersionSettingsBuilder {
analysisFlags.forEach { withFlag(it.first, it.second) } 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) } directives[LanguageSettingsDirectives.LANGUAGE].forEach { parseLanguageFeature(it) }
} }
@@ -6,8 +6,8 @@
package org.jetbrains.kotlin.test.services 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.CompilerConfiguration 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.DirectivesContainer
import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives import org.jetbrains.kotlin.test.directives.model.RegisteredDirectives
import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.model.TestModule
@@ -23,4 +23,8 @@ abstract class EnvironmentConfigurator(protected val testServices: TestServices)
get() = testServices.moduleStructure get() = testServices.moduleStructure
open fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) {} open fun configureCompilerConfiguration(configuration: CompilerConfiguration, module: TestModule, project: MockProject) {}
open fun provideAdditionalAnalysisFlags(directives: RegisteredDirectives): Map<AnalysisFlag<*>, Any?> {
return emptyMap()
}
} }
@@ -49,11 +49,20 @@ class TestConfigurationImpl(
} }
} }
private val environmentConfigurators: List<EnvironmentConfigurator> =
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( override val moduleStructureExtractor: ModuleStructureExtractor = ModuleStructureExtractorImpl(
testServices, testServices,
additionalSourceProviders.map { it.invoke(testServices) }.also { additionalSourceProviders.map { it.invoke(testServices) }.also {
it.flatMapTo(allDirectives) { provider -> provider.directives } it.flatMapTo(allDirectives) { provider -> provider.directives }
} },
this.environmentConfigurators
) )
override val metaTestConfigurators: List<MetaTestConfigurator> = metaTestConfigurators.map { override val metaTestConfigurators: List<MetaTestConfigurator> = metaTestConfigurators.map {
@@ -75,15 +84,7 @@ class TestConfigurationImpl(
val sourceFileProvider = SourceFileProviderImpl(sourceFilePreprocessors) val sourceFileProvider = SourceFileProviderImpl(sourceFilePreprocessors)
register(SourceFileProvider::class, sourceFileProvider) register(SourceFileProvider::class, sourceFileProvider)
val configurators = environmentConfigurators.map { it.invoke(this) } val environmentProvider = CompilerConfigurationProviderImpl(rootDisposable, this@TestConfigurationImpl.environmentConfigurators)
configurators.flatMapTo(allDirectives) { it.directivesContainers }
for (configurator in configurators) {
configurator.additionalServices.forEach { register(it) }
}
val environmentProvider = CompilerConfigurationProviderImpl(
rootDisposable,
configurators
)
register(CompilerConfigurationProvider::class, environmentProvider) register(CompilerConfigurationProvider::class, environmentProvider)
register(AssertionsService::class, assertions) register(AssertionsService::class, assertions)
@@ -24,7 +24,8 @@ import java.io.File
class ModuleStructureExtractorImpl( class ModuleStructureExtractorImpl(
testServices: TestServices, testServices: TestServices,
additionalSourceProviders: List<AdditionalSourceProvider> additionalSourceProviders: List<AdditionalSourceProvider>,
private val environmentConfigurators: List<EnvironmentConfigurator>
) : ModuleStructureExtractor(testServices, additionalSourceProviders) { ) : ModuleStructureExtractor(testServices, additionalSourceProviders) {
companion object { companion object {
private val allowedExtensionsForFiles = listOf(".kt", ".kts", ".java") private val allowedExtensionsForFiles = listOf(".kt", ".kts", ".java")
@@ -210,7 +211,7 @@ class ModuleStructureExtractorImpl(
private fun finishModule() { private fun finishModule() {
finishFile() finishFile()
val moduleDirectives = directivesBuilder.build() + testServices.defaultDirectives + globalDirectives val moduleDirectives = directivesBuilder.build() + testServices.defaultDirectives + globalDirectives
currentModuleLanguageVersionSettingsBuilder.configureUsingDirectives(moduleDirectives) currentModuleLanguageVersionSettingsBuilder.configureUsingDirectives(moduleDirectives, environmentConfigurators)
val moduleName = currentModuleName ?: defaultModuleName val moduleName = currentModuleName ?: defaultModuleName
val testModule = TestModule( val testModule = TestModule(
name = moduleName, name = moduleName,