From 304220708a3efd9c49dc0ad0803677e2b1a3fc82 Mon Sep 17 00:00:00 2001 From: Karlatemp <karlatemp@vip.qq.com> Date: Wed, 30 Mar 2022 11:52:36 +0800 Subject: [PATCH] Fix empty resource link resolving --- .../testers/service-loader/src/PMain.kt | 7 +++- .../internal/plugin/JvmPluginClassLoader.kt | 40 +++++++++++-------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt b/mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt index 4410cc62d..78cb8fad3 100644 --- a/mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt +++ b/mirai-console/backend/integration-test/testers/service-loader/src/PMain.kt @@ -31,7 +31,7 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite Class.forName("net.mamoe.console.integrationtest.mod.servicetypedef.ServiceTypedef"), javaClass.classLoader, ) - val services = loader.asSequence().map { it.javaClass.name}.toMutableList() + val services = loader.asSequence().map { it.javaClass.name }.toMutableList() services.forEach { service -> logger.info { "Service: $service" } } @@ -48,5 +48,10 @@ internal object PMain : KotlinPlugin(JvmPluginDescription("net.mamoe.console.ite // /module-service-loader-typedef-0.0.0.jar!/test-res.txt // /module-service-loader-impl-0.0.0.jar!/test-res.txt assertEquals(3, tstRes.size) + + assertEquals( + mutableListOf(), + javaClass.classLoader.getResources("something/not/exists.bin").asSequence().toMutableList() + ) } } diff --git a/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt b/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt index 5bb4943d6..e32e6e7fc 100644 --- a/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt +++ b/mirai-console/backend/mirai-console/src/internal/plugin/JvmPluginClassLoader.kt @@ -356,27 +356,35 @@ private operator fun <E> Enumeration<E>.plus(next: Enumeration<E>): Enumeration< private fun <E> compoundEnumerations(iter: Iterator<Enumeration<E>>): Enumeration<E> { return object : Enumeration<E> { private lateinit var crt: Enumeration<E> - override fun hasMoreElements(): Boolean { - return (::crt.isInitialized && crt.hasMoreElements()) || iter.hasNext() + + private var hasMore: Boolean = false + private var fetched: Boolean = false + + override tailrec fun hasMoreElements(): Boolean { + if (fetched) return hasMore + if (::crt.isInitialized) { + hasMore = crt.hasMoreElements() + if (hasMore) { + fetched = true + return true + } + } + if (!iter.hasNext()) { + fetched = true + hasMore = false + return false + } + crt = iter.next() + return hasMoreElements() } override fun nextElement(): E { - if (::crt.isInitialized) { - val c = crt - return if (c.hasMoreElements()) { - c.nextElement() - } else if (iter.hasNext()) { - crt = iter.next() - nextElement() - } else { - throw NoSuchElementException() + if (hasMoreElements()) { + return crt.nextElement().also { + fetched = false } - } else if (iter.hasNext()) { - crt = iter.next() - return nextElement() - } else { - throw NoSuchElementException() } + throw NoSuchElementException() } } }