Provide API to get frontend services from plugin code via resoltion facade

API to create ide-side services using frontend services (for now "ide services" cannot be injected into other ide services)
This commit is contained in:
Pavel V. Talanov
2015-07-27 16:44:20 +03:00
parent 84ebc7a0f8
commit 0c2650c86c
17 changed files with 183 additions and 276 deletions
@@ -28,12 +28,17 @@ public interface ComponentContainer {
fun createResolveContext(requestingDescriptor: ValueDescriptor): ValueResolveContext
}
public interface ComponentProvider {
public fun resolve(request: Type): ValueDescriptor?
public fun <T> create(request: Class<T>): T
}
object DynamicComponentDescriptor : ValueDescriptor {
override fun getValue(): Any = throw UnsupportedOperationException()
override fun toString(): String = "Dynamic"
}
public class StorageComponentContainer(id: String) : ComponentContainer, Closeable {
public class StorageComponentContainer(id: String) : ComponentContainer, ComponentProvider, Closeable {
public val unknownContext: ComponentResolveContext by lazy { ComponentResolveContext(this, DynamicComponentDescriptor) }
val componentStorage = ComponentStorage(id)
@@ -54,10 +59,14 @@ public class StorageComponentContainer(id: String) : ComponentContainer, Closeab
override fun close() = componentStorage.dispose()
jvmOverloads public fun resolve(request: Type, context: ValueResolveContext = unknownContext): ValueDescriptor? {
public fun resolve(request: Type, context: ValueResolveContext): ValueDescriptor? {
return componentStorage.resolve(request, context) ?: resolveIterable(request, context)
}
override fun resolve(request: Type): ValueDescriptor? {
return resolve(request, unknownContext)
}
private fun resolveIterable(request: Type, context: ValueResolveContext): ValueDescriptor? {
if (request !is ParameterizedType) return null
val rawType = request.getRawType()
@@ -86,6 +95,12 @@ public class StorageComponentContainer(id: String) : ComponentContainer, Closeab
componentStorage.registerDescriptors(unknownContext, descriptors)
return this
}
override fun <T> create(request: Class<T>): T {
val constructorBinding = request.bindToConstructor(unknownContext)
val args = constructorBinding.argumentDescriptors.map { it.getValue() }.toTypedArray()
return constructorBinding.constructor.newInstance(*args) as T
}
}
public fun StorageComponentContainer.registerSingleton(klass: Class<*>): StorageComponentContainer {
@@ -29,14 +29,14 @@ public inline fun <reified T> StorageComponentContainer.useImpl() {
registerSingleton(javaClass<T>())
}
public inline fun <reified T> StorageComponentContainer.get(): T {
return resolve(javaClass<T>(), unknownContext)!!.getValue() as T
public inline fun <reified T> ComponentProvider.get(): T {
return resolve(javaClass<T>())!!.getValue() as T
}
public fun StorageComponentContainer.useInstance(instance: Any) {
registerInstance(instance)
}
public inline fun <reified T> StorageComponentContainer.get(thisRef: Any?, desc: PropertyMetadata): T {
public inline fun <reified T> ComponentProvider.get(thisRef: Any?, desc: PropertyMetadata): T {
return resolve(javaClass<T>())!!.getValue() as T
}