extension.ExtensionPoint.kt Maven / Gradle / Ivy
/*
* Copyright 2019-2020 Mamoe Technologies and contributors.
*
* 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证.
* Use of this source code is governed by the GNU AFFERO GENERAL PUBLIC LICENSE version 3 license that can be found through the following link.
*
* https://github.com/mamoe/mirai/blob/master/LICENSE
*/
@file:Suppress("unused", "INVISIBLE_MEMBER", "INVISIBLE_REFERENCE", "MemberVisibilityCanBePrivate")
package net.mamoe.mirai.console.extension
import net.mamoe.mirai.console.extensions.SingletonExtensionSelector
import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage
import net.mamoe.mirai.console.util.ConsoleExperimentalApi
import kotlin.reflect.KClass
/**
* 由 [Extension] 的伴生对象实现.
*
* @see AbstractExtensionPoint
*/
public interface ExtensionPoint {
/**
* 扩展实例 [T] 的类型
*/
public val extensionType: KClass
}
public abstract class AbstractExtensionPoint(
public override val extensionType: KClass,
) : ExtensionPoint
/**
* 表示一个 [SingletonExtension] 的 [ExtensionPoint]
*/
public interface SingletonExtensionPoint> : ExtensionPoint
/**
* 表示一个 [InstanceExtension] 的 [ExtensionPoint]
*/
public interface InstanceExtensionPoint> : ExtensionPoint
/**
* 表示一个 [FunctionExtension] 的 [ExtensionPoint]
*/
public interface FunctionExtensionPoint : ExtensionPoint
public abstract class AbstractInstanceExtensionPoint, T>
@ConsoleExperimentalApi constructor(
extensionType: KClass,
/**
* 内建的实现列表.
*/
@ConsoleExperimentalApi
public vararg val builtinImplementations: E,
) : AbstractExtensionPoint(extensionType)
public abstract class AbstractSingletonExtensionPoint, T>
@ConsoleExperimentalApi constructor(
extensionType: KClass,
/**
* 内建的实现.
*/
@ConsoleExperimentalApi
public val builtinImplementation: T,
) : AbstractExtensionPoint(extensionType), SingletonExtensionPoint {
/**
* 由 [SingletonExtensionSelector] 选择后的实例.
*/
@ConsoleExperimentalApi
public val selectedInstance: T by lazy {
GlobalComponentStorage.run { [email protected](extensionType, builtinImplementation) }
}
}