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()
|
||||
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))
|
||||
}
|
||||
|
||||
|
||||
+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() {
|
||||
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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user