diff --git a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TestServices.kt b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TestServices.kt index 38a90eb9506..3fe2f4677b3 100644 --- a/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TestServices.kt +++ b/compiler/test-infrastructure/tests/org/jetbrains/kotlin/test/services/TestServices.kt @@ -39,7 +39,10 @@ class TestServices : ComponentArrayOwner(){ } } - fun register(data: ServiceRegistrationData) { + fun register(data: ServiceRegistrationData, skipAlreadyRegistered: Boolean) { + if (skipAlreadyRegistered && getOrNull(data.kClass) != null) { + return + } registerComponent(data.kClass, data.serviceConstructor(this)) } @@ -47,8 +50,8 @@ class TestServices : ComponentArrayOwner(){ registerComponent(kClass, service) } - fun register(data: List) { - data.forEach { register(it) } + fun register(data: List, skipAlreadyRegistered: Boolean) { + data.forEach { register(it, skipAlreadyRegistered) } } } 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 f281010ae7d..f599ab0db3c 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 @@ -58,7 +58,9 @@ class TestConfigurationImpl( testServices.register(KotlinTestInfo::class, testInfo) val runtimeClassPathProviders = runtimeClasspathProviders.map { it.invoke(testServices) } testServices.register(RuntimeClasspathProvidersContainer::class, RuntimeClasspathProvidersContainer(runtimeClassPathProviders)) - additionalServices.forEach { testServices.register(it) } + additionalServices.forEach { + testServices.register(it, skipAlreadyRegistered = false) + } } private val allDirectives = directives.toMutableSet() @@ -131,7 +133,7 @@ class TestConfigurationImpl( private fun ServicesAndDirectivesContainer.registerDirectivesAndServices() { allDirectives += directiveContainers - testServices.register(additionalServices) + testServices.register(additionalServices, skipAlreadyRegistered = true) } private fun List.registerDirectivesAndServices() { diff --git a/core/compiler.common/src/org/jetbrains/kotlin/util/ComponentArrayOwner.kt b/core/compiler.common/src/org/jetbrains/kotlin/util/ComponentArrayOwner.kt index 67cab26709e..cf5c28ef9eb 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/util/ComponentArrayOwner.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/util/ComponentArrayOwner.kt @@ -25,8 +25,14 @@ abstract class ComponentArrayOwner : AbstractArrayMapOwner): V { + getOrNull(key)?.let { return it } val id = typeRegistry.getId(key) - return arrayMap[id] ?: error("No '$key'($id) component in array: $this") + error("No '$key'($id) component in array: $this") + } + + protected fun getOrNull(key: KClass): V? { + val id = typeRegistry.getId(key) + return arrayMap[id] } private fun createDiagnosticMessage(id: Int, keyQualifiedName: String): String = buildString {