mirror of
https://github.com/mamoe/mirai.git
synced 2025-03-26 07:20:09 +08:00
Fix ambiguous CombinedMessage
This commit is contained in:
parent
7443e2aedd
commit
ac263579f6
mirai-core/src/commonMain/kotlin/net.mamoe.mirai/message/data
@ -24,7 +24,7 @@ import kotlin.jvm.JvmName
|
||||
*/
|
||||
class CombinedMessage(
|
||||
val left: Message,
|
||||
val element: Message
|
||||
val tail: Message
|
||||
) : Iterable<Message>, Message {
|
||||
|
||||
// 不要把它用作 local function, 会编译错误
|
||||
@ -32,16 +32,26 @@ class CombinedMessage(
|
||||
when (message) {
|
||||
is CombinedMessage -> {
|
||||
// fast path, 避免创建新的 iterator, 也不会挂起协程
|
||||
yieldCombinedOrElements(message.element)
|
||||
yieldCombinedOrElements(message.left)
|
||||
yieldCombinedOrElements(message.tail)
|
||||
}
|
||||
is MessageChain -> {
|
||||
is Iterable<*> -> {
|
||||
// 更好的性能, 因为协程不会挂起.
|
||||
// 这可能会导致爆栈 (十万个元素), 但作为消息序列足够了.
|
||||
message.forEach { yieldCombinedOrElements(it) }
|
||||
message.forEach {
|
||||
yieldCombinedOrElements(
|
||||
it as? Message ?: error(
|
||||
"A Message implementing Iterable must implement Iterable<Message>, " +
|
||||
"whereas got ${it!!::class.simpleName}"
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
else -> {
|
||||
check(message is SingleMessage) { "unsupported Message type. DO NOT CREATE YOUR OWN Message TYPE!" }
|
||||
check(message is SingleMessage) {
|
||||
"unsupported Message type. " +
|
||||
"A Message must be a CombinedMessage, a Iterable<Message> or a SingleMessage"
|
||||
}
|
||||
yield(message)
|
||||
}
|
||||
}
|
||||
@ -56,10 +66,10 @@ class CombinedMessage(
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return element.toString() + left.toString()
|
||||
return tail.toString() + left.toString()
|
||||
}
|
||||
|
||||
fun isFlat(): Boolean {
|
||||
return element is SingleMessage && left is SingleMessage
|
||||
return tail is SingleMessage && left is SingleMessage
|
||||
}
|
||||
}
|
@ -95,7 +95,7 @@ interface Message {
|
||||
*/
|
||||
@JvmSynthetic // in java they should use `plus` instead
|
||||
fun followedBy(tail: Message): CombinedMessage {
|
||||
return CombinedMessage(tail, this)
|
||||
return CombinedMessage(left = this, tail = tail)
|
||||
}
|
||||
|
||||
/**
|
||||
@ -110,6 +110,9 @@ interface Message {
|
||||
|
||||
operator fun plus(another: Message): CombinedMessage = this.followedBy(another)
|
||||
|
||||
// avoid resolution ambiguity
|
||||
operator fun plus(another: SingleMessage): CombinedMessage = this.followedBy(another)
|
||||
|
||||
operator fun plus(another: String): CombinedMessage = this.followedBy(another.toMessage())
|
||||
|
||||
// `+ ""` will be resolved to `plus(String)` instead of `plus(CharSeq)`
|
||||
|
Loading…
Reference in New Issue
Block a user