Support ordinary Java invariant Iterable<T> in component container.

This commit is contained in:
Ilya Ryzhenkov
2015-07-22 20:03:05 +03:00
committed by Pavel V. Talanov
parent e12e67468f
commit 28df61b6f1
3 changed files with 41 additions and 4 deletions
@@ -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))
}
@@ -144,6 +144,25 @@ class ComponentContainerTest {
}
}
Test fun should_resolve_java_iterable() {
createContainer("test") {
useImpl<TestComponent>()
useImpl<TestClientComponent>()
useImpl<TestClientComponent2>()
useImpl<TestStringComponent>()
useImpl<JavaTestComponents>()
}.use {
val descriptor = it.resolve<JavaTestComponents>()
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<TestGenericClient>()
@@ -0,0 +1,12 @@
package org.jetbrains.kotlin.container.tests;
public class JavaTestComponents {
public final Iterable<TestClientComponentInterface> components;
public final Iterable<TestGenericComponent<String>> genericComponents;
public JavaTestComponents(Iterable<TestClientComponentInterface> components,
Iterable<TestGenericComponent<String>> genericComponents) {
this.components = components;
this.genericComponents = genericComponents;
}
}