Support ordinary Java invariant Iterable<T> in component container.
This commit is contained in:
committed by
Pavel V. Talanov
parent
e12e67468f
commit
28df61b6f1
@@ -65,10 +65,16 @@ public class StorageComponentContainer(id: String) : ComponentContainer, Closeab
|
|||||||
val typeArguments = request.getActualTypeArguments()
|
val typeArguments = request.getActualTypeArguments()
|
||||||
if (typeArguments.size() != 1) return null
|
if (typeArguments.size() != 1) return null
|
||||||
val iterableTypeArgument = typeArguments[0]
|
val iterableTypeArgument = typeArguments[0]
|
||||||
if (!(iterableTypeArgument is WildcardType)) return null
|
val iterableType = when (iterableTypeArgument) {
|
||||||
val upperBounds = iterableTypeArgument.getUpperBounds()
|
is WildcardType -> {
|
||||||
if (upperBounds.size() != 1) return null
|
val upperBounds = iterableTypeArgument.getUpperBounds()
|
||||||
val iterableType = upperBounds[0]
|
if (upperBounds.size() != 1) return null
|
||||||
|
upperBounds[0]
|
||||||
|
}
|
||||||
|
is Class<*> -> iterableTypeArgument
|
||||||
|
is ParameterizedType -> iterableTypeArgument
|
||||||
|
else -> return null
|
||||||
|
}
|
||||||
return IterableDescriptor(componentStorage.resolveMultiple(iterableType, context))
|
return IterableDescriptor(componentStorage.resolveMultiple(iterableType, context))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+19
@@ -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() {
|
Test fun should_distinguish_generic() {
|
||||||
createContainer("test") {
|
createContainer("test") {
|
||||||
useImpl<TestGenericClient>()
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user