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:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user