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()
         }
     }
 }