From 23a692e950808fb729e9cad14131c84bdc066478 Mon Sep 17 00:00:00 2001 From: Him188 Date: Thu, 26 Nov 2020 07:50:35 +0800 Subject: [PATCH] Collect components just after plugin load --- .../src/internal/MiraiConsoleImplementationBridge.kt | 10 ---------- .../src/internal/extension/ComponentStorageInternal.kt | 10 +++++++++- .../src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt | 2 +- .../src/internal/plugin/JvmPluginInternal.kt | 9 +++++---- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt index be92004bc..8db5fa58d 100644 --- a/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt +++ b/backend/mirai-console/src/internal/MiraiConsoleImplementationBridge.kt @@ -34,7 +34,6 @@ import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.Pa import net.mamoe.mirai.console.internal.data.builtins.AutoLoginConfig.Account.PasswordKind.PLAIN import net.mamoe.mirai.console.internal.data.builtins.ConsoleDataScope import net.mamoe.mirai.console.internal.data.builtins.LoggerConfig -import net.mamoe.mirai.console.internal.data.castOrNull import net.mamoe.mirai.console.internal.extension.BuiltInSingletonExtensionSelector import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage import net.mamoe.mirai.console.internal.logging.LoggerControllerImpl @@ -49,7 +48,6 @@ import net.mamoe.mirai.console.permission.PermissionService.Companion.permit import net.mamoe.mirai.console.permission.RootPermission import net.mamoe.mirai.console.plugin.PluginManager import net.mamoe.mirai.console.plugin.center.PluginCenter -import net.mamoe.mirai.console.plugin.jvm.AbstractJvmPlugin import net.mamoe.mirai.console.plugin.loader.PluginLoader import net.mamoe.mirai.console.plugin.name import net.mamoe.mirai.console.util.ConsoleExperimentalApi @@ -167,14 +165,6 @@ internal object MiraiConsoleImplementationBridge : CoroutineScope, MiraiConsoleI mainLogger.verbose { "${PluginManager.plugins.size} plugin(s) loaded." } } - phase `collect extensions`@{ - for (resolvedPlugin in PluginManagerImpl.resolvedPlugins) { - resolvedPlugin.castOrNull()?.let { - GlobalComponentStorage.mergeWith(it.componentStorage) - } - } - } - phase `load SingletonExtensionSelector`@{ SingletonExtensionSelector.init() val instance = SingletonExtensionSelector.instance diff --git a/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt b/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt index dedf18192..f8697dcc6 100644 --- a/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt +++ b/backend/mirai-console/src/internal/extension/ComponentStorageInternal.kt @@ -50,6 +50,8 @@ internal data class DataExtensionRegistry( ) : ExtensionRegistry internal abstract class AbstractConcurrentComponentStorage : ComponentStorage { + private val instances: MutableMap, MutableSet>> = ConcurrentHashMap() + @Suppress("UNCHECKED_CAST") internal fun ExtensionPoint.getExtensions(): Set> { val userDefined = instances.getOrPut(this, ::CopyOnWriteArraySet) as Set> @@ -61,6 +63,13 @@ internal abstract class AbstractConcurrentComponentStorage : ComponentStorage { return builtins?.plus(userDefined) ?: userDefined } + // unused for now + internal fun removeExtensionsRegisteredByPlugin(plugin: Plugin) { + instances.forEach { (_, u) -> + u.removeAll { it.plugin == plugin } + } + } + internal fun mergeWith(another: AbstractConcurrentComponentStorage) { for ((ep, list) in another.instances) { for (extensionRegistry in list) { @@ -154,7 +163,6 @@ internal abstract class AbstractConcurrentComponentStorage : ComponentStorage { internal inline fun ExtensionPoint.useExtensions(block: (extension: T, plugin: Plugin?) -> Unit): Unit = withExtensions(block) - private val instances: MutableMap, MutableSet>> = ConcurrentHashMap() override fun contribute( extensionPoint: ExtensionPoint, plugin: Plugin, diff --git a/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt b/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt index 8e3537675..782de114f 100644 --- a/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt +++ b/backend/mirai-console/src/internal/plugin/BuiltInJvmPluginLoaderImpl.kt @@ -105,7 +105,7 @@ internal object BuiltInJvmPluginLoaderImpl : } runCatching { check(plugin is JvmPluginInternal) { "A JvmPlugin must extend AbstractJvmPlugin to be loaded by JvmPluginLoader.BuiltIn" } - plugin.internalOnLoad(plugin.componentStorage) + plugin.internalOnLoad() }.getOrElse { throw PluginLoadException("Exception while loading ${plugin.description.name}", it) } diff --git a/backend/mirai-console/src/internal/plugin/JvmPluginInternal.kt b/backend/mirai-console/src/internal/plugin/JvmPluginInternal.kt index a96917e3e..3b7fe0c95 100644 --- a/backend/mirai-console/src/internal/plugin/JvmPluginInternal.kt +++ b/backend/mirai-console/src/internal/plugin/JvmPluginInternal.kt @@ -16,6 +16,7 @@ import net.mamoe.mirai.console.MiraiConsole import net.mamoe.mirai.console.data.runCatchingLog import net.mamoe.mirai.console.extension.PluginComponentStorage import net.mamoe.mirai.console.internal.data.mkdir +import net.mamoe.mirai.console.internal.extension.GlobalComponentStorage import net.mamoe.mirai.console.permission.Permission import net.mamoe.mirai.console.permission.PermissionService import net.mamoe.mirai.console.plugin.Plugin @@ -43,9 +44,6 @@ internal abstract class JvmPluginInternal( parentCoroutineContext: CoroutineContext, ) : JvmPlugin, CoroutineScope { - @Suppress("LeakingThis") - internal val componentStorage: PluginComponentStorage = PluginComponentStorage(this) - final override val parentPermission: Permission by lazy { PermissionService.INSTANCE.register( PermissionService.INSTANCE.allocatePermissionIdForPlugin(this, "*"), @@ -101,13 +99,16 @@ internal abstract class JvmPluginInternal( } @Throws(Throwable::class) - internal fun internalOnLoad(componentStorage: PluginComponentStorage) { + internal fun internalOnLoad() { + val componentStorage = PluginComponentStorage(this) onLoad(componentStorage) + GlobalComponentStorage.mergeWith(componentStorage) } internal fun internalOnEnable(): Boolean { parentPermission if (!firstRun) refreshCoroutineContext() + kotlin.runCatching { onEnable() }.fold(