All Downloads are FREE. Search and download functionalities are using the official Maven repository.

extension.ExtensionPoint.kt Maven / Gradle / Ivy

There is a newer version: 2.16.0
Show newest version
/*
 * 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) }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy