diff --git a/compiler/container/src/org/jetbrains/kotlin/container/Container.kt b/compiler/container/src/org/jetbrains/kotlin/container/Container.kt index 3cc96b7a6c4..07f9223863f 100644 --- a/compiler/container/src/org/jetbrains/kotlin/container/Container.kt +++ b/compiler/container/src/org/jetbrains/kotlin/container/Container.kt @@ -65,10 +65,16 @@ public class StorageComponentContainer(id: String) : ComponentContainer, Closeab val typeArguments = request.getActualTypeArguments() if (typeArguments.size() != 1) return null val iterableTypeArgument = typeArguments[0] - if (!(iterableTypeArgument is WildcardType)) return null - val upperBounds = iterableTypeArgument.getUpperBounds() - if (upperBounds.size() != 1) return null - val iterableType = upperBounds[0] + val iterableType = when (iterableTypeArgument) { + is WildcardType -> { + val upperBounds = iterableTypeArgument.getUpperBounds() + if (upperBounds.size() != 1) return null + upperBounds[0] + } + is Class<*> -> iterableTypeArgument + is ParameterizedType -> iterableTypeArgument + else -> return null + } return IterableDescriptor(componentStorage.resolveMultiple(iterableType, context)) } diff --git a/compiler/container/tests/org/jetbrains/kotlin/container/tests/ComponentContainerTest.kt b/compiler/container/tests/org/jetbrains/kotlin/container/tests/ComponentContainerTest.kt index cb617b7da4f..54ae5ad4e58 100644 --- a/compiler/container/tests/org/jetbrains/kotlin/container/tests/ComponentContainerTest.kt +++ b/compiler/container/tests/org/jetbrains/kotlin/container/tests/ComponentContainerTest.kt @@ -144,6 +144,25 @@ class ComponentContainerTest { } } + Test fun should_resolve_java_iterable() { + createContainer("test") { + useImpl() + useImpl() + useImpl() + useImpl() + useImpl() + }.use { + val descriptor = it.resolve() + assertNotNull(descriptor) + val iterableComponent = descriptor!!.getValue() as JavaTestComponents + assertEquals(2, iterableComponent.components.count()) + assertTrue(iterableComponent.components.any { it is TestClientComponent }) + assertTrue(iterableComponent.components.any { it is TestClientComponent2 }) + assertEquals(1, iterableComponent.genericComponents.count()) + assertTrue(iterableComponent.genericComponents.any { it is TestStringComponent }) + } + } + Test fun should_distinguish_generic() { createContainer("test") { useImpl() diff --git a/compiler/container/tests/org/jetbrains/kotlin/container/tests/JavaTestComponents.java b/compiler/container/tests/org/jetbrains/kotlin/container/tests/JavaTestComponents.java new file mode 100644 index 00000000000..8bf23184e51 --- /dev/null +++ b/compiler/container/tests/org/jetbrains/kotlin/container/tests/JavaTestComponents.java @@ -0,0 +1,12 @@ +package org.jetbrains.kotlin.container.tests; + +public class JavaTestComponents { + public final Iterable components; + public final Iterable> genericComponents; + + public JavaTestComponents(Iterable components, + Iterable> genericComponents) { + this.components = components; + this.genericComponents = genericComponents; + } +}