Commit 34236147 authored by Him188's avatar Him188

Fix the problem listening super events

parent 227fd845
...@@ -90,19 +90,24 @@ internal object EventListenerManger { ...@@ -90,19 +90,24 @@ internal object EventListenerManger {
} }
// inline: NO extra Continuation // inline: NO extra Continuation
@Suppress("UNCHECKED_CAST")
internal suspend inline fun Subscribable.broadcastInternal() { internal suspend inline fun Subscribable.broadcastInternal() {
if (EventDisabled) return if (EventDisabled) return
callAndRemoveIfRequired(this::class.listeners()) callAndRemoveIfRequired(this::class.listeners())
this::class.supertypes.forEach { superType -> var supertypes = this::class.supertypes
val superListeners = while (true) {
@Suppress("UNCHECKED_CAST") val superSubscribableType = supertypes.firstOrNull {
(superType.classifier as? KClass<out Subscribable>)?.listeners() ?: return // return if super type is not Subscribable it.classifier as? KClass<out Subscribable> != null
}
superSubscribableType?.let {
callAndRemoveIfRequired((it.classifier as KClass<out Subscribable>).listeners())
}
callAndRemoveIfRequired(superListeners) supertypes = (superSubscribableType?.classifier as? KClass<*>)?.supertypes ?: return
} }
return
} }
private suspend inline fun <E : Subscribable> E.callAndRemoveIfRequired(listeners: EventListeners<E>) { private suspend inline fun <E : Subscribable> E.callAndRemoveIfRequired(listeners: EventListeners<E>) {
......
package net.mamoe.mirai.event package net.mamoe.mirai.event
import kotlinx.coroutines.CompletableJob
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.runBlocking import kotlinx.coroutines.runBlocking
import net.mamoe.mirai.test.shouldBeEqualTo import net.mamoe.mirai.test.shouldBeEqualTo
import kotlin.system.exitProcess import kotlin.system.exitProcess
...@@ -16,28 +18,61 @@ class EventTests { ...@@ -16,28 +18,61 @@ class EventTests {
runBlocking { runBlocking {
val subscriber = subscribeAlways<TestEvent> { val subscriber = subscribeAlways<TestEvent> {
triggered = true triggered = true
println("Triggered")
} }
TestEvent().broadcast().triggered shouldBeEqualTo true TestEvent().broadcast().triggered shouldBeEqualTo true
subscriber.complete() subscriber.complete()
println("finished")
} }
} }
@Test @Test
fun testSubscribeGlobalScope() { fun testSubscribeGlobalScope() {
runBlocking { runBlocking {
GlobalScope.subscribeAlways<TestEvent> {
triggered = true
}
TestEvent().broadcast().triggered shouldBeEqualTo true TestEvent().broadcast().triggered shouldBeEqualTo true
println("finished") }
}
open class ParentEvent : Subscribable {
var triggered = false
}
open class ChildEvent : ParentEvent()
open class ChildChildEvent : ChildEvent()
@Test
fun `broadcast Child to Parent`() {
runBlocking {
val job: CompletableJob
job = subscribeAlways<ParentEvent> {
triggered = true
}
ChildEvent().broadcast().triggered shouldBeEqualTo true
job.complete()
}
} }
@Test
fun `broadcast ChildChild to Parent`() {
runBlocking {
val job: CompletableJob
job = subscribeAlways<ParentEvent> {
triggered = true
}
ChildChildEvent().broadcast().triggered shouldBeEqualTo true
job.complete()
}
} }
companion object { companion object {
@JvmStatic @JvmStatic
fun main(args: Array<String>) { fun main(args: Array<String>) {
EventTests().testSubscribeGlobalScope() EventTests().`broadcast ChildChild to Parent`()
exitProcess(0) exitProcess(0)
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment