Commit 4184b5f7 authored by Him188's avatar Him188

Make CombinedMessage internal

parent b8b749bf
...@@ -14,7 +14,6 @@ package net.mamoe.mirai.message.data ...@@ -14,7 +14,6 @@ package net.mamoe.mirai.message.data
import net.mamoe.mirai.utils.MiraiExperimentalAPI import net.mamoe.mirai.utils.MiraiExperimentalAPI
import net.mamoe.mirai.utils.MiraiInternalAPI import net.mamoe.mirai.utils.MiraiInternalAPI
import net.mamoe.mirai.utils.PlannedRemoval
import kotlin.jvm.JvmMultifileClass import kotlin.jvm.JvmMultifileClass
import kotlin.jvm.JvmName import kotlin.jvm.JvmName
import kotlin.jvm.JvmSynthetic import kotlin.jvm.JvmSynthetic
...@@ -29,8 +28,7 @@ import kotlin.jvm.JvmSynthetic ...@@ -29,8 +28,7 @@ import kotlin.jvm.JvmSynthetic
* *
* Left-biased list * Left-biased list
*/ */
@MiraiInternalAPI("this API is going to be internal") internal class CombinedMessage
class CombinedMessage
internal constructor( internal constructor(
internal val left: Message, // 必须已经完成 constrain single internal val left: Message, // 必须已经完成 constrain single
internal val tail: Message internal val tail: Message
...@@ -44,22 +42,11 @@ internal constructor( ...@@ -44,22 +42,11 @@ internal constructor(
return asSequence().iterator() return asSequence().iterator()
} }
@PlannedRemoval("1.0.0") override val size: Int by lazy {
@Deprecated( var size = 0
"有歧义, 自行使用 contentToString() 比较", size += if (left is MessageChain) left.size else 1
ReplaceWith("this.contentToString() == other"), size += if (tail is MessageChain) tail.size else 1
DeprecationLevel.HIDDEN size
)
override fun contains(sub: String): Boolean {
return contentToString().contains(sub)
}
override val size: Int = when {
left === EmptyMessageChain && tail !== EmptyMessageChain -> 1
left === EmptyMessageChain && tail === EmptyMessageChain -> 0
left !== EmptyMessageChain && tail === EmptyMessageChain -> 1
left !== EmptyMessageChain && tail !== EmptyMessageChain -> 2
else -> error("stub")
} }
@OptIn(MiraiExperimentalAPI::class) @OptIn(MiraiExperimentalAPI::class)
......
...@@ -43,10 +43,10 @@ interface MessageChain : Message, Iterable<SingleMessage> { ...@@ -43,10 +43,10 @@ interface MessageChain : Message, Iterable<SingleMessage> {
@PlannedRemoval("1.0.0") @PlannedRemoval("1.0.0")
@Deprecated( @Deprecated(
"有歧义, 自行使用 contentToString() 比较", "有歧义, 自行使用 contentToString() 比较",
ReplaceWith("this.contentToString() == other"), level = DeprecationLevel.ERROR,
DeprecationLevel.HIDDEN replaceWith = ReplaceWith("this.contentToString().contains(sub)")
) )
override operator fun contains(sub: String): Boolean /* final */ override operator fun contains(sub: String): Boolean = this.contentToString().contains(sub)
/** /**
* 元素数量. [EmptyMessageChain] 不参加计数. * 元素数量. [EmptyMessageChain] 不参加计数.
...@@ -289,17 +289,6 @@ fun Iterable<SingleMessage>.asMessageChain(): MessageChain = ...@@ -289,17 +289,6 @@ fun Iterable<SingleMessage>.asMessageChain(): MessageChain =
@JvmSynthetic @JvmSynthetic
inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃 inline fun MessageChain.asMessageChain(): MessageChain = this // 避免套娃
@JvmSynthetic
@OptIn(MiraiInternalAPI::class)
fun CombinedMessage.asMessageChain(): MessageChain {
@OptIn(MiraiExperimentalAPI::class)
if (left is SingleMessage && this.tail is SingleMessage) {
@Suppress("UNCHECKED_CAST")
return (this as Iterable<SingleMessage>).asMessageChain()
}
return (this as Iterable<Message>).asMessageChain()
} // 避免套娃
/** /**
* 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain] * 将 [this] [扁平化后][flatten] 委托为一个 [MessageChain]
*/ */
...@@ -390,19 +379,11 @@ fun Message.flatten(): Sequence<SingleMessage> { ...@@ -390,19 +379,11 @@ fun Message.flatten(): Sequence<SingleMessage> {
@OptIn(MiraiInternalAPI::class) @OptIn(MiraiInternalAPI::class)
return when (this) { return when (this) {
is MessageChain -> this.asSequence() is MessageChain -> this.asSequence()
is CombinedMessage -> this.flatten() // already constrained single. is CombinedMessage -> this.asSequence() // already constrained single.
else -> sequenceOf(this as SingleMessage) else -> sequenceOf(this as SingleMessage)
} }
} }
@JvmSynthetic // make Java user happier with less methods
@OptIn(MiraiInternalAPI::class)
fun CombinedMessage.flatten(): Sequence<SingleMessage> {
// already constrained single.
@Suppress("UNCHECKED_CAST")
return (this as Iterable<SingleMessage>).asSequence()
}
@JvmSynthetic // make Java user happier with less methods @JvmSynthetic // make Java user happier with less methods
inline fun MessageChain.flatten(): Sequence<SingleMessage> = this.asSequence() // fast path inline fun MessageChain.flatten(): Sequence<SingleMessage> = this.asSequence() // fast path
...@@ -410,10 +391,10 @@ inline fun MessageChain.flatten(): Sequence<SingleMessage> = this.asSequence() / ...@@ -410,10 +391,10 @@ inline fun MessageChain.flatten(): Sequence<SingleMessage> = this.asSequence() /
/** /**
* 不含任何元素的 [MessageChain] * 不含任何元素的 [MessageChain].
*/ */
object EmptyMessageChain : MessageChain, Iterator<SingleMessage> { object EmptyMessageChain : MessageChain, Iterator<SingleMessage> {
override fun contains(sub: String): Boolean = sub.isEmpty()
override val size: Int get() = 0 override val size: Int get() = 0
override fun toString(): String = "" override fun toString(): String = ""
override fun contentToString(): String = "" override fun contentToString(): String = ""
...@@ -434,7 +415,6 @@ object NullMessageChain : MessageChain { ...@@ -434,7 +415,6 @@ object NullMessageChain : MessageChain {
override fun contentToString(): String = "" override fun contentToString(): String = ""
override val size: Int get() = 0 override val size: Int get() = 0
override fun equals(other: Any?): Boolean = other === this override fun equals(other: Any?): Boolean = other === this
override fun contains(sub: String): Boolean = error("accessing NullMessageChain")
override fun iterator(): MutableIterator<SingleMessage> = error("accessing NullMessageChain") override fun iterator(): MutableIterator<SingleMessage> = error("accessing NullMessageChain")
} }
...@@ -516,7 +496,6 @@ internal class MessageChainImplByCollection constructor( ...@@ -516,7 +496,6 @@ internal class MessageChainImplByCollection constructor(
get() = field ?: this.delegate.joinToString("") { it.contentToString() }.also { field = it } get() = field ?: this.delegate.joinToString("") { it.contentToString() }.also { field = it }
override fun contentToString(): String = contentToStringTemp!! override fun contentToString(): String = contentToStringTemp!!
override operator fun contains(sub: String): Boolean = sub in contentToStringTemp!!
} }
/** /**
...@@ -543,7 +522,6 @@ internal class MessageChainImplBySequence constructor( ...@@ -543,7 +522,6 @@ internal class MessageChainImplBySequence constructor(
get() = field ?: this.joinToString("") { it.contentToString() }.also { field = it } get() = field ?: this.joinToString("") { it.contentToString() }.also { field = it }
override fun contentToString(): String = contentToStringTemp!! override fun contentToString(): String = contentToStringTemp!!
override operator fun contains(sub: String): Boolean = sub in contentToStringTemp!!
} }
/** /**
...@@ -557,7 +535,6 @@ internal class SingleMessageChainImpl constructor( ...@@ -557,7 +535,6 @@ internal class SingleMessageChainImpl constructor(
override fun toString(): String = this.delegate.toString() override fun toString(): String = this.delegate.toString()
override fun contentToString(): String = this.delegate.contentToString() override fun contentToString(): String = this.delegate.contentToString()
override fun iterator(): Iterator<SingleMessage> = iterator { yield(delegate) } override fun iterator(): Iterator<SingleMessage> = iterator { yield(delegate) }
override operator fun contains(sub: String): Boolean = sub in delegate
} }
// endregion // endregion
\ No newline at end of file
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